0

我正在研究 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));

谢谢!

4

2 回答 2

2

你想要的功能是:

gsl_vector_mul(res, x)

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

于 2016-07-14T17:06:25.760 回答
0

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

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

x = x.array() * (A * x).array();
于 2016-07-14T16:43:47.407 回答