anonymous function w/ accumarray

1 vue (au cours des 30 derniers jours)
Pete sherer
Pete sherer le 1 Juil 2021
Commenté : Star Strider le 22 Août 2022
tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]', 'VariableNames',{'year','id'})
Hi
I got error message below. Could you help shed light why I can't use accumarray with concatinating text output?
year id
____ __
1 1
1 5
1 9
2 10
2 1
cat = @(x) {sprintf([repmat('%s,',1,length(x)-1) '%s'], string(x))};
However got error below when trying to call
[ uniqYr,~,JGrp] = unique( tdata(:,'year'));
tt= accumarray( JGrp, tdata.id, [], @cat);
Error using cat
Dimension argument must be a real, positive, integer scalar.

Réponse acceptée

Star Strider
Star Strider le 1 Juil 2021
Naming your function ‘cat’ overshadows the existing MATLAB function by that name, that you inadvertently called when you used the ‘@’ operator in the accumarray call. First, rename the anonymous function, and do not use the ‘@’ in the accumarray call when calling it, since it is already a function handle.
This slight variation on the original code works:
tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]', 'VariableNames',{'year','id'})
tdata = 5×2 table
year id ____ __ 1 1 1 5 1 9 2 10 2 1
catfcn = @(x) {sprintf([repmat('%s,',1,length(x)-1) '%s'], string(x))};
[ uniqYr,~,JGrp] = unique( tdata(:,'year'));
tt= accumarray( JGrp, tdata.id, [], catfcn)
tt = 2×1 cell array
{'1,5,9'} {'10,1' }
.
  6 commentaires
Pete sherer
Pete sherer le 22 Août 2022
Modifié(e) : Pete sherer le 22 Août 2022
I tried using the cellstr() to apply to the string-type variable before using the step above but it didn't work.
tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]',["a" "b" "c" "d" "e"]', 'VariableNames',{'year','id','name'});
tdata.name= cellstr( tdata.name);
catfcn = @(x) {sprintf([repmat('%s,',1,length(x)-1) '%s'], string(x))};
[ uniqYr,~,JGrp] = unique( tdata(:,'year'));
tt = accumarray( JGrp, tdata.name, [], catfcn)
Error using accumarray
Second input VAL must be a full numeric, logical, or char vector or scalar.
Star Strider
Star Strider le 22 Août 2022
It doesn’t work because it remains a cell array. Use the char function instead —
tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]',["a" "b" "c" "d" "e"]', 'VariableNames',{'year','id','name'});
% tdata.name= cellstr( tdata.name)
tdata.name = char(tdata.name)
tdata = 5×3 table
year id name ____ __ ____ 1 1 a 1 5 b 1 9 c 2 10 d 2 1 e
catfcn = @(x) {sprintf([repmat('%s,',1,length(x)-1) '%s'], string(x))};
[ uniqYr,~,JGrp] = unique( tdata(:,'year'));
tt = accumarray( JGrp, tdata.name, [], catfcn)
tt = 2×1 cell array
{'a,b,c'} {'d,e' }
.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Numeric Types dans Help Center et File Exchange

Tags

Produits


Version

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by