使用 GNU Blas 子程序在向量和矩阵之间进行元素乘积
Elementwise product between a vector and a matrix using GNU Blas subroutines
我正在研究 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));
谢谢!
如果 GSL 设计得当,for 循环是可以的。例如 gsl_vector_set()
和 gsl_vector_get()
可以内联。您可以将 运行 时间与 gsl_blas_daxpy
进行比较。如果计时结果相似,则for循环优化良好。
另一方面,你可能想尝试一个更好的矩阵库Eigen,你可以用类似于此的代码实现你的操作
x = x.array() * (A * x).array();
您想要的功能是:
gsl_vector_mul(res, x)
我使用过 Intel 的 MKL,我喜欢他们网站上关于这些 BLAS 例程的文档。
我正在研究 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));
谢谢!
如果 GSL 设计得当,for 循环是可以的。例如 gsl_vector_set()
和 gsl_vector_get()
可以内联。您可以将 运行 时间与 gsl_blas_daxpy
进行比较。如果计时结果相似,则for循环优化良好。
另一方面,你可能想尝试一个更好的矩阵库Eigen,你可以用类似于此的代码实现你的操作
x = x.array() * (A * x).array();
您想要的功能是:
gsl_vector_mul(res, x)
我使用过 Intel 的 MKL,我喜欢他们网站上关于这些 BLAS 例程的文档。