0

線形システムを解くために、いくつかの大規模なスパース行列に対して、Matlab で LU 分解アルゴリズムを実装します。L,U 行列を取得したら、後方置換アルゴリズムと前方置換アルゴリズムを使用して三角線形システムを解きました。

    %x = U\y;

for i = n : -1 : 1
    x(i,:) = (y(i,:)-U(i,:)*x)/U(i,i);
end

しかし、このコードがボトルネックであることがわかりました。A\b を使用して解決策を得ることができますが、Matlab でこの問題を解決する効率的なアルゴリズムを実装する方法を知りたいです。たとえば、for ループなしで次のアクションをシミュレートする行列積を記述できますか?

(私はいくつかの参考書と紙を手に入れましたが、すべてのコードは Matlab にあるわけではなく、C++ または C コードのためだけです)

4

1 に答える 1

3

まず第一に、正確さ速度よりも優先されます。投稿したループは とは異なる結果を生成するU\yため、最初に確認することをお勧めします:)

私の知る限り、バックスラッシュは入力行列に対していくつかのチェックを行い、それに応じて最速のアルゴリズムを呼び出します。これらのチェックAが下三角であることを示している場合、それはまさにあなたがしたことを行います (しかし、おそらくより効率的です)。

とにかく、コードを高速化するには、 を事前に割り当てる必要がありますx。そうしないと、Matlab は反復ごとにベクトルを大きくする必要があります。また、ループ変数を呼び出しますii -- iは虚数単位であり、各反復での名前解決には時間がかかります。つまり、要約すると:

x = zeros(size(y));
for ii = n : -1 : 1
    x(ii,:) = (y(ii,:)-U(ii,:)*x)/U(ii,ii);
end

次の結果は前の結果に依存するため、「ベクトル化された」ソリューションはないことに注意してください。

于 2012-11-16T08:12:18.813 に答える