Remove column in matrix

3 次查看(过去 30 天)
I would like to remove rows and columns which are empty (contains more zeros than value) : for example
A=[0 0 0 0; 0 1 2 0; 8 5 8 2;5 8 2 7;0 1 0 0; 0 0 0 0]
to give output as
B=[5 8; 8 2]

采纳的回答

Walter Roberson
Walter Roberson 2018-3-22
nz = logical(A);
B = A(sum(nz,2) >= size(A,2)/2, sum(nz) >= size(A,1)/2);
You will notice this gives a 3 x 2 array, not a 2 x 2 array. The row 0 1 2 0 does not have more 0 than values, so it needs to be kept.
If you change the rules to say that you are not to keep something unless the number of values exceeds 1/2 of the possible, then you need to eliminate the third column of A, [0; 2; 8; 2; 0; 0] because in that case 3 entries out of 6 are populated and 3 does not exceed (6/2)
  6 个评论
Walter Roberson
Walter Roberson 2018-3-22
wanted_cols = find(sum(nz) >= size(A,1)/2);

请先登录,再进行评论。

更多回答(1 个)

Image Analyst
Image Analyst 2018-3-22
Here is one way:
A=[0 0 0 0; 0 1 2 0; 8 5 8 2;5 8 2 7;0 1 0 0; 0 0 0 0]
B=[5 8; 8 2]
[rows, columns] = size(A)
% Count the number of zeros in each row.
zerosPerRow = sum(A == 0, 2)
% Count the number of zeros in each column.
zerosPerColumn = sum(A == 0, 1)
% Determine which rows and columns to keep
rowsToKeep = zerosPerRow <= columns/2
columnsToKeep = zerosPerColumn <= rows/2
% Extract the rows and columns that we want:
B = A(rowsToKeep, columnsToKeep)
It's fairly explicit, with lots of comments, so that you can easily understand it and see all the steps. If you want a more compact, but more cryptic and harder to understand, one liner, then wait and I'm sure someone will post it.
  3 个评论
Swapnil Rane
Swapnil Rane 2018-3-22
Can I get the position of the four corner elements? where the matrix was extracted from.
Image Analyst
Image Analyst 2018-3-22
topRow = find(rowsToKeep, 1, 'first');
bottomRow = find(rowsToKeep, 1, 'last');
leftColumn = find(columnsToKeep , 1, 'first');
rightColumn = find(columnsToKeep , 1, 'last');

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by