如何优化此索引算法
Posted
技术标签:
【中文标题】如何优化此索引算法【英文标题】:How can I optimize this indexing algorithm 【发布时间】:2012-09-05 16:51:59 【问题描述】:我的问题
无论如何我可以加快这个计算? 是否有更好的算法或实现可用于计算相同的值?描述算法
我有一个复杂的索引问题,我正在努力以一种有效的方式解决。
目标是计算矩阵w_prime
,使用来自相同大小矩阵w
、dY
和dX
的值的组合。
w_prime(i,j)
的值计算为mean( w( indY & indX ) )
,其中indY
和indX
是dY
和dX
的索引,分别等于i
和j
。
这是一个在 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
、dY
、dX
是 ~3000x3000
和 w_prime
是 ~60X900
。这意味着每个索引计算都发生在大约 900 万个元素上。不需要这种实现太慢而无法使用。此外,我还需要运行此代码几十次。
计算示例
如果我想计算w(1,1)
dY
等于1的索引,另存为indY
找到dX
的索引等于1,另存为indX
找到indY
和indX
的交集另存为ind
将mean( w(ind) )
保存到w_prime(1,1)
一般问题描述
我有一个由两个向量 X
和 T
定义的设定点,它们都是 1XN,其中 N 约为 3000。此外,X 和 T 的值是分别受区间 (1 60) 和 (1 900) 限制的整数。
矩阵dX
和dT
是简单的距离矩阵,这意味着它们包含点之间的成对距离。即dx(i,j)
等于abs( x(i) - x(j) )
。
它们的计算方法是:dx = pdist(x);
矩阵w
可以被认为是一个权重矩阵,描述了一个点对另一个点的影响程度。
计算w_prime(a,b)
的目的是确定X
维度中的a
和T
维度中的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的创造者一起生孩子 完美!这正是我想要的!以上是关于如何优化此索引算法的主要内容,如果未能解决你的问题,请参考以下文章