Инверсия матрицы в CBLAS/LAPACK против Python
Матрица, которую я пытаюсь инвертировать:
[ 1 0 1]
A = [ 2 0 1]
[-1 1 1]
Истинное обратное:
[-1 1 0]
A^-1 = [-3 2 1]
[ 2 -1 0]
Используя Python's numpy.linalg.inv, я получаю правильный ответ. Одна из моих процедур для обратной матрицы использует dgetri_, это:
void compute_matrix_inverse_dbl( double* matrix,
int order,
double * inverse )
{
int N, lwork;
int success;
int *pivot;
double* workspace;
//===Allocate Space===//
pivot = malloc(order * order * order * sizeof(*pivot));
workspace = malloc(order * order * sizeof(*workspace));
//===Run Setup===//
N = order;
copy_array_dbl(matrix, order*order, inverse);
lwork = order*order;
//===Factor Matrix===//
dgetrf_(&N,&N,inverse,&N,pivot,&success);
//===Compute Inverse===//
dgetri_(&N, inverse, &N, pivot, workspace, &lwork, &success);
//===Clean Up===//
free(workspace);
free(pivot);
return;
}
Используя эту процедуру, я получаю:
[-1 1 +-e1 ]
A^-1 = [-3 2 1 ]
[ 2 -1 +-e2 ]
Где e1 и e2 и маленькие цифры порядка точности машины 1e-16. Теперь, возможно, dgetri_ не самый лучший в использовании. Однако, когда я инвертирую, используя QR-разложение через zgeqrf_ и zungqr_, я получаю аналогичный ответ. Когда я использую dgesvd_ для инверсии с использованием SVD, я получаю аналогичный ответ.
Кажется, что Python использует подпрограмму _umath_linalg.inv. Итак, у меня есть несколько вопросов:
- Что делает эта рутина?
- Какую процедуру CBLAS/LAPACK я могу использовать, чтобы инвертировать эту матрицу и получить результат, подобный CBLAS/LAPACK (такой, что e1 и e2 заменяются правильными нулями)?
1 ответ
Кажется, что numpy.linalg.inv
облегченная версия scipy.linalg.inv согласно описанию:
Этот модуль является облегченной версией модуля linalg.py в SciPy, который содержит высокоуровневый интерфейс Python для библиотеки LAPACK.
Глядя на scipy.linalg.inv, он звонит getrf
, затем getri
,