How to convert cell array to structure array
16 ビュー (過去 30 日間)
古いコメントを表示
I would like to convert cell array to a structure 1x2 (or 2x1) with 3 fields with a1 as dimension/axis:
a1={'AA','AA','AA','BB','BB','BB','BB'}';
a2={'35000','96000','88000','33000','44000','8000','18000'}';
a3={'1a','1b','1c','1d','1e','1a','1b'}';
a123=[a1,a2,a3];
rowHeadings = {'first', 'second', 'third'};
but this does not work:
depts = cell2struct(a123, rowHeadings, 1)
Error using cell2struct
Unknown command option.
7 件のコメント
Stephen23
2015 年 6 月 15 日
編集済み: Stephen23
2015 年 6 月 15 日
@Aleksandar: it looks like you are a bit confused about what structures can do. Structures are not really categorization tools, nor are they dictionaries (which might look similar to what you wrote above). Like most traditional MATLAB data classes the dimensions of a structure do not encode any meta-data, so you cannot "name" the dimensions of a 1x2 structure 'AA' and 'BB', atleast not as meta-data in the structure itself. It would be possible to either:
- create a separate array containing this data, or
- include this meta-data as data withing the structure (see my answer below).
- use another data class: it seems like you might really be looking for something more like a table. Have you looked at using one?
採用された回答
Azzi Abdelmalek
2015 年 6 月 13 日
a1={'AA','AA','AA','BB','BB','BB','BB'}';
a2={'35000','96000','88000','33000','44000','8000','18000'}';
a3={'1a','1b','1c','1d','1e','1a','1b'}';
a123=[a1,a2,a3];
rowHeadings = {'first', 'second', 'third'};
v=cell2struct(a123,rowHeadings,2)
3 件のコメント
Azzi Abdelmalek
2015 年 6 月 15 日
a1={'AA','AA','AA','BB','BB','BB','BB'}';
a2={'35000','96000','88000','33000','44000','8000','18000'}';
a3={'1a','1b','1c','1d','1e','1a','1b'}';
a123=[a1,a2,a3];
rowHeadings = {'first', 'second', 'third'};
ii=unique(a1)
for k=1:numel(ii)
idx=ismember(a1,ii{k})
v(k).first=ii{k}
v(k).second=a2(idx)
v(k).third=a3(idx)
end
Stephen23
2015 年 6 月 15 日
Note that it is poor practice in MATLAB to expand arrays inside loops, even for structures and cell arrays:
It is better either to create the entire structure in one call (see my answer), or to preallocate the structure (e.g. looping in reverse).
その他の回答 (1 件)
Stephen23
2015 年 6 月 15 日
編集済み: Stephen23
2015 年 6 月 15 日
a1 = {'AA','AA','AA','BB','BB','BB','BB'}';
a2 = {'35000','96000','88000','33000','44000','8000','18000'}';
a3 = {'1a','1b','1c','1d','1e','1a','1b'}';
hdr = {'first', 'second', 'third'};
fun = @(x)arrayfun(@(s)x(strcmp(s,a1)), unique(a1,'stable'), 'UniformOutput',false);
X = struct(hdr{1},fun(a1), hdr{2},fun(a2), hdr{3},fun(a3));
Now lets check it in the command window:
>> X
X =
2x1 struct array with fields:
first
second
third
>> X.first
ans =
'AA'
'AA'
'AA'
ans =
'BB'
'BB'
'BB'
'BB'
>> X.second
ans =
'35000'
'96000'
'88000'
ans =
'33000'
'44000'
'8000'
'18000'
2 件のコメント
Stephen23
2016 年 7 月 23 日
"I suppose it refers to both answers"
No, it doesn't. You can vote for other answers though.
参考
カテゴリ
Help Center および File Exchange で Loops and Conditional Statements についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!