2017-02-13 11 views
3

私は以下の問題があり、forループなしで考えることができません。私は何を取得したいことはあるmatlabのforループなしの行と列の行列乗算

a=rand(N,3), b=rand(3,N)

:すべてのiのために三次元に連結b(:, i)*a(i, :)(3 * 3行列)

は二つの行列を考えてみましょう。

したがって、上記の例では結果は(3 * 3 * N)の行列になります。

+0

それがノーの要因の周りにある '(3×)*(1×3)は、 - > 3x3' bは、ベクトル3×1であり、aはベクトル1×3であるN行を有するN列を有します – Paramar

+0

私は 'kron'と' reshape'を使ってとても良い解決策があると確信していますが、私はそれを理解できません。それ以外の場合はループしてください –

+0

あなたの修正内容は正しいですか?私はそれが1x3x3x1 - > 1x1の倍数だと思う。ところで、クロネッカー製品はここで必要以上に多くの計算をしているようです。 3x3xNと3Nx3Nの寸法から見ることができます。 – Paramar

答えて

6

のMatlab R2016bバージョン:

c = reshape(a.',[1,3,N]) .* reshape(b,[3,1,N]); 

以前のMatlabのバージョン:

c = repmat(reshape(a.',[1,3,N]),[3,1,1]) .* repmat(reshape(b,[3,1,N]),[1,3,1]); 

編集:ここにMatlab R2016b(Win7x64)のクイックベンチマークです。ベクトル化の高速化が50

Benchmark on R2016b (Win7x64)

+0

ああ!放送を利用する!きちんとした –

+1

ありがとう! :)私は、スピードアップを示すベンチマークを追加しました。私はそれが価値があると思う... – Florian

+0

@AnderBiguri放送は何ですか?以前は聞いたことがありません。 [this](https://mathworks.com/help/distcomp/broadcast-variables.html)は定義ですか?ちょっと興味があるんだけど。ありがとう。 – codeaviator