2

我现在在使用 Matlab 时遇到了一些问题。我目前正在尝试从我拥有 3806 x 122 的大型单元阵列中删除所有 NaN。我一直在寻找类似问题的解决方案,并且我想出了。

data(cellfun(@(x) any(isnan(x(:))), data)) = [];

我的矩阵有点奇怪,因为它看起来像这样

(ex).
1    2    3    4    5    5    NaN
6    5    2    5    6    7    NaN
2    3    4    5    6    7    NaN
NaN  NaN  NaN  NaN  NaN  NaN  NaN

我的问题是,当我将上面的代码行应用到我的数组时,我得到了一个没有 NaN 的输出。

1    2    3    4    5    5    6    5    2    5    6    7    2    3    4    5    6    7    etc...

我不明白它为什么这样做。我还必须小心删除列,因为每一列都有相应的标题,我不想混淆它们。如果我能以某种方式索引哪些列和行具有 NaN,那将很有帮助,这样我就可以删除与它们对应的标题。

最后,我想将标题和数据放入一个如下所示的数据集结构中。

(ex).
'title1'   'title2'   'title3'   'title4'   'title5'   'title6'
1          2          3          4          5          5
6          5          2          5          6          7
2          3          4          5          6          7

任何帮助是极大的赞赏。

问候,乔纳森

4

2 回答 2

1

如果每个单元格只包含一个元素,则可以使用cellfun(@isnan, data) 而不是cellfun(@(x) any(isnan(x(:))), data)

如果您确定总是有行或列充满 NaN,那么您可以使用逻辑索引的第一行和第一列进行索引

I = ~cellfun(@isnan, data);
data = data(I(:,1), I(1,:));

你也可以用它I(1,:)来索引标题。一种更有效的方法是

Irow = ~cellfun(@isnan, data(:,1));
Icol = ~cellfun(@isnan, data(1,:));
data = data(Irow, Icol);
于 2013-06-04T18:50:04.577 回答
0

我相信有比这更好的方法,但这就是我想出的。在我的示例中,我将用空条目替换非空条目,但您应该能够针对您的情况进行调整。

d = cell(10,4);
d{1} = 5;
d{4} = 10;
d
ix = cellfun(@(x) numel(x)>0,d);
d(ix) = cell(1,numel(sum(ix(:))));
d
于 2013-06-04T18:45:34.193 回答