2

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

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

4

5 回答 5

6

这是一种方法:

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

例子

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])
于 2013-02-01T14:39:41.480 回答
1

您可以将结构所需的字段复制到函数中的新变量中。

function newVar = getABC(strct)
    newVar.A = strct.A;
    newVar.B = strct.B;
    newVar.C = strct.C;        
end

strct不会被复制到内存中,因为您不会对其进行操作

MATLAB 使用通常称为“写入时复制”的系统来避免在函数工作区中复制输入参数,除非您修改输入参数。如果您不修改输入参数,MATLAB 将避免制作副本。

你可以从内存newVar中获取。clear strct


弗雷德的广义版本:

function newVar = getFields(oldVar, desiredCell)
    for idx = 1:length(desiredCell)
    newVar.(desiredCell{idx}) = oldVar.(desiredCell{idx});
end
于 2013-02-01T14:42:24.223 回答
0

1)假设你有一个结构 S

2)您只想保留 S 的前三个字段并删除所有其他字段

fieldsS = fieldnames(S);
S = rmfield(S,fieldsS(4:end));
于 2014-05-21T13:07:44.380 回答
0

MATLAB 中的 rmfield 方法相当慢,因此在处理大型结构时最好避免使用它。

这个 MATLAB 文件交换项:kpfield基本上是 rmfield 的倒数,应该完全按照您的要求工作。

它通过根据字段是否存在于字段名中创建逻辑数组,将结构转换为元胞数组,然后仅保留所需的索引。然后将修改后的元胞数组转换回结构。

免责声明:当我遇到完全相同的问题时,我已经写了 kpfield。

于 2016-04-09T10:58:13.330 回答
0

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

删除工作区中的字段不会从原始结构中删除它们 - 因此需要重新保存。

于 2020-05-27T15:41:42.403 回答