2016-07-14 59 views
0

我正在使用GNU库进行科学计算。从本质上讲,我需要做下面的MATLAB代码相当于:使用GNU Blas子例程的矢量和矩阵之间的元素乘积

x=x.*(A*x); 

其中x是一个gsl_vector,A是gsl_matrix。

我设法做到(A * X)用下面的命令:

gsl_blas_dgemv(CblasNoTrans, 1.0, A, x, 1.0, res); 

其中RES是另一个gsl_vector,其存储的结果。如果矩阵A的大小为m * m,且矢量x的大小为m * 1,则矢量res的大小为m * 1.

现在,还有待做的是向量x和res的元素乘积结果应该是一个向量)。不幸的是,我坚持这一点,并找不到这样做的功能。

如果有人能帮助我,我会非常感激。此外,有没有人知道是否有一些更好的GNU文档,而不是https://www.gnu.org/software/gsl/manual/html_node/GSL-BLAS-Interface.html#GSL-BLAS-Interface,目前为止我感到困惑。

最后,如果我通过简单地使用for循环(矢量的大小约为11000,此步骤将重复500-5000次)执行此步骤,我是否会失去时间性能?

for (i = 0; i < m; i++) 
    gsl_vector_set(res, i, gsl_vector_get(x, i) * gsl_vector_get(res, i)); 

谢谢!

回答

2

的代码来实现你的操作你想要的功能是:

gsl_vector_mul(res, x) 

我已经使用了英特尔的MKL,并且我喜欢他们网站上有关这些BLAS例程的文档。

+0

事实上,这似乎是完全按照我想要的。 – TheRevanchist

0

如果GSL设计合理,for循环就可以。例如gsl_vector_set()gsl_vector_get()可以内联。您可以将运行时间与gsl_blas_daxpy进行比较。如果时序结果相似,for循环会得到很好的优化。

在另一方面,你可能想尝试一个更好的矩阵库Eigen,与您可以用类似上述

x = x.array() * (A * x).array(); 
+0

Eigen在C中不起作用,它仅适用于C++。 – TheRevanchist

+0

好的。我错过了。 – kangshiyin