2016-07-14 94 views
0

我正在使用GNU庫進行科學計算。從本質上講,我需要做下面的MATLAB代碼相當於:使用GNU Blas子例程的矢量和矩陣之間的元素乘積

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

的代碼來實現你的操作你想要的功能是:

gsl_vector_mul(res, x) 

我已經使用了英特爾的MKL,並且我喜歡他們網站上有關這些BLAS例程的文檔。

+0

事實上,這似乎是完全按照我想要的。 – TheRevanchist

0

如果GSL設計合理,for循環就可以。例如gsl_vector_set()gsl_vector_get()可以內聯。您可以將運行時間與gsl_blas_daxpy進行比較。如果時序結果相似,for循環會得到很好的優化。

在另一方面,你可能想嘗試一個更好的矩陣庫Eigen,與您可以用類似上述

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

Eigen在C中不起作用,它僅適用於C++。 – TheRevanchist

+0

好的。我錯過了。 – kangshiyin