如何在MATLAB中摆脱NaN?

时间:2010-03-17 18:00:21

标签: excel matlab nan

我有一些文件有许多空单元格,当我使用cell2mat时它们显示为NaN,但问题是当我需要获得平均值时我无法使用它,因为它显示NaN的错误。在excel中它忽略了NaN值,那么我如何在MATLAB中做同样的事情呢?

此外,我正在使用xlswrite编写文件:

xlswrite('test.xls',M);

我的所有行都有数据,除了1.我怎么写:

M(1,:) = ('time', 'count', 'length', 'width')

换句话说,我想要M(1,1)='time'M(1,2)='count'等等。我有M(2,1)M(10,20)的数据。我怎么能这样做?

5 个答案:

答案 0 :(得分:9)

As AP correctly points out,您可以使用函数isfinite在矩阵中查找并保留有限值。您还可以使用函数isnan。但是,从矩阵中删除值会导致将矩阵重新整形为行或列向量的意外后果:

>> mat = [1 2 3; 4 NaN 6; 7 8 9]  % A sample 3-by-3 matrix

mat =

     1     2     3
     4   NaN     6
     7     8     9

>> mat = mat(~isnan(mat))  % Removing the NaN gives you an 8-by-1 vector

mat =

     1
     4
     7
     2
     8
     3
     6
     9

另一种选择是使用Statistics Toolbox中的某些功能(如果您有权访问它),这些功能是为deal with matrices containing NaN values设计的。由于您提到取平均值,您可能需要查看nanmean

>> mat = [1 2 3; 4 NaN 6; 7 8 9];
>> nanmean(mat)

ans =

     4     5     6     % The column means computed by ignoring NaN values



编辑:要回答有关使用xlswrite的其他问题,此示例代码应说明您可以编写数据的一种方式:

C = {'time','count','length','width'};  % A cell array of strings
M = rand(10,20);                        % A 10-by-20 array of random values
xlswrite('test.xls',C);           % Writes C to cells A1 through D1
xlswrite('test.xls',M,'A2:T11');  % Writes M to cells A2 through T11

答案 1 :(得分:7)

使用'isfinite'功能去除所有NaN和无穷大

A = A(ISFINITE(A))

  

%创建包含列标题的单元格数组   columnHeader = {'第1列','第2列','第3列','第4列','第5列',''};

     

%首先写入列标题   xlswrite('myFile1.xls',columnHeader);

     

%直接在列标题下写入数据   xlswrite( 'newFile.xls',M '表Sheet 1', 'A2');

答案 2 :(得分:5)

统计工具箱有几个统计函数来处理NaN值。参见nanmean,nanmedian,nanstd,nanmin,nanmax等。

答案 3 :(得分:0)

您可以将NaN设置为任意数字,如下所示:

mat(isnan(mat))=7 // my lucky number of choice. 

答案 4 :(得分:0)

可能为时已晚,但......

x = [1 2 3; 4 inf 6; 7 -inf NaN];
x(find(x == inf)) = 0; //for inf
x(find(x == -inf)) = 0; //for -inf
x(find(isnan(x))) = 0; //for NaN