exponenta event banner

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

Почему нужно избегать функции оценки?

Хотя 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 заявление. Использование неявного захвата не рекомендуется.