私は以下の問題があり、forループなしで考えることができません。私は何を取得したいことはあるmatlabのforループなしの行と列の行列乗算
a=rand(N,3), b=rand(3,N)
:すべてのi
のために三次元に連結b(:, i)*a(i, :)
(3 * 3行列)
は二つの行列を考えてみましょう。
したがって、上記の例では結果は(3 * 3 * N)の行列になります。
私は以下の問題があり、forループなしで考えることができません。私は何を取得したいことはあるmatlabのforループなしの行と列の行列乗算
a=rand(N,3), b=rand(3,N)
:すべてのi
のために三次元に連結b(:, i)*a(i, :)
(3 * 3行列)
は二つの行列を考えてみましょう。
したがって、上記の例では結果は(3 * 3 * N)の行列になります。
の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
ああ!放送を利用する!きちんとした –
ありがとう! :)私は、スピードアップを示すベンチマークを追加しました。私はそれが価値があると思う... – Florian
@AnderBiguri放送は何ですか?以前は聞いたことがありません。 [this](https://mathworks.com/help/distcomp/broadcast-variables.html)は定義ですか?ちょっと興味があるんだけど。ありがとう。 – codeaviator
それがノーの要因の周りにある '(3×)*(1×3)は、 - > 3x3' bは、ベクトル3×1であり、aはベクトル1×3であるN行を有するN列を有します – Paramar
私は 'kron'と' reshape'を使ってとても良い解決策があると確信していますが、私はそれを理解できません。それ以外の場合はループしてください –
あなたの修正内容は正しいですか?私はそれが1x3x3x1 - > 1x1の倍数だと思う。ところで、クロネッカー製品はここで必要以上に多くの計算をしているようです。 3x3xNと3Nx3Nの寸法から見ることができます。 – Paramar