由于内存限制,我需要使用gsl_matrix
而不是gsl_linalg_LU_decomp
来存储double类型的数据。但是,我想使用仅支持gsl_linalg_LU_invert
的{{1}}和gsl_matrix
。我没有找到支持gsl中浮点版本分解和反转的其他方法。
有没有办法解决这个难题?或者我只能从浮动转移到双重然后回来?提前谢谢!
答案 0 :(得分:0)
你可以做的最好的事情是,如你所说,从浮动转换为双倍和返回。下面是执行反转的示例代码(只给出必要的组件 - 你必须填写空白):
include <gsl/gsl_blas.h>
include <gsl/gsl_linalg.h>
void matrix_invert(gsl_matrix_float *, gsl_matrix_float *, int);
int main()
{
gsl_matrix_float *X = gsl_matrix_float_alloc(N, N);
gsl_matrix_float *invX = gsl_matrix_float_alloc(N, N);
matrix_invert(X, invX, N); //invM = inv(I)
return 0;
}
void matrix_invert(gsl_matrix_float *matrix, gsl_matrix_float *inverse, int N)
{
int i=0,j=0,signum=0;
gsl_matrix *DM = gsl_matrix_alloc(N, N);
gsl_matrix *DM_I = gsl_matrix_alloc(N, N);
for (i=0;i<N;i++)
for (j=0;j<N;j++)
gsl_matrix_set(DM, i, j, gsl_matrix_float_get(matrix,i,j));
gsl_permutation *p = gsl_permutation_alloc(N);
gsl_linalg_LU_decomp(DM, p, &signum);
gsl_linalg_LU_invert(DM, p, DM_I);
gsl_permutation_free(p);
gsl_matrix_free(DM);
for (i=0;i<N;i++)
for (j=0;j<N;j++)
gsl_matrix_float_set(inverse, i, j, gsl_matrix_get(DM_I,i,j));
}