是否有更快/更紧凑的方法从平方形式获得指数? (Matlab的)

时间:2015-02-19 12:53:56

标签: performance matlab matrix pdist

大家。 我有一个名为“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”? 非常感谢你提前。

1 个答案:

答案 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)