如何在 MATLAB 中扫描多个结构?
Posted
技术标签:
【中文标题】如何在 MATLAB 中扫描多个结构?【英文标题】:How to scan through several structures in MATLAB? 【发布时间】:2013-02-24 08:30:24 【问题描述】:我有一些具有相似字段名称的结构数组(如结构 1、结构 2、结构 3...)。我想扫描所有结构并仅返回第一个字段为 5(Field1==5)的结构。到目前为止,我有这个代码,
for k=1:3
s=sprintf('Structure%d',k)
Structure=load(s)
idx=cellfun(@(x) x==5, Structure.Field1)
out=Structure(idx)
vk=Structure.Field1
end
但它给了我这个错误:
Reference to non-existent field 'Field1'.
有人可以指出这里有什么问题吗?
感谢
【问题讨论】:
【参考方案1】:for k=1:3
s=sprintf('Structure%d',k)
Structure=load(s)
eval(['newStructure(k)=Structure.' s]);
idx(k)=cellfun(@(x) x==5, newStructure(k).Field1)
end
%extract the structures from newStructure which have 1 in idx
out=newStructure(idx); %idx should be a logical array
for i=1:size(out,2)
v(i)=out(i).Field1;
end
这应该可以完美运行。
【讨论】:
每个结构中都有一个“Field1”。问题似乎是结构以 Structure.Structure1.Field1 的形式存储在工作区中。如果我在 cellfun 中写 Structure.Structure(k).Field1 它将不起作用。有办法解决吗? 为什么不将结构提取到不同的变量中:newStruct=Structure.Structure1
然后继续?
如果我为每个结构(Structure.Structure1,Structure.Structure2,...)手动执行它,它可以工作,但我怎样才能在同一个循环中动态地执行此操作?
这似乎很简单,但我仍在努力解决它(我在这方面相对较新)。我只想扫描具有相同字段的多个结构并将符合我的搜索条件的结构保存到单独的向量中。有可能吗?
非常感谢。这就像一个魅力,并返回正确的 idx 值(0 和 1)。但是当它退出循环到 out=newStructure(idx) 时,它会给出一个错误:“索引超出矩阵维度”。我敢肯定这只是一个小故障,但这意味着什么?【参考方案2】:
您保存的某些结构中似乎没有 'Field1'
作为字段。
在这种情况下,您可能想尝试其他方法。
首先定义一个函数(在m文件中)
function res = iff( cond, true_case, false_case )
%
% conditional execution of two function handles
%
% true_case and false_case are function handles expecting no inputs
%
if cond
res = true_case();
else
res = false_case();
end
一旦你有了这个功能,你就可以在cellfun
中使用它
idx = cellfun( @(x) iff( isfield(x, 'Field1'), @() x.Field1 == 5, @() false), Structure );
【讨论】:
每个结构中都有一个“Field1”。问题似乎是结构以 Structure.Structure1.Field1 的形式存储在工作区中。如果我在 cellfun 中写 Structure.Structure(k).Field1 它将不起作用。有办法解决吗? 这似乎很简单,但我仍然在努力解决它(我在这方面相对较新)。我只想扫描具有相同字段的多个结构并将符合我的搜索条件的结构保存到单独的向量中。有可能吗?以上是关于如何在 MATLAB 中扫描多个结构?的主要内容,如果未能解决你的问题,请参考以下文章