Equivalent of deal for a table

I often use deal to change the values of several cells in a cell array of strings:
a = 1:5;
b = {'one', 'two', 'three', 'four', 'five'};
[b{a>3}] = deal('big');
However, I just discovered that attempting the same operation on a table variable throws an error:
a = 1:5;
b = {'one', 'two', 'three', 'four', 'five'};
t = table(a,b);
[t.b{t.a>3}] = deal('big');
yields:
Expected one output from a curly brace or dot indexing expression, but there were 2
results.
Is there an equivalent syntax to quickly reassign values in a table?

3 Comments

Cedric
Cedric on 28 Jul 2015
Edited: Cedric on 28 Jul 2015
I fear that this will bring us directly back to the somehow long list of things that only built-ins can support, for a reason of parsing or of overloading of SUBSASGN/REF/etc, or ..(?) And table objects are not built-ins ( -> open table ).
If we
open deal
and place a break point on the first line of code, the "cell array"-based example leads to nargout=2 and the table-based example leads to nargout=1..
Yes, looking further into it, it seems this is documented (though somewhat difficult to find) in the help for the @table/subsasgn method:
% LIMITATIONS:
%
% You cannot assign multiple values into a table variable or property using
% assignments such as
% [A.CellVar{1:2}] = deal(B1,B2),
% [A.StructVar(1:2).field] = deal(B1,B2), or
% [A.Properties.ObsNames{1:2}] = deal(B1,B2)
% Use multiple assignments of the form A.CellVar{1} = B1 instead.
Oh well.
Hmm, not as bad as a rainbow color map ;-) but still.. well, hopefully this will become a built-in in a near future! (not 2015b though, because I have the same issue on the pre-release)

Sign in to comment.

Answers (1)

It would be nice to have this functionality. In the meantime, this works, although not as elegant.
t.b(t.a>3) = repmat({'big'}, size(t.b(t.a>3)))

Categories

Tags

Asked:

on 28 Jul 2015

Answered:

on 7 Feb 2021

Community Treasure Hunt

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

Start Hunting!