algorithm - 我该如何优化这个索引算法

标签 algorithm matlab indexing

我的问题

  • 有什么办法可以加快计算速度吗?
  • 是否有更好的算法或实现可用于计算相同的值?

描述算法

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

目标是计算矩阵 w_prime 使用来自大小相等的矩阵 wdY 的值的组合值>dX

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

下面是计算 w_prime 的算法在 matlab 中的简单实现:

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

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 的值是分别受区间 (1 60) 和 (1 900) 约束的整数。

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

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

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

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

这可以表示如下:

enter image description here

最佳答案

这很简单 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)

关于algorithm - 我该如何优化这个索引算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12392061/

相关文章:

matlab - 如何在 MATLAB 中找到矩阵中的特定元素?

function - 如何在 MATLAB 中得到 (-8)^0.333333 = -2?

postgresql - 为什么 postresql 不使用多列索引中的所有列?

javascript - 运行随机数并保持状态

python - 获取 O(1) 中总和最小的数的因子

matlab - MatLab 和 OpenCV 中的 rgb2lab 提供不同的结果

PostgreSQL 全文搜索索引

arrays - MongoDB 和数组上的覆盖索引可能吗?

java - 打印一个列表,按升序排列且没有重复,除了 2、3 或 5 之外没有其他质因数的正整数

python - 如何比较集群?