Отказ от использования eval
в настоящее время довольно прост в MATLAB. Если вы определяете typeTest
как набор функциональных дескрипторов вместо строк, вы на 99% пути:
a{1}=[1 2 3 4];
a{2}=[5 1 4 6];
typeTest{1}=@le; % <=
typeTest{2}=@lt; % <
%create function
funCheck=@(x,y)y(x,0);
%works
funCheck(1,typeTest{1})
%apply on cell
cellfun(funCheck,a,typeTest,'UniformOutput',false)
Обратите внимание, что я добавил 'UniformOutput',false
к аргументам cellfun
. Это создает массив ячеек в качестве выходных данных, где каждая ячейка является результатом отдыха для одного из элементов в a
и соответствующего элемента в typeTest
. То есть {1} проверяется с помощью TypeTest{1}
, а a{2}
проверяется с помощью TypeTest{2}
.
Я бы на самом деле создал массив со всеми фактическими тестами, вот так:
checks = { @(x)x<=3 , @(x)x>4 };
Теперь вы кодируете оператор, а также правый операнд. Это дает вам возможность создавать другие типы чеков: @(x)var(x)<1e-3
, @(x)max(diff(x))<1
и т. Д.
Чтобы применить каждую из этих проверок к каждому массиву данных, вы должны использовать bsxfun
. Я попробовал следующее утверждение, но в Octave 3.0.0 оно работало некорректно (думаю, это может быть ошибкой):
bsxfun( @(fun,data){fun{1}(data{1})}, checks(:)', a(:) )
Создает массив ячеек 2x2 (число проверок, умноженное на количество массивов данных) с результатами.
Уродливая альтернатива вышесказанному, которая сработала:
cellfun( @(fun,data)fun(data), ...
repmat(checks(:)',numel(a),1), ...
repmat(a(:),1,numel(checks)), ...
'UniformOutput',false)