2016-11-16 15 views
0

Я пытаюсь использовать библиотеку GSL в C и нахожусь в беде.Условный переход или переход зависит от неинициализированных значений - с помощью gsl_matrix_set

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

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

Я тогда erroring на этой линии:

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. Что может вызвать эту ошибку?

+0

Я не знаю GSL, но инициализация выглядит странно для меня. 'gsl_matrix_set (A, i, 0, ...)' вызывается дважды для 1 <= i

+0

Это похоже на избавление от ошибки! –

+0

Если это так, я должен опубликовать его в качестве ответа? –

ответ

0

Во второй части инициализации начальные значения i и j несовместимы. Поэтому вы вызываете gsl_matrix_set(A, i, 0, ...) дважды за 1 < = i < nr, и вы никогда не звоните gsl_matrix_set(A, 0, j, ...) за 1 < = j < nc.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^