Условный переход или перемещение зависит от неинициализированных значений, используя gsl_matrix_set

Я пытаюсь использовать библиотеку GSL в C и столкнулся с проблемой.

Я выделяю пространство для моих матриц и векторов:

A   = gsl_matrix_alloc(nr, nc); /* Data matrix */
tau = gsl_vector_alloc(nc);     /* required place holder for GSL */

Тогда я инициализирую A:

for(i = 0; i < nr; i++){
  gsl_matrix_set(A, i, 0, 1.0); 
}

for(i = 1; i < nr; i++){
  for(j = 0; j < nc; j++){
    gsl_matrix_set(A, i, j, 1.0 / (double)(i + j + 1)); 
  }
}

Я тогда ошибаюсь в этой строке:

gsl_linalg_QR_decomp(A, tau);

со следующей ошибкой:

==901== Conditional jump or move depends on uninitialised value(s)
==901==    at 0x3E8920AE0E: cblas_dnrm2 (in /usr/lib64/libgslcblas.so.0.0.0)
==901==    by 0x3E88EA779A: gsl_linalg_householder_transform (in /usr/lib64/libgsl.so.0.14.0)
==901==    by 0x3E88EA1305: gsl_linalg_QR_decomp (in /usr/lib64/libgsl.so.0.14.0)
==901==    by 0x400FF3: GE_FindPoint (hw8.c:145)
==901==    by 0x400DF4: main (hw8.c:66)
==901==  Uninitialised value was created by a heap allocation
==901==    at 0x4A06A2E: malloc (vg_replace_malloc.c:270)
==901==    by 0x3E88E4CFD4: gsl_block_alloc (in /usr/lib64/libgsl.so.0.14.0)
==901==    by 0x3E88EB1768: gsl_matrix_alloc (in /usr/lib64/libgsl.so.0.14.0)
==901==    by 0x400EBB: GE_FindPoint (hw8.c:110)
==901==    by 0x400DF4: main (hw8.c:66)

Линия 110 указывает на линию выделения A: A = gsl_matrix_alloc(nr, nc);

В этом случае, nc = 3 а также nr = 3840, Что может вызвать эту ошибку?

1 ответ

Решение

Во второй части вашей инициализации начальные значения i а также j не соответствуют. Так вы звоните gsl_matrix_set( A, i, 0, ... ) дважды за 1 <= i gsl_matrix_set( A, 0, j, ... ) для 1 <= j

Просто измените эту часть инициализации на

for(i = 0; i < nr; i++){
   for(j = 1; j < nc; j++){
      gsl_matrix_set(A, i, j, 1.0 / (double)(i + j + 1)); 
   }  
}
Другие вопросы по тегам