bcf
bcf

Reputation: 2134

Assign to subset of cell array - MATLAB

I'm trying to assign a cell array to a subset of another cell array, like

data_date1 = '08/15/2003';
data_date2 = '08/16/2003';
data_date3 = '08/17/2003';
num1 = 56;
num2 = 23;
num3 = 2;

cell_1={data_date1, num1; data_date2, num2};

array=cell(3,1)

array{1:2} = cell_1  % problem line
array{3} = {data_date3, num3}

For context, the cell_1 array is the output of another function, and I'm trying to fill array in a loop in another function.

What's the proper method for this?

Upvotes: 0

Views: 1494

Answers (2)

Hoki
Hoki

Reputation: 11792

To copy cell array elements from one cell array to another without having to access the content of the element you can use the standard matrix indexing syntax, which uses the brackets (i,j) instead of the curly braces {i,j}.

let M be a cell array: M(i,j) return a 1x1 cell, copy of the (i,j) element of M M{i,j} return the content of the (i,j)th element of M. This could be of any type, depending on what the cell content was.

Cell array as a standard array

So in your case you can assign subarray to a larger array, but you just have to watch your indexing (the size in all dimensions should be correct).

So if you declare a 3x2 cell array:

array=cell(3,2)

Then you can assign your 2x2 sub array to it, if you have the address right:

>> array(1:2,:) = cell_1

array = 
    '08/15/2003'    [56]
    '08/16/2003'    [23]
              []      []

And then add your last elements:

>> array(3,:) = {data_date3, num3}

array = 
    '08/15/2003'    [56]
    '08/16/2003'    [23]
    '08/17/2003'    [ 2]

This way treat your array like an nxm standard array, just consider the cell type like a specific type (like you would have double or uint8 array) without having to know the type of the data they contain inside.

Nested Cell array

Cell array have this capacity to be nested. So a single cell of a cell array could contain another whole cell array (where each cell could contain cell array etc ... although I wouldn't recommend nesting too deep).

In this configuration, you final array could be as you defined it, a 3x1 cell array, where each cell would contain another 1x2 cell array. You can also assign subarray to this type, but again the sizes of source and destinations have to match. So if you prefer this form, you would have to define your cell_1 slightly differently:

>> cell_1= { {data_date1, num1} ; { data_date2, num2} }

cell_1 = 
    {1x2 cell}
    {1x2 cell}

Note the nesting of cell array into the larger cell array, in order to have a 1x2 subarray, which you can now assign to your main array:

>> array=cell(3,1) ;
array(1:2) = cell_1
array = 
    {1x2 cell}
    {1x2 cell}
    []

Now to add the last element you have two different ways but you need to be careful:

array(3) = { {data_date3, num3} } %// assign a 1x2 sub array to the 3rd element of "array"
array{3} = {data_date3, num3}     %// set the content of the 3rd element of "array" as a 1x2 cell array

These two lines are equivalent, they produce the same result. You can do either or, depending on the style you prefer (or may be forced by the shape your data are coming in).

Upvotes: 4

scmg
scmg

Reputation: 1894

There is error is because you cannot use indexing with cell array like that. Either you must do like:

array{1} = cell_1;
array{2} = cell_1;
array{3} = {data_date3, num3};

or you can try repmat (no need initialization array = cell(3,1)), though I don't know how long is your array:

array = repmat({cell_1}, 2, 1);    
% or: array = {cell_1; cell_1}
array{3} = {data_date3, num3};

Another way if array is short:

array = {cell_1; cell_1; {data_date3, num3}};

Upvotes: 0

Related Questions