如何在matlab中逐列向上移动细胞时去除NaN

我有一个相对较大的矩阵(800’000 x 1’000),在某些列的末尾包含NaNs,我需要在向上移动每个单元格时摆脱它们.当我移除NaN时,下一个单元格应该向上移动.在之前的列的非NaN值之后,我无法将下一列的值移动到单元格中.重要的是行数保持与初始矩阵(我修复)相同,但列数明显会发生变化.

以下是较小矩阵A1 4×5的示例:

A1 = [
     1     5     8     9    11
     2     6   NaN    10    12
     3     7   NaN   NaN    13
     4   NaN   NaN   NaN  NaN  ]

我需要A1成为:

A2 = [
     1     5     9    13
     2     6    10    NaN
     3     7    11    NaN
     4     8    12    NaN   ]

在这个例子中,A1(1,3)= 8移动到A2(4,2)= 8,A1(1,4)= 9移动到A2(1,3)= 9,A1(2,4)= 10移动到A2(2,3)= 10,依此类推.行数仍然是4,但列数变为4.最后一列中的NaN单元是需要避免“矩阵维度不匹配错误”但我不需要它,之后(或同时),我应该摆脱可能仍含有NaN的基质的最后一列.最后,我的矩阵应该变成:

A3 = [
     1     5     9 
     2     6    10  
     3     7    11  
     4     8    12  ]

我试图使用A1(~isnan(A1)),但是这个命令将值放在一个列向量中,而我需要仍然有一个预定行数的矩阵或至少一个包含矩阵每列的单元格数组每个单元阵列中有A3.

有没有办法从A1到A3?

最佳答案 您需要做的是首先过滤出NaN,然后​​重新整形剩余的数据.试试这个:

reshape(A1(isfinite(A1)),4,[])

您可能需要对此进行一些调整,但我认为它只需一步即可完成您想要的操作.

我不确定替换运算符是否会使用这样的缺失值,所以你可能需要这样的东西:

A2=A1(isfinite(A1))
A3=reshape(A2(1:(4*floor(length(A2)/4))),4,[])
点赞