Matlab 获取到点集的最小坐标距离矩阵
我有一组像{(3,3),(3,4),(4,5),…}这样的点或坐标,我想建立一个到这个点集最小距离的矩阵。让我用一个可运行的示例来说明:Matlab 获取到点集的最小坐标距离矩阵,matlab,Matlab,我有一组像{(3,3),(3,4),(4,5),…}这样的点或坐标,我想建立一个到这个点集最小距离的矩阵。让我用一个可运行的示例来说明: width = 10; height = 10; % Get min distance to those points pts = [3 3; 3 4; 3 5; 2 4]; sumSPts = length(pts); % Helper to determine element coordinates [cols, rows] = meshgrid(1
width = 10;
height = 10;
% Get min distance to those points
pts = [3 3; 3 4; 3 5; 2 4];
sumSPts = length(pts);
% Helper to determine element coordinates
[cols, rows] = meshgrid(1:width, 1:height);
PtCoords = cat(3, rows, cols);
AllDistances = zeros(height, width,sumSPts);
% To get Roh_I of evry pt
for k = 1:sumSPts
% Get coordinates of current Scribble Point
currPt = pts(k,:);
% Get Row and Col diffs
RowDiff = PtCoords(:,:,1) - currPt(1);
ColDiff = PtCoords(:,:,2) - currPt(2);
AllDistances(:,:,k) = sqrt(RowDiff.^2 + ColDiff.^2);
end
MinDistances = min(AllDistances, [], 3);
这段代码运行得非常好,但我必须处理大约7亿个条目的矩阵大小(高度=700,宽度=500,sumSPts=2k),这会降低计算速度。有没有更好的算法来加快速度?如评论中所述,您不必将所有内容都放在一个巨大的矩阵中并处理巨大的矩阵。你可以: 1。将pts矩阵切成合理的小块(比如长度为100) 2。在切片上循环并计算这些点上的
Mindistances
切片
3。以全局最小值为例
运行时间为9.830051秒 注: 你不会做更少的计算。但是它对你的记忆强度要小得多(700M双倍需要45次内存),从而加快了这个过程(同时借助矢量化)
关于单态展开
bsxfun
的一大优点是,您不必向它提供值沿相同维度的矩阵
例如:
假设我有两个向量X
和Y
定义为:
X=[1 2]; % row vector X
Y=[1;2]; % Column vector Y
我想要一个
2x2
矩阵Z
构建为Z(I,j)=X(I)+Y(j)
用于1检查diff函数-如果您有图像处理工具箱,它可能会帮到您。有7亿个点,任何解决方案都会很慢。实际上,你不必处理有7亿个条目的矩阵。你可以切片你的pts向量,保留切片的最小值,然后取全局最小值。处理时间~20秒对你有好处吗?谢谢你的帖子!该解决方案做得很好,但当Np/SliceSize不是整数时(计算中忽略了点)会失败。长度(SliceIndexes)bsxfun
不仅仅是这样做的,它还通过使用单例扩展摆脱了对repmat的调用。我正在修改我的答案。我正在修改我的答案,并对单例扩展做一些解释
X=[1 2]; % row vector X
Y=[1;2]; % Column vector Y
Xs=repmat(X,2,1);
Ys=repmat(Y,1,2);
Z=Xs+Ys;
Z=bsxfun(@plus,X,Y);