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]

 采纳的回答

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 个评论

That won't be a problem, the matrix i'm working is huge in size Thank you for the answer
Can I get the position of the four corner elements? where the matrix was extracted from.
nz = logical(A);
wanted_rows = find(sum(nz,2) >= size(A,2)/2);
wanted_cols = sum(nz) >= size(A,1)/2;
B = A(wanted_rows, wanted_cols);
You could look at min(wanted_rows), max(wanted_rows) and min(wanted_cols) and max(wanted_cols), but doing so would imply that the selected items were consecutive, which is not something that your original question permits us to assume.
Swapnil Rane
Swapnil Rane 2018-3-22
编辑:Swapnil Rane 2018-3-22
The matrix, I'm working on is 190*97, So, I just need the four corner points..... min(wanted cols) and max(wanted_cols) give logical variable. I'm confused.
wanted_cols = find(sum(nz) >= size(A,1)/2);

请先登录,再进行评论。

更多回答(1 个)

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 个评论

WORKS FINE THANK YOU
Can I get the position of the four corner elements? where the matrix was extracted from.
topRow = find(rowsToKeep, 1, 'first');
bottomRow = find(rowsToKeep, 1, 'last');
leftColumn = find(columnsToKeep , 1, 'first');
rightColumn = find(columnsToKeep , 1, 'last');

请先登录,再进行评论。

类别

帮助中心File Exchange 中查找有关 Logical 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by