Matlab Vectorization:如何避免这种"for"循环?

Hap*_*tal 1 matlab vectorization

我有以下矩阵:

X=1 2 3  
Y=4 5 6  

A=1 2 3  
  4 5 6  
  7 8 9  
Run Code Online (Sandbox Code Playgroud)

我想要做

for each (i,j) in A  
  v = A(i,j)*X - Y
  B(i,j) = v * v'
Run Code Online (Sandbox Code Playgroud)

即A的每个元素乘以向量X,然后结果向量从自身中减去Y,最后我们取该向量的内积来得到一个数.
可以不用for循环吗?

Meh*_*olf 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'
Run Code Online (Sandbox Code Playgroud)

所以第一个结果就是

B = A.*conj(A) * (X*X') - conj(A) * (Y*X') - A * (X*Y') + Y*Y'
Run Code Online (Sandbox Code Playgroud)

真实矩阵/向量的情况下,一个具有身份

X*Y' == Y*X'
A == conj(A)
Run Code Online (Sandbox Code Playgroud)

这意味着,您可以将表达式减少到

B = A.*A * (X*X') - 2*A * (X*Y') + Y*Y'
  = A.^2 * (X*X') - 2*A * (X*Y') + Y*Y'
Run Code Online (Sandbox Code Playgroud)