2013-05-15 2 views
1

Может кто-нибудь помочь мне разобраться, как это сделать. Я смотрю документацию, но это было так давно, что мне пришлось делать какие-то вещи с линейной алгеброй, которые я немного потерял.gsl complex matrix * complex vector

У меня есть комплексная матрица 14x14, называемая Y, и комплексный вектор, который называется I. Мне нужно их умножить и установить результат на комплексный вектор с именем IL.

До сих пор я понял, что мне нужно использовать:

gsl_blas_zgemv (CBLAS_TRANSPOSE_t TransA, const gsl_complex alpha, const 
       gsl_matrix_complex * A, const gsl_vector_complex * x, const 
       gsl_complex beta, gsl_vector_complex * y) 

Но я не уверен, что идет где. Не уверен, что происходит. Что-то вроде этого? но что такое альфа и бета?

gsl_blas_zgemv(CblasNoTrans, ???, &Y, &I, ???, IL); 
+1

Функция с не 'CblasNOTrans' является у: = альфа * А * х + бета * у Так что я бы назвал его как ' gsl_blas_zgemv (CblasNoTrans, GSL_COMPLEX_ONE, и Y, и я, GSL_COMPLEX_ZERO, IL); ' –

+0

Я не уверен, что вы имеете в виду здесь. –

+0

Ох. Понимаю. Но что такое GSL_COMPLEX_ONE & GSL_COMPLEX_ZERO? Нужно ли мне определять их, и если да, то как? –

ответ

4

Не зная, что вы на самом деле делаете, похоже, что вы не включили правильные заголовки. В следующих работах без ошибок для меня:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#include <gsl/gsl_blas.h> 
#include <gsl/gsl_complex_math.h> 

int 
main(int argc, char **argv) 
{ 

    int size = 14; 
    gsl_matrix_complex *A = NULL; 
    gsl_vector_complex *x = NULL; 
    gsl_vector_complex *y = NULL; 

    A = gsl_matrix_complex_alloc(size, size); 
    x = gsl_vector_complex_alloc(size); 
    y = gsl_vector_complex_alloc(size); 

    gsl_matrix_complex_set_all(A, GSL_COMPLEX_ONE); 
    gsl_vector_complex_set_all(x, GSL_COMPLEX_ONE); 
    gsl_vector_complex_set_all(y, GSL_COMPLEX_ZERO); 

    gsl_blas_zgemv(CblasNoTrans, GSL_COMPLEX_ONE, A, x, 
      GSL_COMPLEX_ZERO, y); 

    return(EXIT_SUCCESS); 

} 

И компилирования с

gcc -o test -I/opt/local/include/gsl -L/opt/local/lib -lgsl -lgslcblas test.c 

(да, я нахожусь на Mac с помощью MacPorts).

+0

О, да, мне не хватало gsl/gsl_complex_math.h, поэтому я просто определял свой собственный, который работал, но теперь, когда я знаю, что GSL_COMPLEX_ONE и GSL_COMPLEX_ZERO находятся в этом заголовке, я просто использую это. Спасибо –

+0

'-I/opt/local/include/gsl -L/opt/local/lib -lgsl -lgslcblas' можно заменить' '' gsl-config -cflags -libs \ '', включая обратные ссылки. –