Как мне избавиться от NANS в MATLAB?
Вопрос
У меня есть файлы, в которых много пустых ячеек, которые отображаются как NANS, когда я использую cell2mat
, но проблема в том, что когда мне нужно получить средние значения, я не могу работать с этим, так как это показывает ошибку с 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)
.Как я могу это сделать?
Решение
Используйте функцию ' isfinite ' , чтобы избавиться от всех NaN и бесконечностей
A=A (конечен(A))
%создайте массив ячеек, содержащий заголовки столбцов ColumnHeader = {'Столбец 1', 'Столбец 2', 'Столбец 3', 'Столбец 4', 'Столбец 5',' '};
%сначала запишите заголовки столбцов xlswrite('myFile1.xls', ColumnHeader );
% запишите данные непосредственно под заголовками столбцов xlswrite('newFile.xls',M, 'Sheet1','A2');
Другие советы
Как правильно указывает AP, вы можете использовать функцию 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
Другой альтернативой является использование некоторых функций из Статистический инструментарий (если у вас есть к нему доступ), которые предназначены для работа с матрицами, содержащими значения NaN.Поскольку вы упомянули о взятии средних значений, возможно, вы захотите проверить 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
Statistics Toolbox имеет несколько статистических функций для работы со значениями NaN.Смотрите nanmean, nanmedian, nanstd, nanmin, nanmax и т.д.
Вы можете присвоить NaN произвольное число следующим образом:
mat(isnan(mat))=7 // my lucky number of choice.
Может быть, уже слишком поздно, но...
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