使用GNU Blas子例程

时间:2016-07-14 15:11:58

标签: c vector gnu blas elementwise-operations

我正在使用GNU库进行科学计算。基本上,我需要做相当于以下MATLAB代码:

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 个答案:

答案 0 :(得分:2)

你想要的功能是:

gsl_vector_mul(res, x)

我使用过英特尔的MKL,我喜欢他们网站上关于这些BLAS例程的文档。

答案 1 :(得分:0)

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

另一方面,你可能想尝试一个更好的矩阵库Eigen,你可以使用类似的代码实现你的操作

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