필터 지우기
필터 지우기

Automatically Assigning base workspace variables

조회 수: 8 (최근 30일)
Abhijit
Abhijit 2013년 9월 24일
편집: David Arriola 2014년 10월 9일
I have almost 250 variables that I need to assign in the base workspace inside a PARFOR loop. Is there an automated way of doing this other than writing assignin('base','var',var) for each variables?
  댓글 수: 4
Abhijit
Abhijit 2013년 9월 24일
Well, I am trying to do parallel simulation and one of the matlab webinars say that variables have to be assigned for each simulink model's variable into the base workspace for parallel simulation.
As Walter had mentioned variables had to be defined via assignin in order to make them available.
Image Analyst
Image Analyst 2013년 9월 24일
OK - I don't have Simulink. I added it to the product list for you so others will know.

댓글을 달려면 로그인하십시오.

채택된 답변

Walter Roberson
Walter Roberson 2013년 9월 24일
Avoid doing that. For example create only a single struct and assignin() the struct.
  댓글 수: 6
Abhijit
Abhijit 2013년 9월 24일
Hi Walter, Thanks for your answer. Structure would work for the simple exam I showed.
In my actual problem, the variables are getting generated behind the scenes. So, are there any other way for doing this? Can I leverage WHO in some way to do this.
Abhijit
Abhijit 2013년 9월 25일
I think I have figured out a way.
a = -1;
b = 1;
c = 1;
d = 0;
W = who;
for i1 = 1:length(W)
Wval{i1} = eval(W{i1});
end
KIdx = 0:0.1:1;
iterations = length(KIdx);
simout(iterations) = Simulink.SimulationOutput;
parfor idx = 1:iterations
load_system(mdl);
for i1 = 1:length(W)
assignin('base',W{i1},Wval{i1});
end
assignin('base','K',KIdx(idx));
try
simout(idx) = sim(mdl,'SimulationMode','normal');
catch exception
error_var{idx} = lasterror
stack_var{idx} = dbstack
exception_var{idx} = getReport(exception,'extended')
end
end

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

David Arriola
David Arriola 2014년 10월 9일
편집: David Arriola 2014년 10월 9일
I have a similar problem to the one described above. I tried the solution proposed by Abhijit but I always get the following error: - Can somebody help me to get this right?
"It is illegal to use a Composite within the body of a parfor loop
Caused by: Error using distcomp.remoteparfor (line 72) Composite objects cannot be used within a parfor loop."
My code can be seen below:
list = who;
N = length(list);
for j = 1:N
w{j} = eval(list{j});
end
spmd
% Setup tempdir and cd into it
addpath(pwd);
currDir = pwd;
addpath(currDir);
tmpDir = tempname;
mkdir(tmpDir);
cd(tmpDir);
end
%Set parameter values with reduced comb. matrix and simulate all combs.
parfor m = 1:1:num_comb_red
load_system(uParam.sysInfo.modelName); % Load the model parameters on the workers
for j = 1:N
assignin('base',list{j}, w{j});
end
for n = 1:1:num_input_param
num_value_red = cell2mat(comb_red(n,m));
path = cell2mat(uParam.uncertainties.all{n,1});
para_name = uParam.uncertainties.all{n,2};
para_value = uParam.uncertainties.all{n,3}(num_value_red);
set_param(path,para_name,num2str(para_value));
end
%Simulate model for all uncertainty combinations and all temperatures
disp('Simulating linear model...')
simOut(i,m) = sim(uParam.sysInfo.modelName,'SimulationMode', uParam.simInfo.simMode, 'StopTime', uParam.simInfo.simTime);
disp('finished')
end

카테고리

Help CenterFile Exchange에서 Startup and Shutdown에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by