从二进制矩阵中逐列删除第一个。软件
Columnwise removal of first ones from binary matrix. 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
我认为这符合您的要求:
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
沿第一个维度应用,以找到每列的第一个最大值;
- linear indexing.
我有一些二进制矩阵。我想从每列中删除所有第一个,但如果该值在列中单独存在,则保留 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
我认为这符合您的要求:
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
沿第一个维度应用,以找到每列的第一个最大值; - linear indexing.