# Delete all rows in cell array based on value

28 views (last 30 days)
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!

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}],:)=[]

J. Alex Lee on 22 Dec 2019
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
{}
{}
{}
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 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 on 24 Dec 2019
through browsing more on answers, I found this:
Actual documentation about what I was doing with [C{:,2}]

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?