【问题标题】:Find the position of the minimal value of a three dimensional array in Matlab在matlab中找到一个三维数组的最小值的位置
【发布时间】:2015-10-20 02:40:50
【问题描述】:

很抱歉问了这么一个简单而愚蠢的问题,但是 Matlab 对我来说真的太难用了。我的问题是如何在Matlab中找到一个三维数组的最小值。

例如,假设我定义了一个三维数组

m=zeros(2,2,2);
m(1,2,2)=-2;

m 的最小值应该是-2,位于(1,2,2)。我可以通过

找到最小值
m0=min(min(min(m)));

但是当我通过使用找到它的位置时

[x y z]=find(m==m0);

它不返回x=1y=2z=2,而是返回x=1y=4z=1

如果有人能回答这个问题,我不胜感激!

【问题讨论】:

    标签: matlab matrix indexing


    【解决方案1】:

    您可以使用min 找到m 的最小索引,然后将其转换为xyz 坐标。 没有也需要使用find

    min 可以与多个输出参数一起使用以返回最小元素的索引。在这里,我还使用:m 的每个元素作为列向量返回。

    >> m=zeros(2,2,2);
    >> m(1,2,2)=-2;
    >> m(:)
    ans =
         0
         0
         0
         0
         0
         0
        -2
         0
    >> [~, ind] = min(m(:))
    ind =
         7
    

    现在我们有了索引,我们需要将其转换回xyz 坐标。这可以使用ind2sub 或手动手动完成。

    >> [x y z] = ind2sub(size(m), ind)
    x =
         1
    y =
         2
    z =
         2
    

    【讨论】:

    • +1 我知道min[val, ind] 版本,但我没想过将它与列向量m(:) 一起使用。这就是这样做的方法。
    【解决方案2】:

    你是对的。这比它应该的要复杂。问题是MATLAB 硬连线可以使用矩阵(即等级 2 的数组),而不是一般等级的数组。这是解决方案:

    m0 = min(m(:))
    [x y z] = ind2sub(size(m), find(m(:) == m0))
    

    解释:

    如果您输入help find,您可能会注意到您的原始代码使用的是[rows, cols, vals] 版本的find,这与您的预期不同。

    相反,min(m(:)) 是您的min(min(min(m))) 的简化版。它会自动将m 重新整形为一级数组(即向量)。

    表达式find(m(:) == m0) 返回一个单一索引,表示此重构向量中的最小位置。最后,ind2sub 将此单个索引转换为一组三个索引,给定m 的形状。

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 2017-02-13
      • 2014-11-04
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2018-04-18
      • 2023-03-31
      • 2015-10-09
      相关资源
      最近更新 更多