当我尝试从中清除NaN时,Cellfun正在重新排序我的矩阵

时间:2013-06-04 17:48:55

标签: matlab nan

我现在正在使用Matlab遇到一些麻烦。我目前正在尝试从大型Cell Array中移除所有NaN,我有3806 x 122.我一直在寻找类似问题的解决方案,我想出了。

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

非常感谢任何帮助。

此致 乔纳森

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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