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

ソースコードを見てみると一目瞭然かも知れない.