Я пытаюсь инвертировать реальную матрицу в С++ LAPACKE. У меня есть такая же функция для сложных матриц, и она работает. Но реальный случай дает неверный ответ. Вот моя функция:
void inv(std::vector<std::vector<double>> &ans, std::vector<std::vector<double>> MAT){
int N = MAT.size();
int *IPIV = new int[N];
double * arr = new double[N*N];
for (int i = 0; i<N; i++){
for (int j = 0; j<N; j++){
int idx = i*N + j;
arr[idx] = MAT[i][j];
}
}
LAPACKE_dgetrf(LAPACK_ROW_MAJOR, N, N, arr, N, IPIV);
LAPACKE_dgetri(LAPACK_ROW_MAJOR, N, arr, N, IPIV);
for (int i = 0; i<N; i++){
for (int j = 0; j<N; j++){
int idx = i*N + j;
ans[i][j] = arr[idx];
}
}
delete[] IPIV;
delete[] arr;
}
Я попытался инвертировать матрицу двойников 24 на 24. В то время как программа, кажется, почти готова, инверсия еще не совсем завершена, и она сильно отличается от того, что дает мне python linalg inverse (python здесь, потому что я умножил матрицу на инверсию, и результат очень близок к идентичности). В выводе LAPACKE я умножаю матрицу на обратную и получаю, что диагонали равны 1, но недиагонали достигают значений до 0,17, что огромно по сравнению с 0. Есть ли способ заставить программу LAPACKE давать лучшее результат? Спасибо!
linalg.inv()
numpy, в частности на строку 1555 - 1693 -1727 umath_linalg.c, он решает A.X=Id, используя dgesv() вместо вызова dgetrf() и dgetri(). Scipy использует dgetrf() / dgetri(). Не могли бы вы попробовать использоватьscipy.linalg.inv()
scipy в python и посмотреть, приведет ли это к правильному выводу? - person francis   schedule 25.01.2020