我正在使用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));
谢谢!
答案 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();