【问题标题】:Elementwise product between a vector and a matrix using GNU Blas subroutines使用 GNU Blas 子例程的向量和矩阵之间的元素乘积
【发布时间】:2016-07-14 15:11:57
【问题描述】:

我正在研究 C,使用 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));

谢谢!

【问题讨论】:

    标签: c vector gnu blas elementwise-operations


    【解决方案1】:

    你想要的功能是:

    gsl_vector_mul(res, x)
    

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

    【讨论】:

    • 确实,这似乎完全符合我的要求。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多