Какая константа gsl_vector_float требуется для функций GSL BLAS?

Я пытаюсь использовать 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?


person saintsfan342000    schedule 28.11.2016    source источник


Ответы (1)


Я до сих пор не знаю, что такое const gsl_vector_float, но я понял, что использование функции gsl_blas_ddot вместо gsl_blas_dsdot компилируется без предупреждений и выполняется корректно.

Согласно документации, в которой я хотел бы дать более подробную информацию, gsl_blas_ddot принимает const gsl_vector * в качестве аргумента. Очевидно, это отличается от рассматриваемого const gsl_vector_float *.

person saintsfan342000    schedule 28.06.2017
comment
Немного поздно, однако, вы можете рассматривать gsl_vector как gsl_vector_double (поскольку тип по умолчанию — double), тогда становится ясной разница между gsl_vector_double и gsl_vector_float. P.S. вы можете принять свой собственный ответ как правильный. - person Bracula; 07.01.2019