有没有一种方法可以从MATLAB中的结构中删除除少数所需字段以外的所有字段?
因此,我有几个包含数据的结构,使用的是十几个左右的脚本。问题是,对于每个脚本,我只需要一手变量,其余的我可以忽略。我正在使用大量的数据(Gig的数据),MATLAB经常给我内存不足的错误,所以我需要从结构中删除所有不必要的字段 目前我有一个包含所有不需要的字段的单元格,然后我在结构上调用rmfield。但是结构中的字段经常发生变化,不断更新不需要的字段列表是一件痛苦的事情。那么,有没有一种方法可以告诉MATLAB只保留我想要的字段,并删除所有其他字段,即使我不知道其他字段是什么 举个例子,有没有一种方法可以从MATLAB中的结构中删除除少数所需字段以外的所有字段?,matlab,matlab-struct,Matlab,Matlab Struct,因此,我有几个包含数据的结构,使用的是十几个左右的脚本。问题是,对于每个脚本,我只需要一手变量,其余的我可以忽略。我正在使用大量的数据(Gig的数据),MATLAB经常给我内存不足的错误,所以我需要从结构中删除所有不必要的字段 目前我有一个包含所有不需要的字段的单元格,然后我在结构上调用rmfield。但是结构中的字段经常发生变化,不断更新不需要的字段列表是一件痛苦的事情。那么,有没有一种方法可以告诉MATLAB只保留我想要的字段,并删除所有其他字段,即使我不知道其他字段是什么 举个例子, 结
- 结构1有:A、B、C、D、E字段
- 结构2有:A、B、C、D、E、F字段
- 结构3有:A、B、C、D、E、F、G、H、I字段
我只想保留A、B和C字段,并从所有结构中删除所有其他数据。这里有一种方法:
fieldnames
范例
s.a=1
s.b=2
s.c=3
s.d='chitchat'
tokeep = {'a','b'}
f=fieldnames(s)
toRemove = f(~ismember(f,tokeep));
s = rmfield(s,[toRemove])
可以将结构的所需字段复制到函数中的新变量
function newVar = getABC(strct)
newVar.A = strct.A;
newVar.B = strct.B;
newVar.C = strct.C;
end
strct
不会复制到内存中,因为
MATLAB使用一个通常称为“写时复制”的系统来避免产生错误
函数工作区内输入参数的副本,直到或
除非修改输入参数。如果不修改输入
参数,MATLAB将避免复制
您可以从内存中获取newVar
,然后清除strct
弗雷德的广义版本:
function newVar = getFields(oldVar, desiredCell)
for idx = 1:length(desiredCell)
newVar.(desiredCell{idx}) = oldVar.(desiredCell{idx});
end
1) 假设你有一个结构
2) 您希望只保留S的前三个字段,并删除所有其他字段
fieldsS = fieldnames(S);
S = rmfield(S,fieldsS(4:end));
MATLAB中的rmfield方法相当慢,因此在处理大型结构时,最好避免使用它 这个MATLAB文件交换项:基本上是rmfield的逆项,应该完全按照您的要求工作 它将结构转换为单元数组,然后根据字段名中是否存在字段创建逻辑数组,从而仅保留所需的索引。修改后的单元数组将转换回结构
免责声明:当我遇到完全相同的问题时,我编写了kpfield。我成功加载了结构-物理删除了我想要删除的字段,然后重新保存了结构
删除工作区中的字段不会将其从原始结构中删除-因此需要重新保存 因此,我尝试使用fieldnames()来删除这些内容,但不知道如何删除我想要的内容。我使用正则表达式进行搜索和替换,但是rmfield显然不喜欢我的替换。对于从单元格中删除字符串,你还有什么其他建议吗?@DennisJaheruddin:我把你的例子缩短了一点。希望您不介意。结构可能不会复制到函数工作区中,但它必须仍在主工作空间的内存中。因此,我认为所需的最小内存可能仍然是struct和newstruct的大小。@DennisJaheruddin是的,但在离开函数后,strct可以立即从内存中删除。因此,只有
newStrct
会占用内存。我喜欢它,我会使用它。谢谢如果有人感兴趣,我使用了答案,但对其进行了一些修改,使其更通用。函数newVar=getFields(oldVar,desiredCell)
对于I=1:length(desiredCell)
newVar.(desiredCell{I})=oldVar.(desiredCell{I})
end
这允许我传入我关心的变量字符串的任何单元格,并将数据输出。谢谢你的提示HebeleHododo@弗雷德:这是一个很好的概括。我把它编辑成我的帖子。