我现在正在使用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
非常感谢任何帮助。
此致 乔纳森
答案 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