Eigen не может дать правильную обратную матрицу (С++)

Я использую Eigen (бесплатный пакет линейной алгебры для использования с С++) и пытаюсь инвертировать небольшую матрицу. Следуя официальной документации 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;

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


person user3358834    schedule 27.02.2014    source источник
comment
матрица необратима - обычная причина....   -  person Mitch Wheat    schedule 27.02.2014
comment
Ваша матрица необратима. Какой результат вы ожидали?   -  person n. 1.8e9-where's-my-share m.    schedule 27.02.2014
comment
Ах, это все, что было. На всякий случай я пробовал еще пару матриц, но оказалось, что они тоже были сингулярными. Спасибо, что поймал   -  person user3358834    schedule 27.02.2014


Ответы (1)


Ваша матрица такова:

0    3    6
1    4    7
2    5    8

и если вычесть строку1 из строки2 и строки3, вы получите:

0    3    6
1    1    1
2    2    2

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

0    3    6
1    1    1
0    0    0

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

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

person Mikael Persson    schedule 27.02.2014
comment
+1. Я знал, что это уникальное слово, просто взглянув на определение, но не удосужился написать его! - person Mitch Wheat; 27.02.2014