2016-11-28 8 views
0

GSL을 사용하여 두 벡터 사이에 내적을 계산하려고합니다. 벡터는 행렬 열의 뷰입니다. 나는 gsl_blas_dsdot(&view1.vector, &view2.vector, &val)과 같은 함수를 호출하지만, 컴파일시에 함수가 예상되는 인자 타입이 const gsl_vector_float *이고, 무의미한 결과를 얻는다는 경고를 받는다.GSL BLAS 함수에 필요한 "const gsl_vector_float"란 무엇입니까?

gcc example.c -o example -lgsl -lgslcblas

을 그리고 난 다음 경고를 받고, :

내가 GCC 버전 5.4.0로 컴파일
#include<stdio.h> 
#include<gsl/gsl_matrix.h> 
#include<gsl/gsl_vector.h> 
#include<gsl/gsl_blas.h> 

void main(void){ 
    int i; 
    double val = 111.111; // Initialize to something 
    gsl_matrix *A = gsl_matrix_alloc(3,3); //Initialize mx 
    gsl_matrix_set_identity(A); // Set mx to identity 
    gsl_matrix_set(A,0,1,3.14); 
    gsl_vector_view a1 = gsl_matrix_column(A,0); // Vector allocations 
    gsl_vector_view a2 = gsl_matrix_column(A,1); 
    /* Print the vectors */ 
    printf("a1 = "); 
    for(i=0; i<3; i++){ 
    printf("%g ", gsl_vector_get(&a1.vector,i));} 
    printf("\na2 = "); 
    for(i=0; i<3; i++){ 
    printf("%g ", gsl_vector_get(&a2.vector,i));} 
    printf("\n"); 
    gsl_blas_dsdot(&a1.vector, &a2.vector, &val); // Dot product 
    printf("a1.a2 = %.2f\n", val); // Print result 
} 

, GSL 버전 2.2.1 다음에, 다음은 입증하는 코드는 프로그램을 실행함으로써, 그 결과는 무의미한 :

gsl_dot.c: In function ‘main’: 
gsl_dot.c:22:18: warning: passing argument 1 of ‘gsl_blas_dsdot’ from incompatible pointer type [-Wincompatible-pointer-types] 
    gsl_blas_dsdot(&a1.vector, &a2.vector, &val); // Dot product 
       ^
In file included from gsl_dot.c:4:0: 
/usr/local/include/gsl/gsl_blas.h:56:5: note: expected ‘const gsl_vector_float * {aka const struct <anonymous> *}’ but argument is of type ‘gsl_vector * {aka struct <anonymous> *}’ 
int gsl_blas_dsdot (const gsl_vector_float * X, 
    ^
gsl_dot.c:22:30: warning: passing argument 2 of ‘gsl_blas_dsdot’ from incompatible pointer type [-Wincompatible-pointer-types] 
    gsl_blas_dsdot(&a1.vector, &a2.vector, &val); // Dot product 
          ^
In file included from gsl_dot.c:4:0: 
/usr/local/include/gsl/gsl_blas.h:56:5: note: expected ‘const gsl_vector_float * {aka const struct <anonymous> *}’ but argument is of type ‘gsl_vector * {aka struct <anonymous> *}’ 
int gsl_blas_dsdot (const gsl_vector_float * 

참고도 gsl_vector 종류로 행렬 열을 복사 012,301,860,366을 사용하여 해당같은 경고 메시지가 나타납니다.

아무도 도와 줄 수 있습니까? 그것들을 호환되지 않는 유형으로 만드는 이러한 GSL 벡터 및 벡터 뷰는 무엇입니까? 이 const gsl_vector_float 유형은 무엇입니까?

답변

0

나는 아직도 const gsl_vector_float이 무엇인지 모르지만, gsl_blas_dsdot 대신에 gsl_blas_ddot 함수를 사용하면 경고없이 컴파일되고 올바르게 실행된다는 것을 알았습니다.

(자세한 내용은 gsl_blas_ddot)은 인수로 const gsl_vector *을 취합니다. 문제의 const gsl_vector_float *과 분명히 다릅니다.