我正在尝试在MATLAB中编写一个脚本,找到二维数组的最小值的位置。我确定此阵列中只有1个最小值,因此在阵列中具有相同最小值的多个位置不是问题。我可以找到数组的最小值,但在30x30数组中,我想知道最小值所在的行和列。
答案 0 :(得分:28)
作为替代版本,将min组合以获得最小值并找到返回索引,如果您已经计算了最小值,则只需使用find。
>> a=magic(30);
>> [r,c]=find(a==min(min(a)))
r =
1
c =
8
或者,根据您希望如何使用位置信息,您可能希望使用逻辑数组来定义它,在这种情况下,逻辑寻址可用于为您提供真值表。
>> a=magic(30);
>> locn=(a==min(min(a)));
答案 1 :(得分:13)
您可以将矩阵重新整形为矢量,使用MIN找到最小值的索引,然后将此线性索引转换为矩阵索引:
>> x = randi(5, 5) x = 5 4 4 2 4 4 2 4 5 5 3 1 3 4 3 3 4 2 5 1 2 4 5 3 5 >> [value, index] = min(reshape(x, numel(x), 1)); >> [i,j] = ind2sub(size(x), index) i = 3 j = 2
答案 2 :(得分:7)
查看min函数的说明。它可以返回最小值以及索引。对于二维数组,只需调用它两次。
A = rand(30); % some matrix
[minColVal, minColIdx] = min(A);
[minRowVal, minRowIdx] = min(minColVal);
minVal = minRowVal;
minValIdx = [minColIdx(minRowIdx), minRowIdx];
编辑:@ b3的解决方案可能在计算上更优雅(更快,需要更少的临时空间)
答案 3 :(得分:0)
在向量的子集中查找最小值或最大值 - 如果A是向量,“lowerBound”和“upperBound”是向量的边界,您需要在其中找到最大(或最小)值,然后使用此命令 -
[Value,Index]=min(A(lowerBound:upperBound));
这将返回“Value”作为A(lowerBound)和A(uppedBound)中的最小值或最大值 “index”与“lowerBound”一样作为偏移量。因此,要查找绝对索引,需要在索引中添加“lowerBound”。
答案 4 :(得分:0)
使用内联函数的替代解决方案将起作用。
>> min_index = @(matrix) find(matrix == min(reshape(matrix, [1,numel(matrix)])));
>> a=magic(30);
>> [r,c]=min_index(a)
r =
1
c =
8