In a struct, how can you extract values for a vector of fieldnames
이전 댓글 표시
Hello,
I have a struct called MyStruct. I can extract the field names with the command
MyFieldNames = fieldnames(MyStruct);
If I'm interested in extracting the values for first n of MyFieldNames, is there a way I can do this using the "getfield" command? If I try
Temp = getfield(StateSpace, MyFieldNames(1:n))
or
Temp = Temp = getfield(StateSpace, MyFieldNames)
I get an error saying, "Index exceeds matrix dimensions."
Thank you, Kevin
댓글 수: 3
Azzi Abdelmalek
2013년 2월 22일
What do you mean by the first field?
Kevin Bachovchin
2013년 2월 22일
Kevin Bachovchin
2013년 2월 22일
채택된 답변
추가 답변 (4개)
Michael Kane
2019년 4월 16일
Kevin's answer can be condensed to oneline of code using cellfun
cellfun(@(x)(MyStruct.(x)),fieldnames(MyStruct))
You could even make this into an anonymous function fieldvalues
fieldvalues = @(MyStruct)(cellfun(@(fieldName)(MyStruct.(fieldName)),fieldnames(MyStruct)))
댓글 수: 1
Stephen23
2019년 4월 16일
Jan
2013년 2월 22일
You could use a dedicated function like:
function Value = GetFields(S, Name)
if ischar(Name)
try
Value = S.(Name);
catch
Value = []; % Or an error message
end
elseif iscellstr(Name)
Value = cell(size(Name));
for iName = 1:numel(Name)
try
Value{iName} = S.(Name{iName});
catch
% Nothing or an error message?!
end
end
else
error('Input type not handled')
end
For large numbers of fieldnames is this more efficient:
function Value = GetFields(S, Name)
[dummy, iName, iS] = intersect(Name, fieldnames(S));
Value = cell(size(Name));
Data = struct2cell(S);
Value(iName) = Data(iS);
Azzi Abdelmalek
2013년 2월 22일
편집: Azzi Abdelmalek
2013년 2월 22일
Edit
if a is your struct array
s=fieldnames(a)
out=a
rmfield(out,s(4:end)) % will remove fields from 4 to the end
댓글 수: 11
Kevin Bachovchin
2013년 2월 22일
Azzi Abdelmalek
2013년 2월 22일
편집: Azzi Abdelmalek
2013년 2월 22일
Look at edited answer
Kevin Bachovchin
2013년 2월 22일
편집: Azzi Abdelmalek
2013년 2월 22일
Azzi Abdelmalek
2013년 2월 22일
편집: Azzi Abdelmalek
2013년 2월 22일
I am not following you. Have you tried the edited answer?
s=fieldnames(a)
out=a
rmfield(out,s(4:end)) % will remove fields from 4 to the end
Azzi Abdelmalek
2013년 2월 22일
Once you get your three fields in the variable out use
result=reshape(cell2mat(struct2cell(out)),3,[])
Kevin Bachovchin
2013년 2월 22일
Azzi Abdelmalek
2013년 2월 22일
s=fieldnames(a)
out=a
out=rmfield(out,s(4:end))
result=reshape(cell2mat(struct2cell(out)),3,[])
Kevin Bachovchin
2013년 2월 22일
Azzi Abdelmalek
2013년 2월 22일
Look at this example
out=struct('v',{4},'y',{6},'z',{45})
result=reshape(cell2mat(struct2cell(out)),3,[])
Kevin Bachovchin
2013년 2월 22일
Azzi Abdelmalek
2013년 2월 22일
편집: Azzi Abdelmalek
2013년 2월 22일
result=struct2cell(out)
Bart McCoy
2021년 7월 2일
There's just such an assymetry here. You have this great little function fieldnames() that accepts a struct and returns a cell array of names Where's the complementary fieldvalues() that accepts a struct and returns all struct values?
struct2cell() works great, but this question has been asked over & over for many years
Guess I'm writing my own.... just because: :)
function values = fieldvalues(struc)
% values = fieldvalues(struc)
%
% DESCRIPTION:
% Extracts all values from a struct and returns them as a Kx1 cell array,
% mirroring the functionality of MATLAB's fieldnames(struc)
%
%
% SEE ALSO:
% fieldnames(struc) Complementary function to fieldvalues
assert( isstruct(struc), sprintf("\n\nfieldvalues(struc)\n\tArgument 'struc' must be a structure\n\n"));
values = struct2cell(struc);
end
카테고리
도움말 센터 및 File Exchange에서 Data Type Identification에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!