Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Обратная матрица (2 стр)

Обратная матрица (2 стр)

Страницы: 1 2 3 Следующая »
innuendoПостоялецwww9 июня 201811:14#15
IBets

ты на asm не пробовал писать ? говорят, быстрее будет

ArochПостоялецwww9 июня 201811:34#16
IBets
> FPS такой же как и при DirectX::Inverse()
лол, сомневаюсь что у тебя в этом был ботлнек вообще.
> У тебя куда циклы то делись?
не нужны.
> Не лень все писать.
пфф, а шаблонолапшу не лень?
> Короче надо тестить
с этого и надо начинать.
EugeneУчастникwww9 июня 201811:50#17
IBets
> std::numeric_limits<T>::epsilon()
Будь на то моя воля, я бы заставил всех людей, использующих numeric_limits::epsilon, проводить математическое обоснование выбора именно этой константы.
Серьезно, суют этот эпсилон не глядя, хотя в реальности он чуть чаще, чем всегда, бесполезен.
IBetsПользовательwww9 июня 201812:02#18
Eugene
Ну машинный эпсилон он такой. Я пока еще не рефакторил. Точность слишком высокая там чего придумаю
IBetsПользовательwww9 июня 201812:05#19
Aroch
Ну я решил не юзать XMath он не удобный "имхо". Написал велосипед  вышел в чуть более 500 строчек. Там вся классика которая мне нужна есть
ArochПостоялецwww9 июня 201812:11#20
IBets
> Ну я решил не юзать XMath он не удобный "имхо"
его не юзают по другой причине, чтобы не создавать лишнюю зависимость на ровном месте которая не дает никаких преимуществ.
> Написал велосипед  вышел в чуть более 500 строчек.
зачем считать строчки? Написал весь необходимый функционал, работает, без багов, выбран оптимальный алгоритм, а сколько там строчек и быстрее или медленнее на пару тактов это не те вопросы которые должны волновать.
g-contПостоялецwww9 июня 201813:29#21
На моей памяти полная инверсия матрицы требуется крайне редко, ну например для двойного преобразования вида, смысл заморачиваться с оптимизацией?
}:+()___ [Smile]Постоялецwww9 июня 201813:58#22
IBets
> LUP разложение на малых порядках быстрее Гауса?
Гаусс — это и есть разновидность LU-разложения.

Aroch
> bool Matrix::Invert()
Какой неэффективный способ считать детерминанты.
Если избавление от делений в методе Гаусса еще может иметь смысл (хотя FPU деление побыстрее целочисленного будет), то вот такое количество умножений — это просто ужас.

Eugene
> Будь на то моя воля, я бы заставил всех людей, использующих numeric_limits::epsilon, проводить математическое обоснование выбора именно этой константы.
+1


Если матрица хорошая (и можно не заморачиваться выбором pivot), я использую следующий код инплейс-обращалки:

for(int k = 0; k < n; k++)  // invert transpose
{
    int ip = k, jp = k;  // pivot
    double z = 1 / mat[ip][jp];  mat[ip][jp] = 1;
    for(int i = 0; i < n; i++)if(i != ip)
    {
        double mul = mat[i][jp] * z;  mat[i][jp] = 0;
        for(int j = 0; j < n; j++)mat[i][j] -= mat[ip][j] * mul;
    }
    for(int j = 0; j < n; j++)mat[ip][j] *= z;
}
Код считает транспонированную от обратной, плюс при желании можно дописать выбор pivot-а, однако если он не на диагонали, то результат будет с перетасованными индексами.

ArochПостоялецwww9 июня 201814:25#23
}:+()___ [Smile]
> Какой неэффективный способ считать детерминанты.
мне пофиг и Кармаку тоже https://github.com/id-Software/DOOM-3/blob/master/neo/idlib/math/Matrix.cpp
}:+()___ [Smile]Постоялецwww9 июня 201814:44#24
Aroch
> мне пофиг и Кармаку тоже
Вот не надо гнать, все нормально у него, в отличие от твоего кода.
За исключением того, что простыня вместо циклов, но это, скорее всего, вынужденно, ибо MSVC никогда не отличался качественной оптимизацией.
ArochПостоялецwww9 июня 201814:47#25
}:+()___ [Smile]
> Вот не надо гнать, все нормально у него, в отличие от твоего кода.
ты же умеешь в математику в 3 класса и сможешь сделать необходимые оптимизации чтобы получить тот же результат что по ссылке, я в тебя верю.
innuendoПостоялецwww9 июня 201815:16#26
}:+()___ [Smile]
> ибо MSVC никогда не отличался качественной оптимизацией.

по сравнению с чём ?

AsaqПользовательwww9 июня 201816:38#27
1) Если матрица 4x4 используется для аффинных преобразований то последняя строка равна (0, 0, 0, 1).
C = [ A,  b ] где A - матрица 3х3, b - вектор 3х1
    [ 0,  1 ]
тогда
Inv(C) = [ Inv(A),  -Inv(A)*b ]
         [   0,          1    ]
Данный подход справедлив и для матриц 3х3.
Не проводил исследование производительности, но в составе библиотеки glm есть функции inverse() и affineInverse(), affineInverse() примерно вдвое быстрее.

2) Если матрица содержит только повороты то это ортогональная матрица и её обратная матрица (которая обязательно существует) равна транспонированной матрице.

Inv(C) = T(C) где С - ортогональная матрица

Правка: 9 июня 2018 18:20

DelfigamerПостоялецwww9 июня 201817:30#28
innuendo
> по сравнению с чём ?
По сравнению с GCC и LLVM.
innuendoПостоялецwww9 июня 201818:30#29
Delfigamer

ты просто не видел Borland :)

Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр