Borrar filtros
Borrar filtros

How to delete specific cells according to the condition from cell array?

14 visualizaciones (últimos 30 días)
I have a cell array test (4x189).
Each cell is a double array of different sizes. I want to delete all the cells, that look like this (basically, they are all 7x4, the same looking, but different numbers):
NaN 1 0.437500000000000 0
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN 8 NaN NaN
NaN 719 NaN NaN
NaN 719 NaN NaN
NaN NaN NaN NaN
Could you, please, help me to do that?
Thank you so much!
  3 comentarios
CheshireM
CheshireM el 23 de Sept. de 2021
Editada: CheshireM el 23 de Sept. de 2021
Did you mean that all "bad" arrays are 7x4, and all "good" arrays are a different size?
Yes, that's correct! And they also have something else in common: B6 = B7. (values in second column and 6th and 7th row are equal, here 719=719).
I would like to "move" the next cell, to this place, and add the empty array at the end to keep the same size of cell array.
CheshireM
CheshireM el 23 de Sept. de 2021
Basically, I am trying to solve the problem of removing sheets from Excel file that satisfy specific condition (B6=B7).

Iniciar sesión para comentar.

Respuesta aceptada

the cyclist
the cyclist el 24 de Sept. de 2021
This line of code will identify the cell locations that have a 7x4 array, having those two elements equal:
deleteIdx = cellfun(@(x)(x(5,2)==x(6,2))&&all(size(x)==[7,4]),test);
It's still not perfectly clear to me what you prefer as output, but maybe this is good enough.
  6 comentarios
CheshireM
CheshireM el 29 de Sept. de 2021
output(1:sum(keepIdx(:))) = test(keepIdx)
Unfortunately, this one is not saving the structure of cell array test.
If my array test is 4 by 189, I still would like to have a cell array with 4 rows, but less columns (let's say if in the first row I removed 2 columns, in the second row - 10 columns, in the third - 50 columns and in the forth - nothing, as a result I want to get an array of 4 by 189, but in the first row it will be 187 not empty elements and 2 NAN, in the third row - already 149 not empty elements).
the cyclist
the cyclist el 29 de Sept. de 2021
Did you do the preallocation step?
output = cell(size(test));
Also, you said you wanted empty cells, but now you say you want NaN. Which is it?
Can you upload your 4x189 array, to work on directly?

Iniciar sesión para comentar.

Más respuestas (1)

Chunru
Chunru el 24 de Sept. de 2021
If you want to keep the output as a cell array (as the input), you cannot delete them, but you can assign them to empty array.
for j=1:189
for i=1:4
if all(size(test{i,j})==[7 4]) && test{i,j}(5,2)==test{i,j}(6,2)
test{i,j} = [];
end
end
end

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Productos


Versión

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by