Matlab的矢量:如何避免这种“for”循环?(Matlab Vectorization : Ho

2019-09-21 12:03发布

我有以下矩阵:

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循环做了什么?

Answer 1:

有一点经常被遗忘在Matlab:运营商'需要调换共轭.'是普通移位的)。 换言之, A' == conj(trans(A))A.' == 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'


Answer 2:

一种替代的方法:

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


文章来源: Matlab Vectorization : How to avoid this “for” loop?