我正在将原型matlab代码移植到C中,并且在反转复数的nxn矩阵时遇到了麻烦。
我使用GSL使用以下代码执行LU分解和反转:
size_t matSize = 4;
gsl_permutation *perm = gsl_permutation_calloc(matSize);
gsl_matrix_complex *mat = gsl_matrix_complex_calloc(matSize, matSize);
gsl_matrix_complex *inv = gsl_matrix_complex_calloc(matSize, matSize);
gsl_complex temp;
for(int i = 0; i < matSize; i++) {
for(int j = 0;j < matSize; j++) {
GSL_SET_COMPLEX(&temp,i+1,j+1);
gsl_matrix_complex_set(mat,i,j,temp);
}
}
int s;
gsl_linalg_complex_LU_decomp(mat, perm, &s);
gsl_linalg_complex_LU_invert(mat, perm, inv);
for(int i = 0; i < matSize; i++) {
for(int j = 0; j < matSize; j++) {
printf("%f + %fi \n",GSL_REAL(gsl_matrix_complex_get(inv, i, j)),GSL_IMAG(gsl_matrix_complex_get(inv, i, j)));
}
}
然而,比较我得到matlab的结果,它们完全不相似。我知道matlab并不总是使用LU进行反演,因为它有一个取决于矩阵属性的算法决策树,但我期望得到可比较的结果。
欢迎任何帮助。除了对其他库/反演技术的建议(不是说GSL是错误的,毫无疑问我是!)我所拥有的矩阵是fftw_complex类型,我宁愿避免转换/从gsl_complex_matrix转换。