Господа! Нужно сделать процедуру нахождения обратной матрицы на инструкциях SSE Подскажите какой метод предпочтительней использовать? и аргументировать если не трудно
А надо под какую платформу? А то в DirectX уже есть, и вроде как они оптимизировали под современные процы.
предпочтительный в каком смысле? Если простоты кода, то в лоб находим детерминант матрицы, и миноры. А вот если оптимизация, то тут думать уже надо
Booster Пытаюсь перевести свою мат. либу на SSE.... смысла нет подключать дополнительно DirectX, а выдрать тока одну процедуру не хватает опыта n0name В приоритете скорость и точность вычисления гдето читал что метод гаусса быстрей но менее точный, чем метод крамера.... ЗЫ Главный враг на начальном этапе проекта - оптимизация
Насколько я понимаю, это не так. Оба метода позволяют получить решение системы уравнений. Только при использовании метода Крамера не известно, имеет ли система бесконечное множество решений, или не имеет вообще (определитель в любом случае равен нулю). А вообще, при многократных вычислениях можно воспользоваться LU-разложением (LU factorization), он, если я правильно понял, позволяет немного сэкономить. Надеюсь, знающие меня поправят, если что не так . P.S. Сейчас перечитал топик, не понял -- требуется найти обратную матрицу или решение системы уравнений? Если последнее, то что я сказал верно. А то у меня при словах "метод Крамера" и "метод Гаусса" уже рефлекс .
Mika0x65 Требуется найти обратную матрицу. Насколько я понимаю - при нахождении обратной матрицы используются метод Гаусса-Жордана и метод Крамера.... возможно еще что-то....
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?) придется скорее всего самому..
А ещё есть такой предмет как вычислительная математика. Отличается от нормальной, помимо прочего, тем, что учитывает, что числа и вычисления точными не бывают. Т.е., например, даже "круглое" число 1/10 ты в двоичной система точно не представишь. Что уж говорить о делении одного числа на другое. Так вот, вычислительная математика учит, что бывают устойчивые методы решения - это когда неизбежные небольшие погрешности не влияют на результат катастрофически, и неустойчивые, когда маленькая ошибка может привести к большим последствиям. Для "хорошей" матрицы подойдёт любой метод. Для "жесткой" (это термин, это не от слова "жесть" ) нужно использовать устойчивые методы. К сожалению, это практически всё, что я помню о ВычМате Вроде, задача нахождения обратной матрицы - типовая, стандратное "правильное" решение должно быть описано в любом справочнике. Вроде, нас учили, что это делается через разложение исходной матрицы A на две - верхне-треугольную и нижне-треугольную. Но тут уже могу врать.
Ещё раз прочитал то, что написал Stiver, возможно это оно и есть. Сорри, про разложение сначала не разглядел.
sergh нужно использовать устойчивые методы Конечно. Нужно правильно выбрать скалирование, pivoting, делать дополнительную итерацию для корректировки ошибок и т.д. Но это все уже настройки на конкретную задачу.
Любопытно что в DOOM3 SDK обращение делается через алгебраические дополнения.... вроде как вычислений больше!!! а чем же лучше чем метод гаусса?