很抱歉提出这么简单愚蠢的问题,但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=1
,y=2
和z=2
,而是返回x=1
,y=4
和z=1
。
如果有人会回答这个问题我很感激!
答案 0 :(得分:3)
您可以使用min
查找m
的最小索引,然后将其转换为x
,y
和z
坐标。 没有还需要使用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
现在我们需要将索引转换回x
,y
和z
坐标。这可以使用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
的形状。