Matlab で 3*(大きな数) 行列の各列からサイズ 3 のベクトルを減算する方法を見つけようとしています。もちろん、ループを使用することもできますが、numpy ブロードキャストに少し似た、より効率的なソリューションを見つけようとしています。ああ、それを使用するのに十分なメモリがないため、repmat を使用できません (さらに別の 3*(大きな数) 行列を作成するため)...
これは可能ですか?
Matlab で 3*(大きな数) 行列の各列からサイズ 3 のベクトルを減算する方法を見つけようとしています。もちろん、ループを使用することもできますが、numpy ブロードキャストに少し似た、より効率的なソリューションを見つけようとしています。ああ、それを使用するのに十分なメモリがないため、repmat を使用できません (さらに別の 3*(大きな数) 行列を作成するため)...
これは可能ですか?
ジャストインタイム アクセラレーション (JITA)などのコンパイラの最適化のおかげで、MATLAB ではループはもう悪くありません。ほとんどの場合、現在の MATLAB バージョンのループを使用したソリューションは、複雑な (クールではありますが :D) ワンライナーよりもはるかに高速であることに気付きました。
bsxfun
トリックを行うかもしれませんが、私の経験では、メモリの問題も発生する傾向がありますが、repmat
.
したがって、構文は次のようになります。
AA = bsxfun(@minus,A,b)
b
はベクトルでA
、大きな行列はどこですか
しかし、おかしなバージョンのプロファイルを作成してから決定することを強くお勧めします! ほとんどの場合、メモリの制約により、選択の余地がない可能性があります:)
他の回答は少し古くなっています - Matlab R2016bは標準機能としてブロードキャストを追加したようです。質問に一致するそのブログ投稿の例:
>> A = ones(2) + [1 5]'
A =
2 2
6 6
これがコードを高速化するかどうかはわかりませんが、ベクトルからスカラーを減算してもメモリの問題はありません。行列のサイズが非常に非対称であるため、短い次元での for ループのオーバーヘッドは無視できます。
かもね
matout = matin;
for j = 1:size(matin, 1) %3 in this case
matout(j,:) = matin(j,:) - vec_to_subtract(j);
end
もちろん、これをその場で行うこともできますが、元のマトリックスを保持する必要があるかどうかはわかりませんでした。
実際には、まだテストしていませんが、http://www.frontiernet.net/~dmschwarz/genops.html (mex ファイルをオーバーロードするオペレーター) もうまくいくようです。