MATLAB Answers

## cell array expansion

Asked by Daniel Shub

### Daniel Shub (view profile)

on 21 Jul 2011
Accepted Answer by Jan

### Jan (view profile)

I have just been bitten by some careless coding, but I am surprised that MATLAB lets me do it and that mlint didn't provide a warning. Why does MATLAB let you do this:
x = {1,2};
y = x{:};
what I wanted to do (and I am sure there are a number of other ways of doing it) was
y = [x{:}];
I can see the advantage of cell array expansion for referencing and parameter passing. For example,
z = magic(5);
z(x{:})
xy = {1:10, 0:9};
plot(xy{:});
Is there any reason for
y = x{:};
to be valid. I feel like it should return an error about the RHS returning more arguments than the LHS.

#### 0 Comments

Sign in to comment.

## 3 Answers

Answer by Jan

### Jan (view profile)

on 21 Jul 2011
Accepted Answer

This is the standard behaviour of Matlab:
x = {1, 2};
y = x{:}; % y is x{1}
You see the same method for:
a = rand(1, 10);
b = max(a);
Why is this equivalent? Because MAX replies 2 outputs as "x{:}" and if just the 1st is caught, the 2nd is ignored. Therefore these methods are equivalent also:
x = {1, 2};
[y1, y2] = x{:}
a = rand(1, 10);
[b1, b2] = max(a)
So I would not expect an MLint-warning for a standard behaviour.

Daniel Shub

### Daniel Shub (view profile)

on 6 Aug 2011
I think you explanation is the best, even if I don't fully agree. I see a difference if you consider max(a) and x{:} without semicolons (max returns one answer and x returns two).

Sign in to comment.

Answer by Sean de Wolski

### Sean de Wolski (view profile)

on 21 Jul 2011

One reason: For a function that takes varargin you can feed it all contents of a cell as a separate input.
x = {1,2,3,4}
cat(3,x{:})
Yes, it frustrates me some times too!

Daniel Shub

### Daniel Shub (view profile)

on 21 Jul 2011
Yes, I agree and this is basically what I pointed out in my plot(xy{:}) example. What I want to know is if y = x{:} is useful. If the only reason it is valid is so that f(x{:}) can work then I think mlint should provide a warning (and even better MATLAB should throw an error).
Sean de Wolski

### Sean de Wolski (view profile)

on 21 Jul 2011
I disagree; that functionality is quite useful. What if the cell contains different sized elements? Concatenating them as you have done will fail.
Daniel Shub

### Daniel Shub (view profile)

on 21 Jul 2011
I don't understand. Yes, x = {1, [1, 2]}; y = [x{:}]; will fail and y = x{:} won't fail, but why would you want y = x{:}?

Sign in to comment. ### Fangjun Jiang (view profile)

Answer by Fangjun Jiang

### Fangjun Jiang (view profile)

on 21 Jul 2011

Maybe one way to explain it is to treat it as the variable output argument. Like,
MaxValue=max(1:10);
[MaxValue,Index]=max(1:10);
You can do:
x={1,2};
y=x{:}
[a b]=x{:}

#### 0 Comments

Sign in to comment.