Альтернативные варианты функции eval

Почему Избегают Функции eval?

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

Для просмотра документации необходимо авторизоваться на сайте