13

我的问题

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

描述算法

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

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

的值w_prime(i,j)计算为mean( w( indY & indX ) ),其中indYindX是 和 的索引dYdX分别等于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

性能问题

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

示例计算

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

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

在此处输入图像描述

  • 查找交集indYindX另存为ind

在此处输入图像描述

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

在此处输入图像描述

一般问题描述

我有一个由两个向量X和定义的设定点T,两者都是 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)分隔的点的子集之间的平均权重。aXbT

这可以表示如下:

在此处输入图像描述

4

1 回答 1

6

使用ACCUMARRAY很简单:

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

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

输出将是一个带有nxNaN的按ny大小排列的数组,只要没有相应的索引对。如果您确定始终会有完整的索引,则可以将上述计算简化为

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

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

于 2012-09-12T16:37:01.967 回答