我正在嘗試以遞回方式從嵌套結構中提取一些資料。首先,我知道這有一個欄位 ( values) 在嵌套結構中重復。其次,我知道具有這些值的結構只有結構作為欄位。在下面的代碼中,我嘗試structure.values通過搜索當前結構是否有一個名為values. 如果有,我把它放在.values我的結構名稱的末尾。如果它沒有這個欄位,我會驗證所有欄位是否都是結構。如果是,則意味著我將不得不進一步考慮它們,并從每一個中提取價值。如果欄位不是結構,則意味著它們是值,我將它們保存到一個新的簡化結構中。我想要的欄位示例:S.values.model1.values.mission.values.(alt/list). 目前,使用下面的代碼我只能從一個欄位中獲取值,然后我得到一個錯誤并且不知道如何進一步處理。
代碼示例:
clear all
clc
S=struct()
S.case='1';
S.type='A';
S.values.model1.case='2'
S.values.model1.type='C'
S.values.model1.values.mission.case='3'
S.values.model1.values.mission.type='D'
S.values.model1.values.mission.values.alt='none'
S.values.model1.values.mission.values.list=2
S.values.model1.values.mission.values.parameter=4
S.values.model1.values.phase.case='4'
S.values.model1.values.phase.type='A'
S.values.model1.values.phase.values.num='all'
S.values.model1.values.phase.values.eq=2
S.values.model1.values.phase.values.unit=4
S.values.model1.values.analysis.case='1'
S.values.model1.values.phase.type='A'
S.values.model1.values.phase.values.nump1.list='all'
S.values.model1.values.phase.values.nump1.table='four'
S.values.model1.values.phase.values.nump1.mean=0
S.values.model1.values.phase.values.nump2.list='none'
S.values.model1.values.phase.values.nump2.table='three';
S.values.model1.values.phase.values.nump2.mean=1
s=S.values.model1;
names=fieldnames(s);
nnames=numel(names);
newStruct={};
[valsi,newstructi]=extractValues(names,s,nnames,newStruct)
function [vals,newStruct]=extractValues(names,vals,nnames,newStruct)
if any(strcmp(names,'values'))
vals=vals.('values');
names=fieldnames(vals)
nnames=numel(names)
[vals,newStruct]=extractValues(names,vals,nnames,newStruct);
end
for j=1:nnames
value(j)=isstruct((vals.(names{j})));
end
if all(value)
for k=1:nnames
vals=(vals.(names{k}));
names=fieldnames(vals);
nnames=numel(names);
[vals,newStruct]=extractValues(names,vals,nnames,newStruct);
end
else
for j=1:nnames
value=(vals.(names{j}));
newStruct.(names{j})=value;
end
end
end
uj5u.com熱心網友回復:
正如事先知道的那樣,您可以將后續的檔案名排列在一個單元格陣列中,并使用回圈來提取值:
names = {'values', 'model1', 'values', 'mission', 'values', 'alt'};
out = S;
for name : names
out = out.(name{1});
end
所以這是使用的回圈版本:
out = S.values.model1.values.mission.values.alt;
編輯:
如果要列出所有欄位名稱和所有欄位值,可以使用以下函式:
function out = names(s, p)
if isstruct(s)
out = {};
f = fieldnames(s);
for i = 1:numel(f)
s1 = s.(f{i});
p1 = [p '.' f{i}];
out = [out; names(s1, p1)];
end
else
out = {p};
end
end
function out = values(s)
if isstruct(s)
out = {};
f = fieldnames(s);
for i = 1:numel(f)
out = [out; values(s.(f{i}))];
end
else
out = {s};
end
end
將它們用作:
n = names(S, 'S');
v = values(S);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/412036.html
標籤:
