在Matlab中查找三维数组最小值的位置

3

很抱歉问一个如此简单和愚蠢的问题,但是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

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

2个回答

3
你可以使用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(:) 一起使用。这是正确的做法。 - Jeff Irwin

2

您说得对,这比应该的要复杂得多。问题在于MATLAB硬编码了矩阵(即二维数组)而不是通用秩的数组。下面是解决方案:

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 的形状将该单个索引转换为三个索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接