Problem with cell array appending

14 Ansichten (letzte 30 Tage)
Jaya
Jaya am 16 Sep. 2021
Kommentiert: Stephen23 am 17 Sep. 2021
mycell is appended with cell arrays in three different areas of my code. Like below
mycell= { }
mycell= A(:,:,1) %1st time. A(:,:,1) is a 1*5 cell array
mycell= {mycell ; B(:,:,1) } %2nd time. B(:,:,1) is a 1*5 cell array
mycell= {mycell ; C(:,:,1) } %3rd time. C(:,:,1) is a 1*5 cell array
1st time output is OK: mycell is a cellarray of 1*5.
2nd time output is also OK: mycell is a 2*1 cell array with each element of 1*5 size.
BUT 3rd time output: mycell is still a 2*1 cell array as below. Why? Why do the previous two elements form as a single element in this third time? Can someone tell me how do I avoid this?
%the output I get after 3rd time line
mycell =
2×1 cell array
{2×1 cell}
{1×5 cell}
% but the output I want is something like.
{1×5 cell}
{1×5 cell}
{1×5 cell}
  1 Kommentar
Stephen23
Stephen23 am 17 Sep. 2021
Note the difference:
  • {} curly braces creates a cell array, where the inputs are nested inside the new cell array.
  • [] square brackets are a concatenation operator. These are used to concatenate any array type.
So if you want to nest cell arrays inside other cell arrays, then use curly braces. But if you want to concatenate any arrays together, use square brackets (or the operators CAT, HORZCAT, VERTCAT).

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Star Strider
Star Strider am 16 Sep. 2021
Assigning is likely a more efficient approach than concatenation —
A(:,:,1) = randn(1,5);
B(:,:,1) = randn(1,5);
C(:,:,1) = randn(1,5);
mycell{1,:}= A(:,:,1) %1st time. A(:,:,1) is a 1*5 cell array
mycell = 1×1 cell array
{[0.4460 0.5237 0.2281 0.4874 -1.1267]}
mycell{2,:}= B(:,:,1) %2nd time. B(:,:,1) is a 1*5 cell array
mycell = 2×1 cell array
{[ 0.4460 0.5237 0.2281 0.4874 -1.1267]} {[-1.9246 1.0601 0.0070 -0.5618 -0.8078]}
mycell{3,:}= C(:,:,1) %3rd time. C(:,:,1) is a 1*5 cell array
mycell = 3×1 cell array
{[ 0.4460 0.5237 0.2281 0.4874 -1.1267]} {[-1.9246 1.0601 0.0070 -0.5618 -0.8078]} {[ 0.7868 0.1859 0.6091 1.0478 -0.2925]}
This also allows for preallocation, that can significantly improve code efficiency.
The cell concatenation approach creates ‘cells-of-cells’, making the interpretation more difficult. The MATLAB concatenation operator are the square brackets [] so using them will produce the correct result —
mycell2 = { }
mycell2 = 0×0 empty cell array
mycell2 = {A(:,:,1)} %1st time. A(:,:,1) is a 1*5 cell array
mycell2 = 1×1 cell array
{[0.4460 0.5237 0.2281 0.4874 -1.1267]}
mycell2 = [mycell2 ; {B(:,:,1)} ] %2nd time. B(:,:,1) is a 1*5 cell array
mycell2 = 2×1 cell array
{[ 0.4460 0.5237 0.2281 0.4874 -1.1267]} {[-1.9246 1.0601 0.0070 -0.5618 -0.8078]}
mycell2 = [mycell2 ; {C(:,:,1)} ] %3rd time. C(:,:,1) is a 1*5 cell array
mycell2 = 3×1 cell array
{[ 0.4460 0.5237 0.2281 0.4874 -1.1267]} {[-1.9246 1.0601 0.0070 -0.5618 -0.8078]} {[ 0.7868 0.1859 0.6091 1.0478 -0.2925]}
This is less efficient than the indexing approach, because it precludes preallocation.
Experiment to get different results.
.
  2 Kommentare
Jaya
Jaya am 16 Sep. 2021
Thanks a lot. This solution has made my code interpretation so much easier.
Star Strider
Star Strider am 16 Sep. 2021
As always, my pleasure!
.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Multidimensional Arrays finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by