私は次の行列を持っています:
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 ループなしで実行できますか?
私は次の行列を持っています:
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 ループなしで実行できますか?
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'
別の方法:
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