Нахождение обратной матрицы

Тема в разделе "WASM.ASSEMBLER", создана пользователем NetDemon, 14 май 2007.

  1. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Господа!
    Нужно сделать процедуру нахождения обратной матрицы на инструкциях SSE

    Подскажите какой метод предпочтительней использовать? и аргументировать если не трудно :)
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А надо под какую платформу?
    А то в DirectX уже есть, и вроде как они оптимизировали под современные процы.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    предпочтительный в каком смысле?
    Если простоты кода, то в лоб находим детерминант матрицы, и миноры. А вот если оптимизация, то тут думать уже надо ;)
     
  4. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Booster
    Пытаюсь перевести свою мат. либу на SSE....
    смысла нет подключать дополнительно DirectX, а выдрать тока одну процедуру не хватает опыта :dntknw:

    n0name
    В приоритете скорость и точность вычисления
    гдето читал что метод гаусса быстрей но менее точный, чем метод крамера....

    ЗЫ Главный враг на начальном этапе проекта - оптимизация :)
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Насколько я понимаю, это не так. Оба метода позволяют получить решение системы уравнений. Только при использовании метода Крамера не известно, имеет ли система бесконечное множество решений, или не имеет вообще (определитель в любом случае равен нулю). А вообще, при многократных вычислениях можно воспользоваться LU-разложением (LU factorization), он, если я правильно понял, позволяет немного сэкономить.

    Надеюсь, знающие меня поправят, если что не так :).

    P.S. Сейчас перечитал топик, не понял -- требуется найти обратную матрицу или решение системы уравнений? Если последнее, то что я сказал верно. А то у меня при словах "метод Крамера" и "метод Гаусса" уже рефлекс :).
     
  6. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Mika0x65
    Требуется найти обратную матрицу.

    Насколько я понимаю - при нахождении обратной матрицы используются метод Гаусса-Жордана и метод Крамера.... возможно еще что-то....
     
  7. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    NetDemon

    Обратная матрица вычисляется по столбцам, для каждого столбца решается линейная система уровнений.

    Пусть A - исходная матрица, B - обратная, тогда A*B=I <=> A*(b1,...,bn) = (e1,...,en) Решаем серию систем уравнений A*bi = ei и получаем B. Системы уравнений решаем с помощью Гауссова разложения A = P*L*U (которое естественно выполняется только один раз).

    Подобные алгоритмы отлично описаны в пакете LAPACK, идеи лучше всего брать оттуда (в данном случае http://www.netlib.org/lapack/double/dgetri.f) А подгонять общую реализацию под заданные конкретные условия(SSE?) придется скорее всего самому..
     
  8. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Stiver
    Спасиба за теорию.
     
  9. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    А ещё есть такой предмет как вычислительная математика.

    Отличается от нормальной, помимо прочего, тем, что учитывает, что числа и вычисления точными не бывают. Т.е., например, даже "круглое" число 1/10 ты в двоичной система точно не представишь. Что уж говорить о делении одного числа на другое.

    Так вот, вычислительная математика учит, что бывают устойчивые методы решения - это когда неизбежные небольшие погрешности не влияют на результат катастрофически, и неустойчивые, когда маленькая ошибка может привести к большим последствиям. Для "хорошей" матрицы подойдёт любой метод. Для "жесткой" (это термин, это не от слова "жесть" :) ) нужно использовать устойчивые методы.

    К сожалению, это практически всё, что я помню о ВычМате :) Вроде, задача нахождения обратной матрицы - типовая, стандратное "правильное" решение должно быть описано в любом справочнике. Вроде, нас учили, что это делается через разложение исходной матрицы A на две - верхне-треугольную и нижне-треугольную. Но тут уже могу врать.
     
  10. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Ещё раз прочитал то, что написал Stiver, возможно это оно и есть. Сорри, про разложение сначала не разглядел.
     
  11. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    sergh
    нужно использовать устойчивые методы

    Конечно. Нужно правильно выбрать скалирование, pivoting, делать дополнительную итерацию для корректировки ошибок и т.д. Но это все уже настройки на конкретную задачу.
     
  12. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Любопытно что в DOOM3 SDK обращение делается через алгебраические дополнения....

    вроде как вычислений больше!!! а чем же лучше чем метод гаусса?