Matlab 当我试图清除NaN时,Cellfun正在重新排列矩阵';这是因为

Matlab 当我试图清除NaN时,Cellfun正在重新排列矩阵';这是因为,matlab,nan,Matlab,Nan,我现在在使用Matlab时遇到了一些问题。我目前正在尝试从一个大的单元阵列中移除所有的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

我现在在使用Matlab时遇到了一些问题。我目前正在尝试从一个大的单元阵列中移除所有的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
非常感谢您的帮助

问候,,
乔纳森

我相信还有比这更好的方法,但我想到了以下几点。在我的示例中,我将用空条目替换非空条目,但您应该能够根据您的情况进行调整

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

如果每个单元格仅包含一个元素,则可以使用
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);

NaN
总是在最后一行和最后一列,还是分散分布?是否有行/列同时包含数字和
Nan
(最后一行/列除外)?Robert,绝大多数Nan都位于数组的底部和侧面,如上图所示,但是有一些Nan的列分散在整个数据中。感谢您的帮助。这正是我需要的!