how to compare string array with the names of structure's fields.

조회 수: 26 (최근 30일)
Sara
Sara 2018년 7월 2일
댓글: Sara 2018년 7월 3일
I have a structure with 12 fields and a string array named variables containing 4 values. I want to compare all values in my string arrays with the names of my structure fields, and if the fields' name and the string value were the same, return values of that field as an output. I try strcmp command to compare my string array with the fields' name in a for loop.(for i = 1:numel(variables)) then I use switch and case but I have no idea how to return the field values as an output when the statement is true. (I think I should use getfield command but I don't know how). could you please help me in this regard. thank you.
  댓글 수: 1
Adam
Adam 2018년 7월 2일
You can use dynamic strings to get data out of a struct field e.g.
str = 'SomeStructFieldName';
value = myStruct.( str );

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

채택된 답변

Paolo
Paolo 2018년 7월 2일
S.a = {'First field'};
S.b = {'Second field, entry 1','Second field,entry 2'};
S.c = {1,2,3};
mystring = {'a','game','matlab','c'};
[~,indx] = ismember(fieldnames(S),mystring);
all = arrayfun(@(x) getfield(S,mystring{x}),indx(indx>0),'un',0);
all{:} =
{'First field'}
{[1]} {[2]} {[3]}
  댓글 수: 3
Stephen23
Stephen23 2018년 7월 3일
편집: Stephen23 2018년 7월 3일
@Sahar: the @(x) defines an anonymous function in x:
Paolo
Paolo 2018년 7월 3일
T = table(all{:});
T.Properties.VariableNames = mystring(indx(indx>0));
T =
1×2 table
a c
_____________ _________________
'First field' [1] [2] [3]

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

추가 답변 (1개)

Stephen23
Stephen23 2018년 7월 3일
편집: Stephen23 2018년 7월 3일
I would use struct2cell to get a cell array, then used basic MATLAB indexing to obtain the "fields" (rows of the cell array) that you want. Using a cell array makes it easy to use cell2table to generate a table from the cell array and the fieldnames:
>> S.a = '1st';
>> S.b = {'2ndOne','2ndTwo'};
>> S.c = 3;
>> F = fieldnames(S);
>> C = struct2cell(S);
>> lookfor = {'a','hello','world','c'};
>> [idx,idy] = ismember(lookfor,F);
>> idz = idy(idx)
>> T = cell2table(C(idz,:),'VariableNames',F(idz))
  댓글 수: 3
Stephen23
Stephen23 2018년 7월 3일
편집: Stephen23 2018년 7월 3일
@Sahar: you are right, I think the first input needs to be transposed:
Table = cell2table(Cell(indz,:).','VariableNames',Fname(indz));
According to the cell2table help "Each column of C provides data for a table variable", whereas struct2cell returns one row for each field, so a transpose is required.
Sara
Sara 2018년 7월 3일
Many Thanks for your help.

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

카테고리

Help CenterFile Exchange에서 Data Type Conversion에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by