gsl lu分解和浮点矩阵的反演

时间:2015-05-13 15:53:06

标签: gsl

由于内存限制,我需要使用gsl_matrix而不是gsl_linalg_LU_decomp来存储double类型的数据。但是,我想使用仅支持gsl_linalg_LU_invert的{​​{1}}和gsl_matrix。我没有找到支持gsl中浮点版本分解和反转的其他方法。

有没有办法解决这个难题?或者我只能从浮动转移到双重然后回来?提前谢谢!

1 个答案:

答案 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));
}