如何优化此索引算法

时间:2012-09-12 15:53:14

标签: algorithm matlab indexing

我的问题

  • 无论如何,我可以加快这个计算吗?
  • 我可以使用更好的算法或实现来计算相同的值吗?

描述算法

我有一个复杂的索引问题,我正在努力以有效的方式解决。

目标是使用来自同等大小的矩阵w_primewdY的值的组合值来计算矩阵dX

w_prime(i,j)的值计算为mean( w( indY & indX ) ),其中indYindXdYdX相等的索引分别到ij

这是matlab中用于计算w_prime的简单实现:

for i = 1:size(w_prime,1)
  indY = dY == i;
  for j = 1:size(w_prime,2)
    indX = dX == j; 
    w_prime(ind) = mean( w( indY & indX ) );
  end
end

性能问题

在下面的示例中,此实现已足够;但是,在我的实际使用案例w中,dYdX是〜3000x3000w_prime是〜60X900。这意味着每个指数计算都发生在大约900万个元素上。不用这个实现太慢而无法使用。此外,我需要运行此代码几十次。

示例计算

如果我想计算w(1,1)

  • 找到等于1的dY索引,另存为indY
  • 找到等于1的dX索引,另存为indX

enter image description here

  • 查找indYindX的交集,另存为ind

enter image description here

  • mean( w(ind) )保存到w_prime(1,1)

enter image description here

一般问题描述

我有两个向量XT定义的设定点,两者都是1XN,其中N是~3000。另外,X和T的值分别是由间隔(160)和(1 900)限定的整数。

矩阵dXdT只是距离矩阵,意味着它们包含点之间的成对距离。即dx(i,j)等于abs( x(i) - x(j) )

使用以下代码计算:dx = pdist(x);

矩阵w可以被认为是一个权重矩阵,描述了一个点对另一个点的影响程度。

计算w_prime(a,b)的目的是确定a维度中Xb之间的T分隔的子集之间的平均权重{{1}}尺寸。

这可以表示如下:

enter image description here

1 个答案:

答案 0 :(得分:6)

使用ACCUMARRAY

这很简单
nx = max(dX(:));
ny = max(dY(:));

w_prime = accumarray([dX(:),dY(:)],w(:),[nx,ny],@mean,NaN)

输出将是nx - by - ny大小的数组,其中NaNs没有相应的索引对。如果您确定将始终存在完整的索引,则可以将上述计算简化为

w_prime = accumarray([dX(:),dY(:)],w(:),[],@mean)

那么,accumarray做了什么?它查看[dX(:),dY(:)]行。每行在(i,j)中提供行所贡献的w_prime坐标对。对于所有对(1,1),它将函数(@mean)应用于w(:)中的相应条目,并将输出写入w_prime(1,1)