How to convert cell array to structure array

조회 수: 15 (최근 30일)
Aleksandar
Aleksandar 2015년 6월 13일
댓글: Stephen23 2016년 7월 23일
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
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?
Vahab Youssofzadeh
Vahab Youssofzadeh 2016년 7월 22일
Try the following:
table2struct(cell2table(.))

댓글을 달려면 로그인하십시오.

채택된 답변

Azzi Abdelmalek
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
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
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
Stephen23 2015년 6월 15일
편집: Stephen23 2015년 6월 15일
Here is a short and reasonably tidy way of doing this using struct:
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
Aleksandar
Aleksandar 2015년 6월 15일
Thank you! I accepted the answer(s) , I suppose it refers to both answers.
Stephen23
Stephen23 2016년 7월 23일
"I suppose it refers to both answers"
No, it doesn't. You can vote for other answers though.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by