gsl_vector_viewの使用上の注意
アクセスはgsl_vector_getで行った方が吉.
int r=3; int c=4; gsl_matrix *m = gsl_matrix_alloc(r,c); for(i = 0; i < r; i++) for(j = 0; j < c; j++) gsl_matrix_set(m, i, j, i*c+j); for(i = 0; i < r; i++){ for(j = 0; j < c; j++) std::cout << gsl_matrix_get( m, i, j ) << " "; std::cout << std::endl; } std::cout << std::endl; gsl_vector* v; for( i = 0 ; i < r ; i++ ){ v = &gsl_matrix_row( m , i ).vector; for( j = 0 ; j < c ; j++ ) std::cout << v->data[j] << " "; std::cout << std::endl; } std::cout << std::endl; for( j = 0 ; j < r ; j++ ){ v = &gsl_matrix_column( m , j ).vector; for( i = 0 ; i < c ; i++ ) std::cout << v->data[i] << " "; std::cout << std::endl; }
出力結果
0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 1 2 3 2 3 4 3 4 5
3番目の場合は,列方向に表示したつもり(行列の転置が表示されることを期待)だが,各列の1行目(v->data[0])から順に表示されることになった.
改良版
for( j = 0 ; j < c ; j++ ){ v = &gsl_matrix_column( m , j ).vector; for( i = 0 ; i < r ; i++ ) std::cout << gsl_vector_get(v, i) << " "; std::cout << std::endl; }
出力結果
0 4 8 1 5 9 2 6 10 3 7 11
ソースコードを見てみると一目瞭然かも知れない.