2016-04-26 3 views
1

В MATLAB Я пытаюсь выполнить функцию в массиве ячеек, но мне не очень повезло. Я хотел бы создать cellfun, который проверяет, возвращает ли str2double значения NaN, а затем выполняет str2double на значения, которые не являются NaNs. Я пытаюсь использовать анонимную функцию с выражением IF Else в ней, но на самом деле ничего не получаю. Вот что я придумал до сих пор:Функция Matlab Anonymous Если Else

x = cellfun(@(x)~isnan(str2double(x)),str2double(x)) 

Однако это не сработает, может ли кто-нибудь помочь мне?

+0

Что нужно сделать, чтобы клетки, которые возвращают 'NaN' после вызова' str2double' на них? – Dan

+1

Вы могли бы привести пример данных, которые вы пытаетесь ввести. – MZimmerman6

+0

В стороне, вы используете одно и то же имя переменной, чтобы представлять здесь 3 разных понятия. 'x' - это вход, выход, а также переменная анонимной функции. Я думаю, что это, вероятно, будет очень запутанным. По крайней мере, измените имя переменной анонимной функции. – Dan

ответ

3

Вы можете использовать логическую индексацию:

x = {'1', 'NaN', '2', 'NaN'} 
y = str2double(x(~isnan(str2double(x)))) 

y = 
    1  2 

Это звонит str2double дважды, поэтому он может работать немного медленно, если вам нужно сделайте это миллион раз.

EDIT: как указывал Дэн, если вы хотите, чтобы изменить массив ячеек в месте, используйте

x{~isnan(str2double(x))} = str2double(x(~isnan(str2double(x)))) 
+0

Чтобы полностью соответствовать попытке OP, это должно быть 'x (~ isnan (str2double (x))) = str2double (x (~ isnan (str2double (x)))) ' – Dan

+0

@ Dan: хорошая точка - мое решение не меняет массив на месте. – gariepy

+0

Это сработало бы, спасибо. Возможно, я должен сказать, что я спрашиваю, как более четко получить функциональность выражения If Else в функции Anonymous, это был общий пример (хотя я все еще его использую). Возможно, я просто лаем неправильное дерево – Lererferler

0

Вы можете быть в состоянии получить эту работу, используя Loren Shure's встроенный условный:

iif = @(varargin) varargin{2 * find([varargin{1:2:end}], 1, 'first')}(); 

Тогда вы можете попробовать

x = cellfun(@(y)iif(~isnan(str2double(y)), str2double(y), true, y), x, 'uni', 0) 
0

Вот хороший компактный и работает IIF реализации:

iif = @(varargin) varargin{3-(varargin{1}>0)} 

Usage :

Функция возвращает истинное значение, если условие имеет значение true и false_falue в противном случае.

Вот полезный переход от фильтрации клеток (например, для чтения в Ra по xlsread):

numeric_array = cellfun(@(x) iif(isnumeric(x) & ~isempty(x),x,NaN), Ra);