所以我有几个结构包含使用的数据是十几个脚本。问题是,对于每个脚本,我只需要一些变量,其余的我可以忽略。我正在使用大量的数据(数据演出),MATLAB经常给我带来内存错误,所以我需要从结构中删除所有不必要的字段。
目前我有一个包含所有不需要的字段的单元格,然后我在结构上调用rmfield。但结构中的字段经常发生变化,不断更新不需要的字段列表变得很痛苦。那么有没有办法告诉MATLAB只保留我想要的那些字段并删除其他所有字段,即使我不知道其他什么是什么?
这是一个例子,
有时,Struct 3可能只有A到G。
我想只保留A,B和C字段,并删除所有结构中的所有其他数据。
答案 0 :(得分:6)
这是一种方法:
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])
答案 1 :(得分:1)
您可以将结构的所需字段复制到函数中的新变量。
function newVar = getABC(strct)
newVar.A = strct.A;
newVar.B = strct.B;
newVar.C = strct.C;
end
strct
不会被复制到内存中{* 3}}。
MATLAB使用通常称为“写时复制”的系统来避免制作 函数工作区内的输入参数的副本,直到或 除非您修改输入参数。如果您不修改输入 参数,MATLAB将避免复制。
您可以从内存中获取newVar
然后clear strct
。
function newVar = getFields(oldVar, desiredCell)
for idx = 1:length(desiredCell)
newVar.(desiredCell{idx}) = oldVar.(desiredCell{idx});
end
答案 2 :(得分:0)
1)假设你有一个结构S
2)你想只保留S的前三个字段并删除所有其他字段
fieldsS = fieldnames(S);
S = rmfield(S,fieldsS(4:end));
答案 3 :(得分:0)
我成功加载了要删除的结构体物理删除字段,然后重新保存该结构体。
在工作空间中删除字段不会将它们从原始结构中删除-因此必须重新保存。