anonymous function w/ accumarray

1 回表示 (過去 30 日間)
Pete sherer
Pete sherer 2021 年 7 月 1 日
コメント済み: Star Strider 2022 年 8 月 22 日
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.

採用された回答

Star Strider
Star Strider 2021 年 7 月 1 日
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 件のコメント
Pete sherer
Pete sherer 2022 年 8 月 22 日
編集済み: Pete sherer 2022 年 8 月 22 日
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 2022 年 8 月 22 日
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' }
.

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

その他の回答 (0 件)

カテゴリ

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

タグ

製品


リリース

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by