8

重複の可能性:
行列の各行からベクトルを減算する方法は?
行列の各行を固定行で割るにはどうすればよいですか?

M 行 4 列の行列 (M1) があります。1 行 4 列の別の配列 (M2) があります。M1 のすべての要素を、M2 のそれぞれの列要素で減算したいと思います。つまり、M1 の各列は、M2 の同じ列位置にあるスカラーによって減算される必要があります。を呼び出しrepmat(M2,M,1)て、列の各要素が同じであるサイズ MxN の新しい行列を作成し、要素ごとの減算を行うことができます。

M2new = repmat(M2,M,1)
final = M1 - M2new

ただし、これは 2 行のコードであり、メモリ内に新しい要素を作成します。この操作を実行する最も高速で、メモリの消費が最も少ない方法は何ですか?

4

2 に答える 2

14

bsxfun次の例のように使用します。

x=magic(4);
y=x(1,:);
z=bsxfun(@minus,x,y)

z =

     0     0     0     0
   -11     9     7    -5
    -7     5     3    -1
   -12    12    12   -12

ここでzは、すべての行から最初の行を引くことによって得られます。x行列とy行ベクトルに置き換えるだけで、すべて設定できます。

于 2011-05-11T17:05:33.250 に答える
14

bsxfun(.)より効率的である可能性がありますが、個人的には古いタイマーとして、次のような線形代数ベースのソリューションを完全に無視しないことをお勧めします。

> M1= magic(4)
M1 =
   16    2    3   13
    5   11   10    8
    9    7    6   12
    4   14   15    1
> M2= M1(1, :)
M2 =
   16    2    3   13
> M1- ones(4, 1)* M2
ans =
    0    0    0    0
  -11    9    7   -5
   -7    5    3   -1
  -12   12   12  -12

実際のユースケースとプロファイラーが実際に使用される機能を決定します。

于 2011-05-11T17:20:42.380 に答える