Как мне избавиться от NaNs в MATLAB? - PullRequest
5 голосов
/ 17 марта 2010

У меня есть файлы, в которых много пустых ячеек, которые отображаются как NaN, когда я использую 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). Как я могу это сделать?

Ответы [ 5 ]

9 голосов
/ 17 марта 2010

Поскольку 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

Другой альтернативой является использование некоторых функций из Statistics Toolbox (если у вас есть доступ к нему), которые предназначены для работы с матрицами, содержащими значения 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
7 голосов
/ 17 марта 2010

Используйте функцию 'isfinite', чтобы избавиться от всех NaN и бесконечностей

A = A (isfinite (А))

% создать массив ячеек, содержащий заголовки столбцов columnHeader = {'Столбец 1', 'Столбец 2', 'Столбец 3', 'Столбец 4', 'Столбец 5', ''};

% сначала пишут заголовки столбцов xlswrite ('myFile1.xls', columnHeader);

% записывают данные непосредственно под заголовками столбцов xlswrite ( 'newFile.xls', М 'Лист1', 'А2');

5 голосов
/ 17 марта 2010

Statistics Toolbox имеет несколько статистических функций для работы со значениями NaN. См. Nanmean, nanmedian, nanstd, nanmin, nanmax и т. Д.

0 голосов
/ 21 декабря 2014

Может быть слишком поздно, но ...

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
0 голосов
/ 17 ноября 2012

Вы можете установить NaN на произвольное число, например, так:

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