8

アプリケーションで多くの行列演算を実行する必要があります。最も時間がかかるのは、行列の乗算です。この方法で実装しました

template<typename T>
Matrix<T> Matrix<T>::operator * (Matrix& matrix)
{


    Matrix<T> multipliedMatrix = Matrix<T>(this->rows,matrix.GetColumns(),0);

    for (int i=0;i<this->rows;i++)
    {
        for (int j=0;j<matrix.GetColumns();j++)
        {
            multipliedMatrix.datavector.at(i).at(j) = 0;
            for (int k=0;k<this->columns ;k++)
            {
                multipliedMatrix.datavector.at(i).at(j) +=  datavector.at(i).at(k) * matrix.datavector.at(k).at(j);
            }
            //cout<<(*multipliedMatrix)[i][j]<<endl;
        }
    }
    return multipliedMatrix;
}

もっと上手に書く方法はないでしょうか??これまでのところ、私のアプリケーションでは、行列の乗算操作にほとんどの時間がかかります。たぶん、この種のことを行うための優れた/高速なライブラリがありますか?? しかし、グラフィック カードが統合されたラップトップで作業しているため、数学演算にグラフィック カードを使用するライブラリは使用できません。

4

5 に答える 5

7

Eigenは、最速ではないにしても、最速の線形代数ライブラリの 1 つです。丁寧に書かれており、クオリティが高いです。また、より読みやすいコードを作成する式テンプレートを使用します。リリースされたばかりのバージョン 3 では、データの並列処理に OpenMP を使用しています。

#include <iostream>
#include <Eigen/Dense>

using Eigen::MatrixXd;

int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;
}
于 2011-05-19T16:51:42.240 に答える
4

Boost uBLASは間違いなくこの種の方法だと思います。Boost は適切に設計され、十分にテストされ、多くのアプリケーションで使用されています。

于 2011-05-19T16:42:27.753 に答える
2

GNU Scientific LibraryまたはMV++を検討してください

C に問題がなければ、BLASは C と C でラップされた FORTRAN 命令の両方を組み込んだ低レベルのライブラリであり、膨大な数の高レベルの数学ライブラリで使用されています。

私はこれについて何も知りませんが、別のオプションは、まともなパフォーマンスを持っているように見えるMeschachかもしれません.

編集: グラフィック カードを使用するライブラリを使用したくないというコメントに関しては、多くの場合、グラフィック カードを使用するライブラリは標準 (非 GPU) ライブラリの特殊な実装であることを指摘します。たとえば、BLAS のさまざまな実装がウィキペディアのページにリストされていますが、GPU を活用するように設計されているのは一部のみです。

于 2011-05-19T16:42:57.003 に答える
1

という本がありIntroduction to Algorithmsます。動的プログラミングの章を確認することをお勧めします。動的計画法を使用した優れた行列乗算アルゴリズムを備えています。一読の価値あり。この情報は、ライブラリを使用する代わりに独自のロジックを記述したい場合に備えてのものです。

于 2011-05-19T16:46:15.190 に答える
0

効率的な行列乗算のためのアルゴリズムはたくさんあります。

効率的な行列乗算のアルゴリズム

アルゴリズムを見て、実装を見つけてください。

また、そのためのマルチスレッド実装を作成することもできます。

于 2011-05-19T16:47:35.440 に答える