我需要在我的脚本内运行一个脚本,并从该脚本到当前脚本的所有变量和值,而不混合工作区。我虽然我可以写一个函数来运行脚本并返回我需要的一切,但我似乎无法使它工作,下面是我失败的尝试。请帮. .
fileName是要运行的脚本的名称,TestCaseNum是fileName依赖的一个变量,这就是为什么这里有
function [a b]=runCalScript(fileName,testCaseNum)
TestCase=0;
TestCase=testCaseNum;
%TestCase=str2num(TestCase);
run(fileName)
a=whos
%whoValues=who;
whosValues=whos;
%fprintf('%s n',fileName);
save('myFile.mat')
matObj = matfile('myFile.mat');
fname=fieldnames(matObj);
matObj.(fname{1})
%WHY DOESN'T THIS WORK??
% for i=1:length(whosValues)
% %temp=whoValues{i,1};
% temp=evalin('base',whosValues(i).name) %base or caller options don't work!
% end;
% for i=1:size(s,1)
% evalin('base',s{i,1})
% end;
如果我理解正确的话,你有
- 一个脚本,基本上与MATLAB基本工作空间
- 从这个脚本调用的函数
runCalScript
,工作空间#2 第二个脚本,从函数调用,共享工作空间#2
然后函数也可以看到第二个脚本中的变量。我认为你可以沿着函数的工作空间的每个变量,就像在你的例子中,然后使用assignin
在基础(=调用者)工作空间中重新创建这些变量。像这样:
function [a b]=runCalScript(fileName,testCaseNum)
TestCase=testCaseNum;
run(fileName);
whosValues=whos;
%this should work
for i=1:length(whosValues)
assignin('base',whosValues(i).name,eval(whosValues(i).name));
end
如果您的函数中有一个变量,例如v
,其值为[1 3 5]
,则在某一点上的赋值将显示
assignin('base','v',[1 3 5]);
我认为这正是你所需要的:它将在你的基本工作空间中评估为v=[1 3 5];
。
更准确地说,这正是您想要实现的。你确定你需要这个吗?为什么不返回你的变量作为函数的输出参数?
Update:您可以将每个变量的值添加到whos
给出的结构体中,作为名为val
的新字段(例如):
for i=1:length(whosValues)
whosValues(i).val=eval(whosValues(i).name);
end
,然后简单地将whosValues
设置为输出参数,将函数声明为
function [a b whosValues]=runCalScript(fileName,testCaseNum)