我有以下矩阵:
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,最后我们将该向量的内积乘以一个数字。
它可以在没有for循环的情况下完成吗?
答案 0 :(得分:5)
在Matlab中经常被遗忘的一件事:运算符'
采用共轭转置(.'
是普通的转置)。换句话说,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'
答案 1 :(得分: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