【问题标题】:Simplifying the use of meshgrid in Matlab简化Matlab中meshgrid的使用
【发布时间】:2012-02-28 14:05:04
【问题描述】:

背景

扩展 this 问题。我有一个点集合(在三轴系统中,因此使用 (x,y,z) 坐标),我想计算每个点之间的距离。

为此,我首先必须制作一个包含所有可能的点组合的矩阵(最好不要重复,以节省处理时间),然后计算所有距离。

问题

现在我正在尝试为此使用meshgrid,但它变得相当复杂。它变得越来越复杂,因为 (x,y,z) 坐标位于格式为:pointCoordinates[x,y,z,pointnumber]

的矩阵中

而且我不知道如何告诉meshgrid 仅将点 1 和点 2 等结合起来,而不将所有单独的 x 坐标与所有单独的 y 坐标等结合起来(至太多的组合,其中大部分是无用的)。

问题

如何防止 meshgrid 产生多余的坐标组合?或者有更简单的方法吗?


我想我可以将pointCoordinates 矩阵重新格式化为一个简单的字符串数组points(与坐标一样多的条目)。其中条目一是(1,3,5),条目二是(2,4,2)等。从而将坐标保持在一起,并限制可能的组合数量。但这似乎是多余的。

【问题讨论】:

    标签: matlab image-processing geometry


    【解决方案1】:

    确实有更简单的方法。如果只想计算非冗余点,可以使用pdist。请注意,您可以选择与欧几里得不同的距离度量。

    distances = pdist(pointCoordinates(:,1:3));
    

    来自帮助:

    输出D按照((2,1),(3,1),...,(m,1),(3,2),...(m,2)的顺序排列, .....(m,m–1)),即按列顺序排列的完整 m×m 距离矩阵的左下三角形。要获得第 i 个和第 j 个观测值之间的距离 (i

    【讨论】:

    • @Andrey:但无论如何你应该拥有它 :)
    • @Jonas,抱歉没听懂 O_o
    【解决方案2】:

    您可以为 xyz 创建 3 个网格。

     x = pointCoordinates(:,1);
     y = pointCoordinates(:,2);
     z = pointCoordinates(:,3);
    
     [X1,X2] = meshgrid(x,x);
     [Y1,Y2] = meshgrid(y,y);
     [Z1,Z2] = meshgrid(z,z);
    

    然后计算每一个的距离:

     (X1-X2).^2 + (Y1-Y2).^2 + (Z1-Z2).^2;
    

    现在,你需要提取下对角线部分,因为有重复。

    【讨论】:

    • 是的,也许通过将下对角线(和对角线本身)乘以零,然后以某种方式过滤掉这些值?
    • @Samuel,是的,最好使用 NaN。我相信你可以想办法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多