2016-09-21 3 views
0

私は、固有のチュートリアルを閲覧している)H.transposeのような乗算最適化(移調持っていることが 「注意は言った:BLASユーザーはパフォーマンスの心配のために、Cのような表情。 noalias() - = 2 * a.adjoint()* b;は完全に最適化され、単一のgemmのような関数呼び出しを引き起こします。は固有の自己 <a href="https://eigen.tuxfamily.org/dox-devel/group__TutorialMatrixArithmetic.html" rel="nofollow">https://eigen.tuxfamily.org/dox-devel/group__TutorialMatrixArithmetic.html</a></p> <p>で* H

しかし、H.transpose()* Hのような計算は、結果が対称行列であるため、通常のA * Bと同じ半分の時間で済むはずですが、テストではH.transpose()* H spend H.transpose()* B.と同じ時間は、opencvのような固有の最適化を持っています。同様の機能を持っています。

私はベクトル化を中断します対称の最適化を知って、私はちょうど固有の

答えて

2

あなたは、あなたが固有値を伝えるために、右必要がある、対称最適化とベクトル化を提供できるソリューションを持っている場合、結果はこのように対称であることを知ってほしいです:

MatrixXd H = MatrixXd::Random(m,n); 
MatrixXd Z = MatrixXd::Zero(n,n); 
Z.sefladjointView<Lower>().rankUpdate(H.transpose()); 

最後の行は、下三角部分内Z += H * H^T計算します。上部は変更されません。その後、上位1に下部をコピーし、完全な行列をしたい:

Z.triangularView<Upper>() = Z.transpose(); 

このrankUpdateルーチンはBLASと同等に完全にベクトル化と同等です。小行列の場合は、完全な製品をよりよく実行してください。

それぞれdocも参照してください。

+0

これは間違いなく私が欲しいものですが、私は正しいテストをしましたが、私のテストでは思っています Z.sefladjointView ().rankUpdate(H); mean Z + = H * H ' 私は正しいですか? –

+0

右、H '* Hが必要な場合は、 '.rankUpdate(H.adjoint());'を呼び出します。 – ggael

+0

もう一度ご迷惑をおかけして申し訳ありません。私はH * A * H 'を計算する問題に遭遇しました。これはA = A'なので、それを加速する方法はありますか? –

関連する問題