私はいくつかの行列ライブラリにアクセスできますが、このプロジェクトではコンパイル時の定義とSVDの包含のために私はEigenを使用しています。効率的なマトリックス転置行列の固有値化
今、私は、次の操作をしています:
私が理解したようEigen::Matrix<double,M,N> A; // populated in the code
Eigen::Matrix<double,N,N> B = A.transpose() * A;
が、これはAのコピーを作成し、再び乗算され転置を形成します。この操作は、比較的小さな行列(M = 20〜30、N = 3)で実行されますが、1秒間に何百万回も実行されるため、できるだけ高速でなければなりません。
私は次を使用して高速であることを読んで:
B.noalias() = A.transpose() * A;
私は、入力として受け入れ、Bを満たす自分のサブルーチンを書くことができますが、使用して効率的に、既存の実装がある場合、私は思っていましたサイクルの最小量。
これを見ることを検討してください:http://scicomp.stackexchange.com/questions/25283/beating-typical-blas-libraries-matrix-multiplication-performance –
これは役に立ちますか? http://stackoverflow.com/questions/39606224/does-eigen-have-self-transpose-multiply-optimization-like-h-transposeh – kennytm