【问题标题】:a faster way to compute the error of a vector一种计算向量误差的更快方法
【发布时间】:2015-11-12 00:31:32
【问题描述】:

对于给定的向量 $(x_1,x_2,\ldots, x_n)$ 我正在尝试计算

我写了以下代码

for l = 1:n
  for k = 1:n
    error = error + norm(x(i)-x(j))
  end
end

这段代码并不快,尤其是当 $n$ 很大时。我知道我实际上是在重复计算……但我该如何避免呢?如何加快我的代码速度?

谢谢!

【问题讨论】:

  • 您的数学符号中的代码中是否存在内循环?

标签: arrays algorithm matlab


【解决方案1】:

你可以用bsxfun来做,速度很快:

d = (abs(bsxfun(@minus, x, x.')));
result = sum(d(:));

或者使用pdist'cityblock' 距离(对于一维观察,它会减少到绝对差异)。这会计算每个距离一次,因此您需要将总和乘以 2

result = 2*sum(pdist(x(:),'cityblock'));

【讨论】:

    【解决方案2】:

    简单的加速怎么样?

    for a=1:n
      for b=a+1:n
         error = error + 2*norm(x(a)-x(b))
      end
    end
    

    对于标量,norm 只给出abs。 所以,

    error = sum(abs( bsxfun(@minus, error,error') ))
    

    会做同样的事情。

    还可以查看pdist,它将使用矢量范数以更快的方式对矢量执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2014-07-19
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2023-03-18
      相关资源
      最近更新 更多