首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化这个索引算法?

如何优化这个索引算法?
EN

Stack Overflow用户
提问于 2012-09-12 15:53:14
回答 1查看 257关注 0票数 13

我的问题

  • 我能加快计算速度吗?
  • 是否有更好的算法或实现可以用来计算相同的值?

描述算法

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

目标是使用相同大小的矩阵( w_primedYdX )中的值组合来计算矩阵dY

w_prime(i,j)的值计算为mean( w( indY & indX ) ),其中indYindX分别是dYdX的指数,分别等于ij

下面是一个简单的w_prime算法在matlab中的实现

代码语言:javascript
复制
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只是距离矩阵,这意味着它们包含点之间的成对距离。Ie dx(i,j)等于abs( x(i) - x(j) )

它们是使用:dx = pdist(x);计算的。

矩阵w可以认为是一个权重矩阵,它描述了一个点对另一个点有多大的影响。

计算w_prime(a,b)的目的是确定aX维数中与bT维数中分离的点子集之间的平均权重。

这可以表示如下:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-12 16:37:01

这在阿库马雷中是很简单的

代码语言:javascript
复制
nx = max(dX(:));
ny = max(dY(:));

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

输出将是一个nx-by-ny大小的数组,在没有对应的索引的地方使用NaNs。如果您确信任何时候都会有完整的索引,则可以将上述计算简化为

代码语言:javascript
复制
w_prime = accumarray([dX(:),dY(:)],w(:),[],@mean)

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12392061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档