有没有办法从MATLAB中的结构中删除除了几个所需的字段之外的所有字段?

时间:2013-02-01 14:34:30

标签: matlab matlab-struct

所以我有几个结构包含使用的数据是十几个脚本。问题是,对于每个脚本,我只需要一些变量,其余的我可以忽略。我正在使用大量的数据(数据演出),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场

有时,Struct 3可能只有A到G。

我想只保留A,B和C字段,并删除所有结构中的所有其他数据。

4 个答案:

答案 0 :(得分:6)

这是一种方法:

  1. 使用fieldnames
  2. 获取所有字段名称列表
  3. 从列表中删除您要保留的内容
  4. 删除列表中剩下的所有内容

  5. 实施例

    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)

我成功加载了要删除的结构体物理删除字段,然后重新保存该结构体。

在工作空间中删除字段不会将它们从原始结构中删除-因此必须重新保存。