Comma-separated assignment to a table variable

The code below tests assignment by comma-separated expansion to a cell array in 3 different scenarios. In the specific case when the cell array X is the variable of a table, it fails. Why is that?
X=cell(1,3);
S.X=X;
T=table(X);
[X{:}]=deal(1,2,3) %Case (1) : works fine
X = 1×3 cell array
{[1]} {[2]} {[3]}
[S.X{:}]=deal(1,2,3) %Case (2) : works fine
S = struct with fields:
X: {[1] [2] [3]}
[T.X{:}]=deal(1,2,3) %Case (3) : fails
Error using deal (line 37)
The number of outputs should match the number of inputs.

4 Comments

Table overloads both subsref and subsasgn. Its indexing is nothing like any other class.
Why does the second call to deal result in three copies of the same displayed output?
X = cell(1,3);
T = table(X);
[X{:}] = deal(1,2,3)
X = 1×3 cell array
{[1]} {[2]} {[3]}
[T.X{1},T.X{2},T.X{3}] = deal(1,2,3)
T = table
X _______________________ {[1]} {[2]} {[3]}
T = table
X _______________________ {[1]} {[2]} {[3]}
T = table
X _______________________ {[1]} {[2]} {[3]}
Table overloads both subsref and subsasgn.
Does that explain why comma-separated assignment would not be supported?
Why does the second call to deal result in three copies of the same displayed output?
@Paul It is normal for unsuppressed output of CSL assignment to make nargout displays if it thinks the outputs are separate and unrelated variables, e.g.,
[a,b]=deal(1,2)
a = 1
b = 2
When you assign to separately indexed regions of the same variable, it apparently cannot tell they are related,
[X{1},X{2}] = deal(4,5)
X = 1×2 cell array
{[4]} {[5]}
X = 1×2 cell array
{[4]} {[5]}
as distinct from,
[X{1:2}]=deal(6,7)
X = 1×2 cell array
{[6]} {[7]}

Sign in to comment.

Answers (1)

dpb
dpb about 1 hour ago
Edited: dpb about 1 hour ago
As @Stephen23 notes, table addressing is its own animal...
The table is a one-row cell array in one vairable so it can be assigned directly as a cell can be...
X=cell(1,3);
T=table(X)
T = table
X ____________________________________________ {0×0 double} {0×0 double} {0×0 double}
T.X={1 2 3}
T = table
X _______________________ {[1]} {[2]} {[3]}
No need for deal() here as the dot-X notation returns the cell array in its entirety. Of course, in a table cell, it can contain anything any other cell can
T.X(1:2)={1 2};
T.X(3)={'Fred Flintstone'}
T = table
X _____________________________________ {[1]} {[2]} {'Fred Flintstone'}
T.X
ans = 1×3 cell array
{[1]} {[2]} {'Fred Flintstone'}

Products

Release

R2024b

Asked:

about 5 hours ago

Edited:

about 2 hours ago

Community Treasure Hunt

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

Start Hunting!