我有一个复杂的索引问题,我正在努力以有效的方式解决。
目标是使用来自同等大小的矩阵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
索引,另存为indY
dX
索引,另存为indX
indY
和indX
的交集,另存为ind
mean( w(ind) )
保存到w_prime(1,1)
我有两个向量X
和T
定义的设定点,两者都是1XN,其中N是~3000。另外,X和T的值分别是由间隔(160)和(1 900)限定的整数。
矩阵dX
和dT
只是距离矩阵,意味着它们包含点之间的成对距离。即dx(i,j)
等于abs( x(i) - x(j) )
。
使用以下代码计算:dx = pdist(x);
矩阵w
可以被认为是一个权重矩阵,描述了一个点对另一个点的影响程度。
计算w_prime(a,b)
的目的是确定a
维度中X
和b
之间的T
分隔的子集之间的平均权重{{1}}尺寸。
这可以表示如下:
答案 0 :(得分:6)
使用ACCUMARRAY:
这很简单nx = max(dX(:));
ny = max(dY(:));
w_prime = accumarray([dX(:),dY(:)],w(:),[nx,ny],@mean,NaN)
输出将是nx
- by - ny
大小的数组,其中NaNs没有相应的索引对。如果您确定将始终存在完整的索引,则可以将上述计算简化为
w_prime = accumarray([dX(:),dY(:)],w(:),[],@mean)
那么,accumarray做了什么?它查看[dX(:),dY(:)]
行。每行在(i,j)
中提供行所贡献的w_prime
坐标对。对于所有对(1,1)
,它将函数(@mean
)应用于w(:)
中的相应条目,并将输出写入w_prime(1,1)
。