Borrar filtros
Borrar filtros

Remove column in matrix

2 visualizaciones (últimos 30 días)
Swapnil Rane
Swapnil Rane el 22 de Mzo. de 2018
Comentada: Image Analyst el 22 de Mzo. de 2018
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]

Respuesta aceptada

Walter Roberson
Walter Roberson el 22 de Mzo. de 2018
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 comentarios
Walter Roberson
Walter Roberson el 22 de Mzo. de 2018
wanted_cols = find(sum(nz) >= size(A,1)/2);
Swapnil Rane
Swapnil Rane el 22 de Mzo. de 2018
Thank you!

Iniciar sesión para comentar.

Más respuestas (1)

Image Analyst
Image Analyst el 22 de Mzo. de 2018
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 comentarios
Swapnil Rane
Swapnil Rane el 22 de Mzo. de 2018
Can I get the position of the four corner elements? where the matrix was extracted from.
Image Analyst
Image Analyst el 22 de Mzo. de 2018
topRow = find(rowsToKeep, 1, 'first');
bottomRow = find(rowsToKeep, 1, 'last');
leftColumn = find(columnsToKeep , 1, 'first');
rightColumn = find(columnsToKeep , 1, 'last');

Iniciar sesión para comentar.

Categorías

Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by