Performance 是否有一种从squareform获取索引的更快/更紧凑的方法?(Matlab)

Performance 是否有一种从squareform获取索引的更快/更紧凑的方法?(Matlab),performance,matlab,matrix,pdist,Performance,Matlab,Matrix,Pdist,各位。 我有一个称为“数据”的三维数据点矩阵,它的维数为N*3。现在,我试图得到两个值: 首先,距离矩阵“Dist”的索引“m”和“n”,其中 以致 [m,n] = find( Dist<=rc & Dist>0 ); [m,n]=find(Dist0); 其中,“rc”是某个截止距离,“m”是行索引,“n”是列索引 第二,条件距离“condit”,其中 condit=data(pdist(data)0); 此代码适用于小尺寸的“数据”(其中N25000),此过程需要太

各位。 我有一个称为“数据”的三维数据点矩阵,它的维数为N*3。现在,我试图得到两个值:

首先,距离矩阵“Dist”的索引“m”和“n”,其中

以致

[m,n] = find( Dist<=rc & Dist>0 );
[m,n]=find(Dist0);
其中,“rc”是某个截止距离,“m”是行索引,“n”是列索引

第二,条件距离“condit”,其中

condit=data(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);
Dist=0(大小(数据,1));
Dist(tril(true(size(data,1)),-1))=pdist(data);
[m,n]=查找(距离0);
条件=距离(距离0);
在这里,我只计算了“squareform”命令的下三角边,以减少计算时间(或内存,我不知道MATLAB如何发现这段代码更简单)。然而,计算“Dist”变量似乎仍然需要大量的时间/内存

是否有一种更快/更少的内存消耗方式来计算“m”、“n”和“condit”?
非常感谢。这可能是一种方法-

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

pdist
不会两次计算每个距离。也就是说,它只计算较低的三角形
squareform
只需重新塑造并复制该三角形即可生成方形矩阵。您应该首先确定哪个花费了这么长的时间:
pdist
squareform
(可能是第一个)。感谢您的回复路易斯·门多。事实上,我认为squareform确实占用了很多时间,因此我使用Dist(tril(true(size(data,1)),-1))=pdist(data)更改了代码。然而,现在发现pdist占用了大量的时间/内存。您正在执行集群吗?在某些情况下,如果使用AABB树、八叉树、kd树等,您可能不需要计算所有成对距离……您有机会测试此处发布的解决方案吗?感谢您的回复,knedlsepp。老实说,我不确定这是不是聚类分析。。。我查看了你发给我的链接,但是有很多聚类分析。。。我想我可能得多看看。非常感谢你!谢谢你的回答,迪瓦卡。我真的试过了,而且速度更快了!以前需要1.36秒,现在只需要0.6秒!(这个时间尺度是基于试验数据集的,它只有N<3000)但是我有一个问题。condit变量的值与以前的方法和新引入的方法略有不同。我猜这可能是因为sqrt方程。有办法解决这个问题吗?@JimC有办法!差别有多大
max
这两个结果之间的差异可能会告诉您,最大差异为3.4435e-12,标准偏差值为2.7056e-13。这些差异似乎很小,可以忽略,但是,我希望新的方法能够提供与前一种方法相同的答案。@JimC这将在那里!这些是浮点运算的局限性!是的,我想是的。谢谢你的回答!
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);
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))
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)