Я использую 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;
Я хочу иметь возможность инвертировать матрицу, для которой я сам назначил значения. Кто-нибудь может сказать мне, что здесь происходит? Почему Эйген делает это?
Ваша матрица такая:
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
что означает, что матрица является единственной! Это означает, что матрица не может быть инвертирована!
То, как вы выбрали свою матрицу, было просто очень неудачно.
Других решений пока нет …