Performance 如何从一个大矩阵中获取满足某些条件的所有行?
我有一个大矩阵(大约1GB),其中每一行表示我在曲面上采样的点的(x,y)坐标及其z高度 如何获得距离(x,y)坐标小于某个欧几里德距离的所有点 目前我正在做一件可怕的事情:Performance 如何从一个大矩阵中获取满足某些条件的所有行?,performance,matlab,if-statement,for-loop,matrix,Performance,Matlab,If Statement,For Loop,Matrix,我有一个大矩阵(大约1GB),其中每一行表示我在曲面上采样的点的(x,y)坐标及其z高度 如何获得距离(x,y)坐标小于某个欧几里德距离的所有点 目前我正在做一件可怕的事情: %mtx_pointList是一个大型矩阵,每行包含一个样本:[x y z]。 %我们想得到(x,y)点小于d的所有样本 %远离向量:v_中心=[xy] mtx_区域样本=零(0,3); 对于k=1:长度(mtx_点列表(:,1)) if(norm(mtx_点列表(k[12])-v_中心)
%mtx_pointList是一个大型矩阵,每行包含一个样本:[x y z]。
%我们想得到(x,y)点小于d的所有样本
%远离向量:v_中心=[xy]
mtx_区域样本=零(0,3);
对于k=1:长度(mtx_点列表(:,1))
if(norm(mtx_点列表(k[12])-v_中心)
…但在我的应用程序中,此循环必须运行大约25万次
如何使其更快地完成相同的操作?使用(其默认选项为欧几里德距离):
ind=pdist2(mtx_点列表(:,[12]),v_中心)
如果矩阵太大,请将其划分为内存允许的尽可能多的行块,并在这些行块上循环。使用(默认选项为欧几里德距离):
ind=pdist2(mtx_点列表(:,[12]),v_中心)
如果矩阵太大,请将其划分为内存允许的尽可能多的行,并在这些行上循环。bsxfun
如果您没有pdist2
(统计工具箱),这里有一种使用bsxfun
计算距离的方法:
da = bsxfun(@minus,mtx_pointList(:,[1 2]),permute(v_center,[3 2 1]));
distances = sqrt(sum(da.^2,2));
然后找到符合您标准的点:
distThresh = 0.5; % for example
indsClose = distances < distThresh
result = mtx_pointList(indsClose,:);
在MATLAB代码中:
a = mtx_pointList(:,[1 2]); b = v_center;
aa = dot(a,a,2); bb = dot(b,b,2); ab=a*b.'; %' or sum(a.*a,2)
distances = sqrt(aa + bb - 2*ab); % bsxfun needed if b is more than one point
正如Luis Mendo指出的那样,如果针对distThresh^2
bsxfun设置阈值,则不需要sqrt
如果您没有pdist2
(统计工具箱),这里有一种使用bsxfun
计算距离的方法:
da = bsxfun(@minus,mtx_pointList(:,[1 2]),permute(v_center,[3 2 1]));
distances = sqrt(sum(da.^2,2));
然后找到符合您标准的点:
distThresh = 0.5; % for example
indsClose = distances < distThresh
result = mtx_pointList(indsClose,:);
在MATLAB代码中:
a = mtx_pointList(:,[1 2]); b = v_center;
aa = dot(a,a,2); bb = dot(b,b,2); ab=a*b.'; %' or sum(a.*a,2)
distances = sqrt(aa + bb - 2*ab); % bsxfun needed if b is more than one point
正如Luis Mendo指出的那样,如果您针对
distThresh^2
+1设置阈值,则删除sqrt
并与distThresh进行比较,则没有必要使用sqrt
^2@LuisMendo好建议(再次!)。看到了吗?没有那么糟糕:-P+1删除sqrt
并与distThresh进行比较会更加有效^2@LuisMendo好建议(再次!)。看到了吗?没那么糟糕