Я пытаюсь использовать GSL для вычисления скалярного произведения между двумя векторами. Векторы представляют собой представления столбцов матрицы. Я вызываю функцию как gsl_blas_dsdot( &view1.vector, &view2.vector, &val)
, но при компиляции я получаю предупреждения о том, что функция ожидает тип аргумента const gsl_vector_float *
, и я получаю бессмысленный результат. Вот код для демонстрации:
#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
}
Я компилирую с gcc версии 5.4.0, GSL версии 2.2.1 со следующим:
gcc example.c -o example -lgsl -lgslcblas
И я получаю следующие предупреждения, и хотя программа выполняется, результат бессмысленен:
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
с использованием get_matrix_get_col()
приводит к тем же предупреждениям.
Кто-нибудь может помочь? Что такого в этих gsl-векторах и векторных представлениях, что делает их несовместимыми? Что это за типы const gsl_vector_float
?