大家。 我有一个名为“data”的三维数据点矩阵,其维数为N * 3。现在,我想获得两个值:
首先,距离矩阵“Dist”的索引“m”和“n”,其中
Dist = squareform(pdist(data));
这样
[m,n] = find( Dist<=rc & Dist>0 );
其中“rc”是某个截止距离,“m”是行索引,“n”是列索引。
其次,条件距离“ConDist”,其中
ConDist = data( pdist(data)<=rc & pdist(data)>0 );
此代码适用于小型“数据”(其中N <3500),但是,对于大型“数据”(N> 25000),此过程需要太多时间/内存。 因此,我尝试通过执行以下操作来最小化时间/内存:
Dist = zeros(size(data,1));
Dist(tril(true(size(data,1)),-1)) = pdist(data);
[m,n] = find(Dist <= rc & Dist > 0);
ConDist = Dist(Dist <= rc & Dist > 0);
在这里,我只计算了“squareform”命令的下三角形边以减少计算时间(或内存,我不知道MATLAB将如何更简单地找到此代码)。但是,似乎仍然需要花费大量时间/内存来计算“Dist”变量
是否会有更快/更少内存消耗的方式来计算“m”,“n”和“ConDist”? 非常感谢你提前。
答案 0 :(得分:0)
这可能是一种方法 -
N = size(data,1); %// datasize
%// Store transpose of data, as we need to use later on at several places
data_t = data.' %//'
%// Calculate squared distances with matrix multiplication based technique
sqdist = tril([-2*data data.^2 ones(N,3)]*[data_t ; ones(3,N) ; data_t.^2])
%// Logical array with size of distance array and ones that are above threshold
mask_dists = sqdist <= rc^2 & sqdist > 0
%// Indices & distances from distances array that satisfy thresholding criteria
[m,n] = find(mask_dists)
ConDist = sqrt(sqdist(mask_dists))
你可以在这里引入bsxfun
来替换tril
(保持其余部分不变),看看是否会加快它的速度 -
sqdist = [-2*data data.^2 ones(N,3)]*[data_t ; ones(3,N) ; data_t.^2]
mask_dists = sqdist <= rc^2 & sqdist > 0 & bsxfun(@ge,[1:N]',1:N)