【问题标题】:How can I optimize this indexing algorithm如何优化此索引算法
【发布时间】:2012-09-05 16:51:59
【问题描述】:

我的问题

  • 无论如何我可以加快这个计算?
  • 是否有更好的算法或实现可用于计算相同的值?

描述算法

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

目标是计算矩阵w_prime,使用来自相同大小矩阵wdYdX 的值的组合。

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

性能问题

这个实现在下面的例子中就足够了;但是,在我的实际用例中,wdYdX 是 ~3000x3000w_prime 是 ~60X900。这意味着每个索引计算都发生在大约 900 万个元素上。不需要这种实现太慢而无法使用。此外,我还需要运行此代码几十次。

计算示例

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

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

  • 找到indYindX的交集另存为ind

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

一般问题描述

我有一个由两个向量 XT 定义的设定点,它们都是 1XN,其中 N 约为 3000。此外,X 和 T 的值是分别受区间 (1 60) 和 (1 900) 限制的整数。

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

它们的计算方法是:dx = pdist(x);

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

计算w_prime(a,b) 的目的是确定X 维度中的aT 维度中的b 分隔的点子集之间的平均权重。

这可以表示如下:

【问题讨论】:

  • 您好!我想知道您是否可以对需要使用此计算的问题提供更一般的描述(例如寻路 - 需要计算新位置等)。也许可以建议一个更好的算法?
  • 哈哈哇!好的,绝对不是我希望的简单问题。当我与我的白板重聚时,我会尝试回到这个问题,哈哈希望其他人可以在此期间帮助你。现在纯粹出于好奇,你为什么要这样做?找到平均影响力的一般目的是什么?我猜是某种数据相关性??
  • 每个问题都应该如此详细和精确地描述。

标签: algorithm matlab indexing


【解决方案1】:

ACCUMARRAY 很简单:

nx = max(dX(:));
ny = max(dY(:));

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

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

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

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

【讨论】:

  • 我想和MATLAB的创造者一起生孩子
  • 完美!这正是我想要的!
猜你喜欢
  • 2019-10-17
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2012-07-03
相关资源
最近更新 更多