cell array expansion

12 ビュー (過去 30 日間)
Daniel Shub
Daniel Shub 2011 年 7 月 21 日
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.

採用された回答

Jan
Jan 2011 年 7 月 21 日
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.
  1 件のコメント
Daniel Shub
Daniel Shub 2011 年 8 月 6 日
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).

サインインしてコメントする。

その他の回答 (2 件)

Sean de Wolski
Sean de Wolski 2011 年 7 月 21 日
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!
  3 件のコメント
Sean de Wolski
Sean de Wolski 2011 年 7 月 21 日
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 2011 年 7 月 21 日
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{:}?

サインインしてコメントする。


Fangjun Jiang
Fangjun Jiang 2011 年 7 月 21 日
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{:}

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by