将函数工作空间变量值获取到基本工作空间



我需要在我的脚本内运行一个脚本,并从该脚本到当前脚本的所有变量和值,而不混合工作区。我虽然我可以写一个函数来运行脚本并返回我需要的一切,但我似乎无法使它工作,下面是我失败的尝试。请帮. .

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;

如果我理解正确的话,你有

  1. 一个脚本,基本上与MATLAB基本工作空间
  2. 从这个脚本调用的函数runCalScript,工作空间#2
  3. 第二个脚本,从函数调用,共享工作空间#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)

最新更新