3

每个人。我有一个名为“数据”的 3 维数据点矩阵,其维度为 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”?非常感谢您提前。

4

1 回答 1

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)
于 2015-02-19T13:06:40.057 回答