【问题标题】:Empty all the fields of a structure array in Matlab在 Matlab 中清空结构数组的所有字段
【发布时间】:2014-09-09 19:11:41
【问题描述】:

为简单起见,让我们坚持this official Matlab example

我运行以下代码,创建了一个包含三个字段的结构。

patient.name = 'John Doe';
patient.billing = 127.00;
patient.test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];

然后,为了创建结构数组,我只需要执行以下操作。

patient(2).name = 'Ann Lane';
patient(2).billing = 28.50;
patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169];

此时我有一个结构体数组,由this picture 明确表示:

问题来了:如何清空结构patient(2)的所有字段?

理想情况下(原谅符号的滥用)我想做patient(2).* = {}之类的事情。

逐个调用字段不是一种选择,因为在我的实际代码中,我有很多字段,我也无法将结构转换为单元格。

提前致谢!

【问题讨论】:

  • @Ander Biguri 非常感谢您将图片添加到问题中,我在发布时没有必要的声誉:)

标签: arrays matlab


【解决方案1】:

如果此操作频繁,最好准备一个EMPTY_PATIENT

EMPTY_PATIENT = struct( ...
   'name', {},          ...
   'billing', {},       ...
   'test', {}           ...
);

然后使用简单的赋值(非常快)清空位置:

patient(2) = EMPTY_PATIENT;

【讨论】:

  • 肯定这是最安全和最快的方法,使用 foo 空结构!谢谢 CST :)
  • 一般来说:如果只有一个级别并且您有很多字段要填充,您可以输入一个字段名,然后 MATLAB 将填充其余部分。例如:patient(end+1).name = []; empty_patient = patient(end); patient(end) = []; 节省一些输入
【解决方案2】:

我确信有一个聪明的方法可以在没有循环的情况下做到这一点,但这很好用。

fieldstoclear = fieldnames(patient(2));

for ii = 1:length(fieldstoclear)
    patient(2).(fieldstoclear{ii}) = [];
end

编辑:忘了structfun

patient(2) = structfun(@(x) [], patient(2), 'UniformOutput',false)

注意:这两种方法都不会保留嵌套结构。

【讨论】:

  • 谢谢 excaza,这是正确的方向。无论如何,嵌套结构在这种情况下很重要,所以我不能真正接受这个作为答案!但是,这确实是向前迈出了一步,谢谢!
【解决方案3】:
 patient(2) = [];

可能是您正在寻找的。这将从结构中消除该元素。

【讨论】:

  • 感谢您的回答,但实际上我需要保留该元素,因为数组的大小在我的代码中起着重要作用。我明确需要清空其字段,而不是删除它。
【解决方案4】:

这应该是适用于任意数量字段的通用解决方案。

fields=fieldnames(patient);
patient(2)=cell2struct(cell(length(fields), 1), fields);

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多