计算结构中没有任何NaN的行

Art*_*sov 3 arrays matlab struct

我需要计算结构数组中所有字段中没有任何NaN的结构数.示例结构如下所示:

a(1).b = 11;
a(2).b = NaN;
a(3).b = 22;
a(4).b = 33;
a(1).c = 44;
a(2).c = 55;
a(3).c = 66;
a(4).c = NaN;
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样

Fields    b     c

1         44    11
2         55    NaN
3         66    22
4         NaN   33
Run Code Online (Sandbox Code Playgroud)

没有NaN的结构是1和3,所以这里应该总共有2个.

我尝试过使用size(a, 2),但它只是告诉我数组中的结构总数.我需要它来计算N(样本中的观察数).NaNs不算作观察结果,因为它们在分析中被省略.

在struct数组中没有任何NaN的情况下计算结构的最简单方法是什么?

bra*_*nkz 7

我建议使用以下一行命令:

nnz(~any(cellfun(@isnan,struct2cell(a))))
Run Code Online (Sandbox Code Playgroud)

struct2cell(a)将您的结构转换为3D单元格数组cellfun(@isnan,___)应用于单元格数组的 isnan每个元素 ~any(__)沿第一维工作并返回没有NaN的数组 nnz(__)计数有多少行没有NaNs

2在这种情况下,结果只是一个数字.

下列:

find(~any(cellfun(@isnan,struct2cell(a))))
Run Code Online (Sandbox Code Playgroud)

会告诉你哪些行没有NaN


And*_*uri 5

这将告诉你哪些没有NaN

for ii=1:size(a,2)
    hasNoNaNs(ii)=~any(structfun(@isnan,a(ii)));
end
Run Code Online (Sandbox Code Playgroud)

它的工作方式是迭代trhoug每个结构,并使用structfun调用isnan每个它的元素,然后检查any他们的是NaN,否定的结果,因此不具有的那些给予1 NaN小号

  • 我不知道它是否必然更快,但它确实更好地用`any`替换你的`sum`.您可以避免将类型从逻辑切换为double,然后再切换回逻辑. (3认同)