-1

各行に 5 つのゼロ以外の要素のみを含む 10000*10000 (行列 A) の疎行列があります。

ここでの問題は、対角要素と定数 (B 行列 st AX=B 内) が反復ごとに更新されることです。通常のMatlab関数「inv」またはガウス消去法を使用すると、1回の反復で解が計算されるまでに約25秒かかり、問題に必要な反復回数は100〜500程度です最終的な Solution:X を計算します。

並列計算を使用したくない場合は、これについていくつかの提案が必要です。
みんな助けて!:)

4

1 に答える 1

-1

はぁ。人々は、A*X=B の解は X=inv(A)*B を形成することであると学校で習ったからといって、これを行うべきだと考えています。はい、あなたの教科書はそうするように言いました。驚くべきことに、そのようなことをあなたに教えようとしている人々がたくさんいます。悲しいことに、彼らは間違っており、他の人に間違ったことを教えるように教え、それを本に載せることさえしています。この愚かさは広がり、終わりがないように見えます。また、教科書の著者が理論上は inv(A)*B よりも A\B の方が優れていることを知っていたとしても、逆行列形式で書く方が簡単です。

警告: 逆行列を作成したくありません。ガウスの消去法を使用したくありません。(プロにコンパイル済みツールでそのようなコーディングをさせてください。) 代わりに、MATLAB でバックスラッシュを使用してください。これは効率的でよく書かれています。

X = A\B;

同じシステムを頻繁に解く場合は、LU のような因数分解を使用します。さらに良いのは、多くの右辺を B の列として使用して、すべてのシステムを一度に解くことです。確かに、マトリックスが常に変化している場合、これはオプションではありませんが、それでもバックスラッシュが最適です。

(なぜ inv は良い考えではないのですか? ゼロがほとんどない、本質的に完全な行列を作成します。これは、バックスラッシュなどよりも遅く、数値的に安定していません。)

そして最後に、あなたのマトリックスがそれほどスパースである場合、なぜ神の名において、マトリックスにスパースストレージを使用しないのですか? スパース行列の場合、バックスラッシュは非常に高速になります。

于 2013-06-19T14:19:13.327 に答える