Столбцовое удаление первых из двоичной матрицы. MATLAB
У меня есть некоторая двоичная матрица. Я хочу удалить все первые из каждого столбца, но сохранить one
если это значение одно в столбце. У меня есть некоторый код, который дает правильный результат, но выглядит уродливо - я должен перебрать все столбцы.
Не могли бы вы дать мне совет, как улучшить мой код?
Не векторизованный код:
% Dummy matrix for SE
M = 10^3;
N = 10^2;
ExampleMatrix = (rand(M,N)>0.9);
ExampleMatrix1=ExampleMatrix;
% Iterate columns
for iColumn = 1:size(ExampleMatrix,2)
idx = find(ExampleMatrix(:,iColumn)); % all nonzeroes elements
if numel(idx) > 1
% remove all ones except first
ExampleMatrix(idx(1),iColumn) = 0;
end
end
1 ответ
Решение
Я думаю, что это делает то, что вы хотите:
ind_col = find(sum(ExampleMatrix, 1)>1); % index of relevant columns
[~, ind_row] = max(ExampleMatrix(:,ind_col), [], 1); % index of first max of each column
ExampleMatrix(ind_row + (ind_col-1)*size(ExampleMatrix,1)) = 0; % linear indexing
Код использует:
- тот факт, что второй выход
max
дает индекс первого максимального значения. В этом случаеmax
применяется вдоль первого измерения, чтобы найти первый максимум каждого столбца; - линейная индексация.