Matlab 获取到点集的最小坐标距离矩阵

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

我有一组像{(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, 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);