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