Хотя eval функция очень мощная и гибкая, это не всегда лучшее решение проблемы программирования. Код, вызывающий eval часто менее эффективен и труднее для чтения и отладки, чем код, использующий другие функции или языковые конструкции. Например:
MATLAB ® компилирует код при первом запуске, чтобы повысить производительность для будущих запусков. Однако, потому что код в eval оператор может изменяться во время выполнения, он не компилируется.
Код в пределах eval оператор может неожиданно создать или назначить переменную, уже находящуюся в текущей рабочей области, перезаписав существующие данные.
Конкатенированные векторы символов в пределах eval оператор часто трудно прочитать. Другие языковые конструкции могут упростить синтаксис в коде.
Для многих распространенных видов использования eval, существуют предпочтительные альтернативные подходы, как показано в следующих примерах.
Частое использование eval функция для создания наборов переменных, таких как A1, A2, ..., An, но этот подход не использует вычислительную мощность массива MATLAB и не рекомендуется. Предпочтительным способом является хранение связанных данных в одном массиве. Если наборы данных имеют различные типы или размеры, используйте структуру или массив ячеек.
Например, создайте массив ячеек, содержащий 10 элементов, где каждый элемент является числовым массивом:
numArrays = 10; A = cell(numArrays,1); for n = 1:numArrays A{n} = magic(n); end
Доступ к данным в массиве ячеек осуществляется путем индексирования фигурными скобками. Например, отобразить пятый элемент A:
A{5}ans =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9Оператор присвоения A{n} = magic(n) является более элегантным и эффективным, чем этот призыв к eval:
eval(['A', int2str(n),' = magic(n)']) % Not recommended
Дополнительные сведения см. в разделе:
Связанные файлы данных часто имеют общее корневое имя с целочисленным индексом, например myfile1.mat через myfileN.mat. Обычное (но не рекомендуемое) использование eval функция состоит в построении и передаче каждого имени файла функции с использованием синтаксиса команды, например,
eval(['save myfile',int2str(n),'.mat']) % Not recommended
Рекомендуется использовать синтаксис функции, позволяющий передавать переменные в качестве входных данных. Например:
currentFile = 'myfile1.mat';
save(currentFile)Можно создать имена файлов в цикле с помощью sprintf функция (которая обычно более эффективна, чем int2str), а затем вызовите save функция без eval. Этот код создает 10 файлов в текущей папке:
numFiles = 10; for n = 1:numFiles randomData = rand(n); currentFile = sprintf('myfile%d.mat',n); save(currentFile,'randomData') end
Дополнительные сведения см. в разделе:
Общее использование eval - выполнять функцию, если имя функции находится в векторе переменных символов. Существует два способа оценки функций из переменных, которые более эффективны, чем использование eval:
Создание дескрипторов функций с помощью @ или с помощью символа str2func функция. Например, запустите функцию из списка, хранящегося в массиве ячеек:
examples = {@odedemo,@sunspots,@fitdemo};
n = input('Select an example (1, 2, or 3): ');
examples{n}()Используйте feval функция. Например, вызовите функцию графика (например, plot, bar, или pie) с данными, заданными во время выполнения:
plotFunction = input('Specify a plotting function: ','s'); data = input('Enter data to plot: '); feval(plotFunction,data)
Доступ к данным в структуре с именем поля переменной осуществляется путем включения выражения поля в круглые скобки. Например:
myData.height = [67, 72, 58]; myData.weight = [140, 205, 90]; fieldName = input('Select data (height or weight): ','s'); dataToUse = myData.(fieldName);
При вводе weight в приглашении на ввод можно найти минимальное weight значение с помощью следующей команды.
min(dataToUse)
ans =
90Дополнительный пример см. в разделе Создание имен полей из переменных.
Предпочтительным способом обработки ошибок в MATLAB является использование try, catch заявление. Например:
try B = A; catch exception disp('A is undefined') end
Если рабочая область не содержит переменных A, то этот код возвращает:
A is undefined
Предыдущие версии документации для eval функция включает синтаксис eval(expression,catch_expr). При оценке expression ввод возвращает ошибку, затем eval оценивает catch_expr. Однако явное try/catch значительно яснее, чем неявный улов в eval заявление. Использование неявного захвата не рекомендуется.