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

Обратная матрица

Страницы: 1 2 3 Следующая »
IBetsПользовательwww9 июня 20185:18#0
Дайте мне эффективный код по нахождению обратной матрицы. Не нашел толкового кода на просторах интернета
SuslikМодераторwww9 июня 20185:37#1
gaussian elimination with pivoting имеет смысл хотя бы раз в жизни написать самому, чтобы знать, как оно работает. а если тебе просто взять готовый код, не понимая, что он делает, то не страдай ерундой и используй любой eigen/glm/lapack/что-там-ещё.

Правка: 9 июня 2018 5:39

IBetsПользовательwww9 июня 20185:52#2
Suslik
Да я знаю как Гаус работает. Давно писал как-то
IBetsПользовательwww9 июня 20185:59#3
Suslik
LUP разложение на малых порядках быстрее Гауса?

Правка: 9 июня 2018 6:00

innuendoПостоялецwww9 июня 20188:47#4
IBets
> LUP разложение на малых порядках быстрее Гауса?

Какую цель преследуете ?

MikleМодераторwww9 июня 20189:24#5
Не знаю, на сколько это эффективно, вроде бы это аналог ф-ции из D3DX:
+ Показать
IBetsПользовательwww9 июня 201810:14#6
Mikle
Сделал так
template<typename T, U32 N>
  ILINE constexpr auto Inverse(Detail::Matrix<T, N, N> m) noexcept -> Detail::Matrix<T, N, N> {

    auto L = Detail::Matrix<T, N, N> { T{ 1 } };
    auto U = Detail::Matrix<T, N, N> { m };
    auto P = Detail::Matrix<T, N, N> { T{ 1 } };
  
    auto swapRows = [](Detail::Matrix<T, N, N>& matrix, U32 index1, U32 index2) -> void {      
      for (auto i = 0; i < N; i++)
        std::swap(matrix(index1, i), matrix(index2, i));
    };
    
    auto swapCols = [](Detail::Matrix<T, N, N>& matrix, U32 index1, U32 index2) -> void {
      for (auto i = 0; i < N; i++)
        std::swap(matrix(i, index1), matrix(i, index2));
    };

    
    for (auto n = 0; n < N; n++) {
      if (abs(U(n, n)) < std::numeric_limits<T>::epsilon()) {
        for (auto i = n + 1; i < N; i++) {    
          if (abs(U(i, n)) > std::numeric_limits<T>::epsilon()) {        
            swapRows(U, i, n);
            swapRows(P, i, n);
            swapRows(U, i, n);
            swapCols(L, i, n);
            break;
          }
        }
      }

      for (auto i = (n + 1); i < N; i++) {
        L(i, n) = U(i, n) / U(n, n);
        for (size_t k = n; k < N; k++) {
          U(i, k) -= L(i, n) * U(n, k);
        }
      }
    }
  
    for (auto c = 0; c < N; c++)     
      for (auto i = 0; i < N; i++)     
        for (auto j = 0; j < i; j++)           
          P(i, c) -= L(i, j) * P(j, c);
          
    for (auto c = 0; c < N; c++) {      
      for (auto k = 0; k < N; k++) {    
        auto i = N - 1 - k;
        for (auto j = i + 1; j < N; j++) 
          P(i, c) -= U(i, j) * P(j, c);        
        P(i, c) /= U(i, i);
      }
    }

    return P;
  }
g-contПостоялецwww9 июня 201810:33#7
Если матрица ортонормальная, полное инвертирование не требуется.
IBetsПользовательwww9 июня 201810:35#8
g-cont
Правильно ортогональная)
ArochПостоялецwww9 июня 201810:37#9
+ Показать

Ну и самый "эффективный" способ, это тупо транспонировать когда удовлетворяют условия.

Правка: 9 июня 2018 10:37

AsaqПользовательwww9 июня 201810:40#10
IBets
Четко сформулированная задача позволит найти оптимальное решение. В этом вопросе ты должен сказать для матриц какого порядка ищется обратная.
g-contПостоялецwww9 июня 201810:41#11
IBets помоему оба термина допустимы.
kiparУчастникwww9 июня 201810:52#12
Asaq
Судя по тому что размер является параметром шаблона - вряд ли больше 5.
IBetsПользовательwww9 июня 201811:07#13
Asaq
Да я для 4x4 максимус. Но работает стабильно. FPS такой же как и при DirectX::Inverse()
IBetsПользовательwww9 июня 201811:11#14
Aroch
У тебя куда циклы то делись? Не лень все писать. Тем более в современных CPU наоборот надо, как меньше команд он из будет молотить быстро. Обращение к памяти очень дорого из-за скорости шины. Хотя команды проц тоже не так однозначно хранит как данные. Короче надо тестить
Страницы: 1 2 3 Следующая »

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

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