Вопрос:
Вот пример:
У меня есть следующая матрица:
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?? Лучший ответ:
Вы можете сортировать каждую строку своей матрицы в порядке возрастания, а затем выбирать первые два индекса для каждой строки, например:
[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
Вы можете легко сделать это, используя sort.
[A_sorted, idx] = sort(A,2); % specify that you want to sort along rows instead of columns
Столбец idx содержит минимальное значение для каждой строки A, а второй столбец имеет индекс второго наименьшего значения.
Минимальные значения можно получить из A_sorted
Ответ №2
Вы можете сделать что-то вроде ниже, где 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.