从Matlab中的表中删除所有变量中的NaN

问题描述:

我有一个包含多个变量的表,其中一些条目有NaN's。我想更换所有NaN为0,我能找到NaN与此:从Matlab中的表中删除所有变量中的NaN

T = table(rand(200,1),[rand(199,1);NaN],rand(200,1)); 
Index = varfun(@isnan,T); 

然而,当我尝试索引申请表,T:

T(Index)=0; 

我得到以下错误:

You can not subscript a table using only one subscript. Table subscripting requires both row and variable subscripts. 

有没有简单的解决方案,这一点,或者我需要改变,从表到矩阵?

问题似乎是Index仍然是一个表,并且您始终需要使用rowcolumn作为表的索引。我试了下面的代码(没有中间表Index),它的工作原理,虽然我不确定这是最好的解决方案。

[i,j] = ind2sub(size(T),find(isnan(T{:,:}))); 
T(i,j) = {0}; 
+0

谢谢! 0的最终分配非常缓慢!你知道为什么,如果有更快的方法吗? – Mace 2015-03-31 07:57:59

+0

不是,我没有太多的表经验。但是,你可以尝试'T {i,j} = 0'吗?也许细胞生成缓慢。 – Nemesis 2015-03-31 07:59:38

+0

我试过了,但没有太大的帮助...... – Mace 2015-03-31 08:00:11

一种方法是转换成数组,做逻辑索引替代,然后再回到表:

T = table(rand(200,1),[rand(199,1);NaN],rand(200,1)); 
t = table2array(T); 
t(isnan(t)) = 0; 
T = array2table(t, 'VariableNames', T.Properties.VariableNames); 

另外,考虑仅使用数组,如果这是你可以接受的(无需转换或转换为表格)。

+1

我也认为数组是最好的解决方案时,只使用数字数据。 – Nemesis 2015-03-31 10:28:14