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

时间:2015-10-20 02:40:50

标签: matlab matrix indexing

很抱歉提出这么简单愚蠢的问题,但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 个答案:

答案 0 :(得分: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 :(得分: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的形状。