Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何从一个大矩阵中获取满足某些条件的所有行?_Performance_Matlab_If Statement_For Loop_Matrix - Fatal编程技术网

Performance 如何从一个大矩阵中获取满足某些条件的所有行?

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_中心)

我有一个大矩阵(大约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_中心)

…但在我的应用程序中,此循环必须运行大约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好建议(再次!)。看到了吗?没那么糟糕