Append element to a cell

I am trying to loop over a cell array S and see if S{i,3} is equal to a j than add the elements of S{i,2} to X{j,1}
j = 1;
X = {};
while j < 29
X{j,1} = j;
for i = 1:length(S)
if S{i,3} == j
for k = 1:length(S{i,2})
X{j,2} =[X{j,2}, S{i,2}(k,1)];
end
end
end
j = j+1;
end
I get Index exceeds matrix dimensions for line 13.
Here is the cell array S:
And S{i,2} looks like this:

Answers (2)

Guillaume
Guillaume on 9 Jul 2018
Index exceeds matrix dimensions
Well, then considering that the only indexing is of your cell array, either it doesn't have two columns or it doesn't have i rows. In any case, X{i, 2} is not valid. If X{i, 2} were valid your syntax is indeed correct.

1 Comment

I edited my question. Actually the indexing of my cell array is not the only one

Sign in to comment.

The message means, that X does not have either i rows or not 2 columns. You can check this easily using the debugger. Type this in the command window:
dbstop if error
Run the code again until stops at the error. Then check:
size(X)

4 Comments

I get [1,1] for the size
Actually if I run this
j = 1;
X = {};
while j < 29
X{j,1}=j;
for i = 1:length(S)
if S{i,3} == j
for k = 1:length(S{i,2})
X{j,2} = S{i,2}(k,1);
end
end
end
j = j+1;
end
Without trying to save what's in X{j,2} I get a cell array with 28 rows (which is what I want) it's just not saving what's in X{j,2} and append the S{i,2}(k,1) to the end of it
Jan
Jan on 9 Jul 2018
Edited: Jan on 9 Jul 2018
This is not useful:
for k = 1:length(S{i,2})
X{j,2} = S{i,2}(k,1);
end
It overwrite X{j,2} in each iteration. Maybe you want:
x{j,2} = S{i,2}
or
x{j,2} = S{i,2}(:, 1)
without a loop.
NOTE: Using length is prone to bugs, because it replies the longest dimension. If you want to get the length of the first dimension, use:
size(S, 1)
A cleaned version of your code:
X = cell(29, 2); % Pre-allocate
For j = 1:29
X{j,1} = j;
for i = 1:size(S, 1)
if S{i,3} == j
X{j,2} = [X{i,2}, S{i,2}(:,1)];
end
end
end
The pre-allocation creates X{i, 2} implicitly as [].
Are you sure that [X{ i ,2}, S{i,2}(:,1)] is wanted, not j ?
Afaf Arfaoui
Afaf Arfaoui on 9 Jul 2018
Edited: Afaf Arfaoui on 9 Jul 2018
Thank you. You're right it's X{j,2}. But I want to append elementS in the same row in each iteration of j and not in different columns:

Sign in to comment.

Categories

Find more on Creating, Deleting, and Querying Graphics Objects in Help Center and File Exchange

Asked:

on 9 Jul 2018

Edited:

on 9 Jul 2018

Community Treasure Hunt

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

Start Hunting!