有没有一种方法可以从MATLAB中的结构中删除除少数所需字段以外的所有字段?

有没有一种方法可以从MATLAB中的结构中删除除少数所需字段以外的所有字段?,matlab,matlab-struct,Matlab,Matlab Struct,因此,我有几个包含数据的结构,使用的是十几个左右的脚本。问题是,对于每个脚本,我只需要一手变量,其余的我可以忽略。我正在使用大量的数据(Gig的数据),MATLAB经常给我内存不足的错误,所以我需要从结构中删除所有不必要的字段 目前我有一个包含所有不需要的字段的单元格,然后我在结构上调用rmfield。但是结构中的字段经常发生变化,不断更新不需要的字段列表是一件痛苦的事情。那么,有没有一种方法可以告诉MATLAB只保留我想要的字段,并删除所有其他字段,即使我不知道其他字段是什么 举个例子, 结

因此,我有几个包含数据的结构,使用的是十几个左右的脚本。问题是,对于每个脚本,我只需要一手变量,其余的我可以忽略。我正在使用大量的数据(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字段
有时结构3可能只有一个到G


我只想保留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@弗雷德:这是一个很好的概括。我把它编辑成我的帖子。