如何从 Matlab 的结构数组中删除包含 NaN 的条目?

Art*_*sov 2 arrays matlab struct

我有一个结构数组a

a(1).s1 = NaN
a(2).s1 = 2
a(3).s1 = 4
a(4).s1 = 3

a(1).s2 = 1
a(2).s2 = NaN
a(3).s2 = NaN
a(4).s2 = 5
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想创建另一个b没有s2包含条目的结构数组NaN。所以新数组b看起来像这样:

b(1).s1 = NaN
b(2).s1 = 3

b(1).s2 = 1
b(2).s2 = 5
Run Code Online (Sandbox Code Playgroud)

我需要自动完成此操作,以便我可以将脚本应用于更大的结构数组。

我一直在尝试创建一个这样的 for 循环:

i = 1;
for i = find(all(~isnan([a(1:4).s2]), 1));
    b(i).s1 = a(i).s1;
    b(i).s2 = a(i).s2;
end
Run Code Online (Sandbox Code Playgroud)

但它保留空条目。

另一种删除条目的尝试NaN

b = a;
i = 1;
for i = find(all(isnan([b(1:4).s2]), 1));
    b(i) = [];
end
Run Code Online (Sandbox Code Playgroud)

仅适用于第一个NaN。然后它会丢失i计数并删除不正确的条目。

请帮助我,如果有人知道该怎么做。

Bud*_*vic 5

你真的很接近解决这个问题,但 for 循环有点问题,所以你应该使用这样的数组公式:

b = a(~isnan([a.s2]));
Run Code Online (Sandbox Code Playgroud)

我希望这能帮到您。

  • 你比我快一秒,解决方案大致相同。注意:你可以去掉 `find` 并使用线性索引,这提供了一个更短、更有效的解决方案:`b = a(~isnan([a.s2]))` (3认同)