0

私は、科学計算用の GNU ライブラリを使用して、C に取り組んでいます。基本的に、次の 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 の要素ごとの積です (結果はベクトルになるはずです)。残念ながら、私はこれに固執しており、それを行う機能を見つけることができません。

誰かがそれについて私を助けることができれば、私はとても感謝しています. さらに、これまでのところhttps://www.gnu.org/software/gsl/manual/html_node/GSL-BLAS-Interface.html#GSL-BLAS-Interfaceよりも優れたGNUのドキュメントがあるかどうかは誰にもわかりません私を混乱させています。

最後に、単純に 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

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 に答える