以下是示例:
我有以下矩阵:
4 0 3
5 2 6
9 4 8
现在,我想找到两个最小值,以及每行的索引。结果是:
row1: 0 , position (1,2) and 3, position (1,3)
row2...
row3....
我正在使用大量的循环,而且非常复杂。那么使用MATLAB函数实现我的目标的方法是什么?
我试过了,但没有结果:
C=min(my_matrix,[],2)
[C(1),I] = MIN(my_matrix(1,:)) &find the position of the minimum value in row 1??
答案 0 :(得分:4)
您可以按升序对矩阵的每一行进行排序,然后为每一行选择前两个索引,如下所示:
[A_sorted, I] = sort(A, 2);
val = A_sorted(:, 1:2)
idx = I(:, 1:2)
现在val
应包含每行中前两个最小元素的值,idx
应包含其列号。
如果您想以格式化的方式在屏幕上打印所有内容(如问题中所示),您可以使用强大的fprintf
命令:
rows = (1:size(A, 1))';
fprintf('row %d: %d, position (%d, %d) and %d, position (%d, %d)\n', ...
[rows - 1, val(:, 1), rows, idx(:, 1), val(:, 2), rows, idx(:, 2)]')
A = [4, 0, 3; 5, 2, 6; 9, 4, 8];
%// Find two smallest values in each row and their positions
[A_sorted, I] = sort(A, 2);
val = A_sorted(:, 1:2)
idx = I(:, 1:2)
%// Print the result
rows = (1:size(A, 1))';
fprintf('row %d: %d, position (%d, %d) and %d, position (%d, %d)\n', ...
[rows - 1, val(:, 1), rows, idx(:, 1), val(:, 2), rows, idx(:, 2)]')
结果是:
val =
0 3
2 5
4 8
idx =
2 3
2 1
2 3
,格式化输出为:
row 0: 0, position (1, 2) and 3, position (1, 3)
row 1: 2, position (2, 2) and 5, position (2, 1)
row 2: 4, position (3, 2) and 8, position (3, 3)
答案 1 :(得分:2)
您可以使用sort
轻松完成此操作。
[A_sorted, idx] = sort(A,2); % specify that you want to sort along rows instead of columns
idx
的列包含A
每行的最小值,第二列的索引为第二个最小值。
可以从A_sorted
答案 2 :(得分:1)
您可以执行以下操作,其中A
是您的矩阵。
[min1, sub1] = min(A, [], 2); % Gets the min element of each row
rowVec = [1:size(A,1)]'; % A column vector of row numbers to match sub1
ind1 = sub2ind(size(A), rowVec, sub1) % Gets indices of matrix A where mins are
A2 = A; % Copy of A
A2(ind1) = NaN; % Removes min elements of A
[min2, sub2] = min(A2, [], 2); % Gets your second min element of each row
min1
将是最小值的向量,min2
每行的第二个最小值的向量。它们各自的行索引将在sub1
和sub2
。