gsl lu разложение и инверсия для матрицы с плавающей точкой

Из-за ограничения памяти, мне нужно использовать gsl_matrix_float вместо gsl_matrix который хранит данные типа double. Тем не менее, я хочу использовать gsl_linalg_LU_decomp а также gsl_linalg_LU_invert которые только поддерживают gsl_matrix, И я не нашел какой-то другой метод, который поддерживает декомпозицию и инверсию версии с плавающей точкой в ​​gsl.

Есть ли способ решить эту дилемму? Или я могу только переводить с поплавка на двойной, а потом обратно? Заранее спасибо!

1 ответ

Лучшее, что вы можете сделать, это, как вы предлагаете, конвертировать из float в double и обратно. Вот пример кода для выполнения инверсии (даны только основные компоненты - вы должны заполнить пробелы):

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));
}
Другие вопросы по тегам