【问题标题】:Matlab Vectorization : How to avoid this "for" loop?Matlab向量化:如何避免这个“for”循环?
【发布时间】:2012-08-22 13:34:45
【问题描述】:

我有以下矩阵:

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循环可以吗?

【问题讨论】:

  • 你的意思是A(i,j)*X(i)而不是A(i,j)*X吗?

标签: matlab vectorization


【解决方案1】:

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'

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      相关资源
      最近更新 更多