Добрый день!
Работаю с матрицами, сейчас возникла такая проблема.
Есть единичная матрица 3х3
Bsig:
1 0 0
0 1 0
0 0 1
По обычному алгоритму нахожу обратную (в результате должна получиться такая же единичная матрица)
Bm1sig:
1 -0 0
-0 1 -0
0 -0 1
И, как я считаю, из-за этих минус нолей перемножение этой матрицы с матрицей-столбцом b:
3
1
1
Получается всегда разный результат:
Bm1sig * b = (3, 0, 6.9397e-310)
Bm1sig * b = (3, 1.49167e-154, 1)
Bm1sig * b = (3, -1.49167e-154, 1)
(Матрица строка, 3 разных варианта)
Еще при нахождении обратной матрицы иногда проскакивают такие вещи:
-1.5 + 0.3 + 1.2 = 2.22045e-16
Подскажите, как с этим бороться?
Алгоритм обратной матрицы:
(Создан класс Matrix с двумя переменными m*n и матрицей **double)
Matrix Inverse() {
Matrix result(n,m);
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
result[i][j] = this->PreMinor(i,j).Determinant() * ((i+j)%2 ? -1 : 1) * (1/this->Determinant());
}
}
result = result.Transpose();
return result;
}
double Determinant() {
if(n == 1 && m == 1)
return array[0][0];
double D = 0;
for(int i=0; i<n; i++){
D += array[0][i] * (i%2 ? -1 : 1) * this->PreMinor(0,i).Determinant();
}
return D;
}
Matrix PreMinor(int x, int y) {
Matrix result(m-1,n-1);
for(int i=0, in=0; i<n; i++)
if(i != x){
for(int j=0, jn=0; j<m; j++){
if(j != y)
result[in][jn++] = array[i][j]; // можно array[i][j];
}
in++;
}
return result;
}