MATLAB: вызов файлов .m в цикле - PullRequest
2 голосов
/ 01 ноября 2009

Как мне вызвать 3 файла MATLAB .m в цикле и отобразить результаты в последовательности?

Ответы [ 2 ]

5 голосов
/ 02 ноября 2009

Другой вариант (в дополнение к Amro's ) заключается в использовании функциональных ручек :

fileList = {@file1 @file2 @file3};  % A cell array of function handles
for iFile = 1:numel(fileList)
  fileList{iFile}();                % Evaluate the function handle
  pause                             % Wait for a keypress to continue
end

Вы можете вызвать функцию, используя ее дескриптор , как я делал выше, или используя функцию FEVAL . Если у вас есть имя функции в строке, вы можете использовать функцию STR2FUNC , чтобы преобразовать ее в дескриптор функции (при условии, что это не вложенная функция , для которой требуется дескриптор функции конструктор @). Следующий пример иллюстрирует каждую из этих альтернатив:

fileList = {str2func('file1') str2func('file2') str2func('file3')};
for iFile = 1:numel(fileList)
  feval(fileList{iFile});           % Evaluate the function handle
  pause                             % Wait for a keypress to continue
end

Чем отличаются два ответа?

Вам может быть интересно, в чем разница между моим ответом (с помощью дескрипторов функций) и Amro (с использованием строк). Для очень простых случаев вы, скорее всего, не увидите никакой разницы. Однако вы можете столкнуться с более сложными проблемами определения объема и приоритетов функций , если вы используете строки для имен функций и оцениваете их с помощью EVAL . Вот пример для иллюстрации ...

Допустим, у нас есть два m-файла:

fcnA.m

function fcnA
  disp('I am an m-file!');
end

fcnB.m

function fcnB(inFcn)
  switch class(inFcn)       % Check the data type of inFcn...
    case 'char'             % ...and do this if it is a string...
      eval(inFcn);
    case 'function_handle'  % ...or this if it is a function handle
      inFcn();
  end
end
function fcnA                   % A subfunction in fcnB.m
  disp('I am a subfunction!');
end

Функция fcnB предназначена для получения имени функции или дескриптора функции и его оценки. По случайному совпадению (или, возможно, умышленно) в fcnB.m есть подфункция, которая также называется fcnA. Что происходит, когда мы называем fcnB двумя разными способами?

>> fcnB('fcnA')      % Pass a string with the function name
I am a subfunction!
>> fcnB(@fcnA)       % Pass a function handle
I am an m-file!

Обратите внимание, что передача имени функции в виде строки вызывает оценку подфункции fcnA. Это связано с тем, что в тот момент, когда EVAL вызывается, подфункция fcnA имеет наивысший приоритет функции из всех функций с именем fcnA. Напротив, передача дескриптора функции приводит к тому, что вместо этого вызывается m-файл fcnA. Это связано с тем, что дескриптор функции сначала создается , а затем передается fcnB в качестве аргумента. M-файл fcnA является единственным по объему (т. Е. Единственным, который может быть вызван) вне fcnB и, таким образом, является тем, к которому привязан дескриптор функции.

В целом, я предпочитаю использовать дескрипторы функций, потому что я чувствую, что это дает мне больше контроля над тем, какая конкретная функция вызывается, что позволяет избежать непредвиденного поведения, как в приведенном выше примере.

1 голос
/ 02 ноября 2009

Предполагая, что ваши файлы сценарии , содержащие команды построения, вы можете сделать следующее:

mfiles = {'file1' 'file2' 'file3'};
for i=1:length(mfiles)
    eval( mfiles{i} );
    pause
end

где, например, у нас есть:

file1.m

x = 0:0.1:2*pi;
plot(x, sin(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...