MATLAB行列乗算(最高の計算アプローチ)


10

2つの参照系(軸)間で座標変換を行う必要があります。そのためには、いくつかの中間軸が使用されているため、3つの行列()を乗算する必要があります。これを解決する2つのアプローチについて考えました。3×3

方法#1:乗算を直接行う、つまり、

vf=R1 R2 R3 vi

方法#2:ステップに分割:

  1. v3i=R3 vi
  2. v23=R2 v3i
  3. vf=R1 v23

どこ:

R 2および R 3 3 × 3行列ですR1R2R33×3

v i v 3 i v 23 3 × 1ベクトルですvfviv3iv233×1

どの方法が変換を実行するために計算的に(時間を短縮して)より効率的かを知りたいです(これは何度も行われます)。


4
四元数を使用します。
Chris Taylor

@ChrisTaylor:ご提案ありがとうございます。
julianfperez

2
クロスポストしないでください。
食い物

2
こことStackOverflowにクロスポストされた2つの質問があったことに注意してください。質問とそのコメントと回答は、この質問にマージされました。
アロンアフマディア

@ウィルとアロンアフマディア:ごめんなさい。私はクロスポストが禁止されていることを知りませんでした。私はいつもStackOverflowに質問を投稿してきましたが、今日、この新しいサイトを見つけました。おそらく、ここでも助けが見つかると思いました。
julianfperez

回答:


17

ABCvA(B(Cv))

A(B(Cv))

一般に、プログラミングのわずかな違いが大規模な計算に与える影響を測定する方法を見つけるには、Matlabのプロンプト '' help profile ''に書き込みます。


回答で提供された興味深い情報をありがとうございます。
julianfperez

中間体を保存した方が速いのはなぜですか?
Federico Poloni 2017

@FedericoPoloni:中間体を保存しない方が少し速いと書いていた。
Arnold Neumaier 2017

@ArnoldNeumaier Oohごめんなさい。:)
フェデリコポローニ2017

14

まず、中間変数ではなく角括弧を使用します。もちろん、中間結果に興味があるのでなければ、私はそうは思わないでしょう。

私はMatlabで以下を試しました:

>> N = 500;                                             
>> A = rand(N); B = rand(N); C = rand(N); v = rand(N,1);

>> tic, for k=1:100, A*B*C*v; end; toc
Elapsed time is 3.207299 seconds.

>> tic, for k=1:100, A*(B*(C*v)); end; toc
Elapsed time is 0.108095 seconds.

しかし、これはかなり恐ろしいことだと言わざるを得ません。これは単純で効率的なソリューションの既知の問題であるため、私は常にMatlabが行列の乗算順序について賢いと考えていました。


マトリックスが3x3である部分を見逃しましたか?:)
Aron Ahmadia

2
@AronAhmadia:おっと...お見逃し、ありがとう。私はそれらの行列の大きさのために、全体の問題は議論の余地があると思いますが、私はまだ大きなN.のために結果に驚いています
ペドロ

7
浮動小数点演算は結合的ではないため、MATLABは式評価のC優先規則に従っていると思います。彼らはあなたが何をしているのかを知っていると想定する必要があります:)
Aron Ahmadia

2
@Pedro:回答ありがとうございます。行列の次元が3x3の場合、私はあなたの解が通常の(括弧なしの)行列の乗算よりも優れていることを確認しました。
julianfperez

+1実行時間を測定するシンプルで簡単な方法を示してくれてありがとう
Steven Magana-Zook

14

行列は非常に小さいので、すべてのコストは呼び出しのオーバーヘッドになります。何度も変換を行う場合は、事前計算をD=A*B*C1回行ってから、各ベクトルに対してapplyを実行する方が速くなりますv_f=D*v_i。これをmexファイルに引き出すことも検討できます。


お返事ありがとうございます。私の場合、行列は回転行列であるため(角度値に依存し、これは変化します)、積A B Cは常に同じではありません。
julianfperez
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.