如何优化此索引算法

Posted

技术标签:

【中文标题】如何优化此索引算法【英文标题】: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 分隔的点子集之间的平均权重。

这可以表示如下:

【问题讨论】:

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

以上是关于如何优化此索引算法的主要内容,如果未能解决你的问题,请参考以下文章

mysql 优化

mysql---索引优化

如何优化此替换列和索引的代码?

如何针对 Oracle 优化此查询

如何优化此查询...?

mysql优化之索引优化