1

Matlabコード:

invD = inv(D);
Dew=2*invD-E;

Dは複素数の1000x1000行列です。0.5秒以内に反転します。

さまざまなアプローチを使用して、このコードをC ++に移植するいくつかの方法を試しましたが、常に10秒より遅くなります。私は何が間違っているのですか?Matlabがそのコードを最適化する可能性はどのくらいありますか?

私はこのmatlabコードを書きませんでした、ただそれを移植する必要があります。申し訳ありませんが、私は数学でそれをコーディングする方がはるかに優れています。

4

3 に答える 3

2

ホイールを再発明するのではなく、boost :: ublasを使用して、次の手順に従うことができます。

于 2013-02-02T14:45:11.360 に答える
2

あなたがその逆で何をしているのか私にはわかりません。私の最初の反応は、ほとんどの人が行列を反転させないということです。たとえば、LU分解は、完全な反転よりもはるかに効率的で安定したソルバーです。

C++で書かれた線形代数ライブラリを見つけることをお勧めします。数学とプログラミングの両方であなたよりはるかに優れている他の人々がこの問題を解決しました。コードを使用します。自分で書いてはいけません。

GPUをお持ちの場合は、CUDAもご覧になることをお勧めします。

1000x1000は、驚くほど大きなマトリックスではありません。何百万もの自由度で問題を解決することは前代未聞ではありません。

于 2013-02-02T14:45:18.873 に答える
2

私はあなたがEigen間違って使用しているとかなり確信しています。ランダムな1000x1000行列をオクターブ(MATLABの無料の代替、おそらくわずかに最適化されていない)と次のEigenコードで反転してみました。Octaveは約1秒、Eigenは約1.5秒かかりboost::timerます(タイミングソリューションの代わりに使用していますが、面倒が少ないためです):

#include <iostream>
#include <Eigen/Dense>
#include <boost/timer/timer.hpp>

using Eigen::MatrixXcd;

int main() {
    MatrixXcd m,mi;
  {
    boost::timer::auto_cpu_timer t;
    m = MatrixXcd::Random(1000,1000);
  }
  {
    boost::timer::auto_cpu_timer t;
    mi = m.inverse();
  }
    std::cout << mi(4,4) << std::endl;
}

私が考えることができる最初の考えられる原因は、コンパイラオプションです。-O2少なくともC++コードをコンパイルしましたか?

行列が特殊な構造を持っている可能性があるため、数値を考慮すると、特定の場合に固有アルゴリズムが遅くなりますが、それを検討する前に、他の場所で問題を探します。

于 2013-02-02T16:00:25.143 に答える