MATLAB Answers

Delete all rows in cell array based on value

28 views (last 30 days)
Jan Kielmann
Jan Kielmann on 22 Dec 2019
Commented: J. Alex Lee on 24 Dec 2019
I have a cell array A that contains multiple tables in the first column and add a vector (B) in the second column that shall indicate if a row is used or can be deleted.
A = {table(rand(3,2)); table(rand(3,2)); table(rand(3,2))};
B = {1; 0; 1};
C = horzcat(A,B);
I now have issues to delete all rows in cell array C that are indicated with a 0.
I have tried some proposed solutions for this kind of problem (deleting rows based on value) but could not find a working one for the specific problem.
Has someone an idea how to handle this issue?
Best regards!

  0 Comments

Sign in to comment.

Accepted Answer

J. Alex Lee
J. Alex Lee on 22 Dec 2019
Do you need the cell array C? Must B be a cell array? If not...
A = {table(rand(3,2)); table(rand(3,2)); table(rand(3,2))};
% make B a logical array
% B = {1; 0; 1};
B = ([1;0;1]);
% don't need C
% C = horzcat(A,B);
A(~B) = [];
If for whatever reason you need an inline solution once you have the cell array C
A = {table(rand(3,2)); table(rand(3,2)); table(rand(3,2))};
B = {1; 0; 1};
C = horzcat(A,B);
C(~C[{:,2}],:)=[]

  9 Comments

Show 6 older comments
J. Alex Lee
J. Alex Lee on 22 Dec 2019
It's my fault, I had a typo in the 2nd answer, sorry about that!
C(~[C{:,2}],:)=[]
This is just "undoing" the redundant cell-ification and horzcat of B onto A; just another way of saying what Image Analyst said above.
In more detail:
The FAQ above doesn't appear to succinctly cover what I was trying to do here. Multiple indexing of a cell array using curly braces returns multiple values, where as multiple indexing of a cell array using parantheses returns the subset of the cell array as another cell array
A = {table(rand(3,2)); table(rand(3,2)); table(rand(3,2))};
B = {1; 0; 1};
C = horzcat(A,B);
C(:,2)
returns
ans =
3×1 cell array
{[1]}
{[0]}
{[1]}
whereas
C{:,2}
returns
ans =
1
ans =
0
ans =
1
You can "catch" the multiple results of the latter by wrapping in square brackets, as if defining an array manually
[C{:,2}]
returns
ans =
1 0 1
Veronica Taurino
Veronica Taurino on 22 Dec 2019
Thank you Alex, I was going crazy moving those brackets around ahah neat solution, thank you, I am going to save it for later. Have a nice day
J. Alex Lee
J. Alex Lee on 24 Dec 2019
through browsing more on answers, I found this:
Actual documentation about what I was doing with [C{:,2}]

Sign in to comment.

More Answers (1)

Veronica Taurino
Veronica Taurino on 22 Dec 2019
A = {table(rand(3,2)); table(rand(3,2)); table(rand(3,2))};
B = {1; 0; 1};
C = horzcat(A,B);
D={};
ii=0;
jj=0;
for ii=1: size(C,1)
if C{ii,2}==1
jj=jj+1;
D{jj}=C{ii,1};
D=D';
end
end
Something like that?

  0 Comments

Sign in to comment.


Translated by