Эйген не может дать правильную обратную матрицу (c ++)

Я использую Eigen (бесплатный пакет линейной алгебры для использования с c ++) и пытаюсь инвертировать небольшую матрицу. Следуя официальной документации Eigen, я получаю следующее:

#include <iostream>
using namespace std;
#include <Eigen/LU>
#include <Eigen/Dense>
using namespace Eigen;

Matrix3d k = Matrix3d::Random();
cout << "Here is the matrix k:" << endl << k << endl;
cout << "Its inverse is:" << endl << k.inverse() << endl;
cout << "The product of the two (supposedly the identity) is:" << endl << k.inverse()*k << endl;

И это дает мне правильный ответ. Однако, если вместо того, чтобы сделать k случайно назначенной матрицей, если я создаю матрицу, а затем сам присваиваю все значения, это дает мне неправильную обратную зависимость. Например, следующий код даст мне неправильный обратный.

Matrix3d m;
Matrix3d mi;
for (int i = 0; i < 3; ++ i)
for (int j = 0; j < 3; ++ j)
m (i, j) = i + 3.0*j;

std::cout <<  "m is " << m << std::endl;
mi = m.inverse();
std::cout <<  "mi is "  <<  mi << std::endl;
std::cout <<  "product of m and m_inverse is "  <<  (mi*m) << std::endl;

Я хочу иметь возможность инвертировать матрицу, для которой я сам назначил значения. Кто-нибудь может сказать мне, что здесь происходит? Почему Эйген делает это?

2

Решение

Ваша матрица такая:

0    3    6
1    4    7
2    5    8

и если вы вычтете row1 из row2 и row3, вы получите:

0    3    6
1    1    1
2    2    2

а затем вычесть 2 * row2 из row3, вы получите:

0    3    6
1    1    1
0    0    0

что означает, что матрица является единственной! Это означает, что матрица не может быть инвертирована!

То, как вы выбрали свою матрицу, было просто очень неудачно.

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]