1

私は次の行列を持っています:

X=1 2 3  
Y=4 5 6  

A=1 2 3  
  4 5 6  
  7 8 9  

私はやってみたいです

for each (i,j) in A  
  v = A(i,j)*X - Y
  B(i,j) = v * v'

つまり、A の各要素はベクトル X で乗算され、結果のベクトルはそれ自体から Y を減算し、最後にそのベクトルの内積を取って 1 つの数値を取得します。
for ループなしで実行できますか?

4

2 に答える 2

5

Matlabで忘れられがちなことの1つは、演算子が転置された共役'を取ります(通常の転置です)。言い換えると、、、に対して、は複素行列の場合に違いが生じます。.'A' == conj(trans(A))A.' == trans(A)A

さて、あなたの方程式にいくつかの数学を適用しましょう。我々は持っています

v = A(i,j)*X - Y
B(i,j) = v * v'
       = (A(i,j)*X - Y) * (A(i,j)*X - Y)'
       = A(i,j)*X * conj(A(i,j))*X' - Y * conj(A(i,j))*X' 
         - A(i,j)*X * Y' + Y * Y'
       = A(i,j)*conj(A(i,j)) * X*X' - conj(A(i,j)) * Y*X' - A(i,j) * X*Y' + Y*Y'

したがって、最初の結果は次のようになります

B = A.*conj(A) * (X*X') - conj(A) * (Y*X') - A * (X*Y') + Y*Y'

実数の行列/ベクトルの場合、恒等式があります

X*Y' == Y*X'
A == conj(A)

つまり、式を次のように減らすことができます。

B = A.*A * (X*X') - 2*A * (X*Y') + Y*Y'
  = A.^2 * (X*X') - 2*A * (X*Y') + Y*Y'
于 2012-08-22T13:38:17.997 に答える
1

別の方法:

X = [1 2 3]
Y = [4 5 6]
A = [1 2 3; 4 5 6; 7 8 9]

V = bsxfun(@minus, A(:)*X, [4 5 6])
b = sum((V.^2)')
B = reshape(b , 3, 3)

私は結果を得る:

B = 27     5    11
    45   107   197
   315   461   635
于 2012-08-22T13:53:50.297 に答える