Столбцовое удаление первых из двоичной матрицы. 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 применяется вдоль первого измерения, чтобы найти первый максимум каждого столбца;
  • линейная индексация.
Другие вопросы по тегам