我有一些文件有许多空单元格,当我使用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)
的数据。我怎么能这样做?
答案 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