Matlab中如何删除空结构体字段

5

我遇到了以下问题:我有一个类似于结构数组的东西:

A.B(1,1).x = 'string'
A.B(1,1).y = 12
A.B(1,2).x = []
A.B(1,2).y = []
A.B(1,3).x = 'string2'
A.B(1,3).y = 4

我希望能够从这个结构中删除空的第二行,以便最终获得(1,1)和(1,3)字段。 我试图将其转换为单元格,然后删除并重新转换为结构,但是这样做必须重新输入字段名称。 有什么方法可以做到这一点吗?是否可以在不将其转换为结构的情况下完成? 谢谢!
1个回答

2
使用循环或arrayfun函数来确定哪些数组元素为空:
empty_elems = arrayfun(@(s) isempty(s.x) & isempty(s.y),A.B)

返回:[0 1 0]

或者

empty_elems = arrayfun(@(s) all(structfun(@isempty,s)), A.B);

使用 any 而不是 all 来检查是否所有字段都为空(使用 any 来检查是否有任何元素为空,而不是所有元素)。

然后使用 逻辑索引 将它们移除:

A.B(empty_elems) = [];

在评论中提供您问题的完整解决方案:

% find array elements that have all fields empty:
empty_elems = arrayfun(@(s) all(structfun(@isempty,s)), A.B);

% copy non-empty elements to a new array `C`:
C = A.B(~empty_elems);

% find elements of C that have y field >3
gt3_elems = arrayfun(@(s) s.y<3,C);

% delete those form C:
C(gt3_elems) = [];

逐步执行此代码并分析中间变量以了解发生了什么。这应该是相当清晰的。


如果我有更多的字段,比如x、y、z等,有没有一种有效的方法来编写这个条件语句?因为仅仅一个条件 isempty(s.x) 并不能删除空字段。 - beginh
实际上,我在考虑以下问题:首先,我有一个带有数据的A.B。然后,我对A.B.().y应用了一个条件,如果A.B.().y>3,则保存到一个新结构中,从中我得到了这个空的A.B.(1,2)(假设A.B.(1,2).y=2)。也许有更好的方法可以一次避免结构中的空字段吗? - beginh
我不确定我是否理解得很好,但如果是这样的话,那么空字段是应用我的条件的结果。在所有字段都有值之前,由于2 < 3的事实,我得到了空字段。 - beginh
请问您能否更新一下您的问题,包括相关代码和示例输入/输出?从您的评论中并不清楚您的意思。 - Gunther Struyf
我的完全初始结构: A.B(1,1).x = 'string' A.B(1,1).y = 12 A.B(1,2).x = 'string3' A.B(1,2).y = 2 A.B(1,3).x = 'string2' A.B(1,3).y = 4 目标:删除 A 结构中的列,其中 A.B().y < 3。 条件满足后的输出结果:A.B(1,2) 为空。 所以我想要知道如何删除空字段(我正在尝试使用您推荐的 structfun,但很抱歉我是初学者,在这个特定用法的任何好例子都找不到 :() 或者我想在条件...< 3期间立即删除字段 A.B(1,2)。 - beginh
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接