Нахождение элемента max в столбце матрицы, исключая определенные строки - PullRequest
0 голосов
/ 08 марта 2020

Считайте, что у меня есть матрица nxn. Моя цель - найти элемент max в первом столбце, поменять местами строку, содержащую этот самый большой элемент, и первую строку. Затем я хочу найти элемент max во втором столбце, исключая первую строку, а затем поменять местами строку этого нового элемента max и вторую строку. Опять же, находя элемент max в j-м столбце, исключая строки 1: j-1, затем меняя местами строку max-элемента с j-й строкой, вплоть до n-1-го столбца (как и во время n-го столбца, я мог бы выбрать только из n-го ряда). Моя текущая настройка для этого выглядит следующим образом:

for j = 1:n-1
   [~,row]=max(A(j:n,j));
   temp = A(row,:);
   A(row,:)=A(j,:);
   A(j,:)=temp;
   ...

Хотя функция переключения работает достаточно хорошо, [~, row]=max(A(j:n,j)) может и последовательно делает для матрицы, над которой я специально работаю, выводить строку 1 во время вторая итерация j. Мой мыслительный процесс был следующим: j: n представляет строки, которые мы хотим проверить. Отмечая j = 2, для его второй итерации я надеялся, что это будет искать строку 2-n-n; однако, кажется, все еще проверяют каждую строку.

Хотя этот вопрос уже задавался, я обнаружил, что ответом была та же строка кода.

1 Ответ

2 голосов
/ 08 марта 2020

Вы используете [~,row]=max(A(j:n,j));. Допустим, вы находитесь в итерации j = 2. Макс будет рассматривать только вход из 2-й строки. Возвращаемое значение строки = 1 указывает на максимум во второй строке A. Первая строка, которую вы поместили в функцию. Функция max не имеет ни малейшего понятия, что вы на самом деле вводите что-то большее. Вы должны исправить это.

n=5
A=magic(n); %just some input data

for j = 1:n-1
   [~,row]=max(A(j:n,j));
   row=row+j-1;
   temp = A(row,:);
   A(row,:)=A(j,:);
   A(j,:)=temp; 
end

Кстати, Matlab может выполнять обмен строк без вспомогательной переменной:

for j = 1:n-1
   [~,row]=max(A(j:n,j));
   row=row+j-1;
   A([row,j],:)=A([j,row],:); 
end
...