Несмотря на то, что функция 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 (такую как 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
. Используя неявную выгоду не рекомендуется.