2015-01-06 2 views
1

Я запускаю файл .bat, используя команду system (или dos) в цикле parfor в Matlab 2013a. Есть ли способ изменить, в какой каталог запускается команда? До сих пор кажется, что он всегда является текущим (рабочим) каталогом. Другой вариант - изменить рабочий каталог внутри цикла parfor, но это будет означать одновременное использование нескольких рабочих каталогов, что не представляется возможным. Причина, по которой я делаю это, заключается в том, что у меня есть одна модель Simpack и вы хотите одновременно запускать несколько разных симуляций. В последовательном цикле я могу сделать это, скопировав спецификацию моделирования в папку Simpack по одному, а параллельно, это нужно изменить.MATLAB: Запуск abat параллельно: возможно использование нескольких рабочих каталогов?

parfor i=1:2 
    ... 
    cd(path_model_main_temp_i); 
    system('C:\SIMPACK\SIMPACKv8.9\s_8904\simpack\com\spck.bat simpack integ modelname'); 
    copyfile(path_results_temp_i, path_results{i}); 
end 

Этот сниппет не работает, но верно ли оно?

EDIT: Оказалось, что с моим кодом возникла другая проблема. Внутри парфорной петли возможно иметь команду cd.

+0

Я предполагаю, что здесь, как и у меня нет Matlab, так что я не поставил его в качестве официального ответа, но, может быть, попробовать 'систему ('кд где & C: \ SIMPACK ... ') ', который должен позволить ОТДЕЛЬНОМ ПРОЦЕССУ, созданному' system() ', иметь свой собственный отдельный каталог. –

+0

Так просто! Ваше предложение работает хорошо, спасибо. Я также попробую подход Эдрика ниже, но моя проблема на самом деле уже решена. – FliegenderZirkus

+0

Я добавлю его как полноразмерный ответ, так как он работает :-) –

ответ

0

Попробуйте изменить каталог в процессе созданного system() команды - и это хорошо, так как это новый и отличный процесс, он может иметь свой собственный каталог.

Что-то вроде этого:

system('cd somewhere & C:\SIMPACK...'); 
0

Я думаю, что вы на правильном пути здесь. Одна вещь, которую вы могли бы использовать, - getCurrentTask, чтобы определить, где разместить этот каталог. Например, что-то вроде этого:

parfor idx = 1:2 
    t = getCurrentTask(); 
    if isempty(t) 
     % running on the client - use tempdir 
     d = tempdir(); 
    else 
     % on a worker - make a subdirectory using task ID 
     d = fullfile(tempdir(), num2str(t.ID)); 
     mkdir(d); 
    end 

    cd(d); 
    pwd 
    % do stuff 
end 
+0

Я вижу, что действительно возможно иметь больше рабочих каталогов «в то же время» в парфоре. Была проблема с моим исходным кодом, не связанным с этим. Спасибо за ваш ответ, но я по-прежнему буду иметь возможность добавить команду 'cd' в' system', потому что она выглядит более чистой для меня. – FliegenderZirkus

Смежные вопросы