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

时间:2015-07-29 21:06:56

标签: matlab

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

fileName是要运行的脚本的名称,而TestCaseNum是fileName所依赖的var,这就是那里的原因

    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 个答案:

答案 0 :(得分:0)

如果我理解正确,你有

  1. 一个脚本,基本上是MATLAB基础工作区
  2. 从此脚本调用的函数runCalScript,工作区#2
  3. 从函数调用的第二个脚本,共享工作区#2
  4. 然后函数也会看到第二个脚本中的变量。我认为您可以查看函数工作空间的每个变量,就像在您的示例中一样,然后使用assignin在base(= caller)工作空间中重新创建这些变量。像这样:

    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];

    更确切地说,这正是您想要实现的目标。你确定需要这个吗?为什么不将变量作为函数的输出参数返回?

    更新:您可以将每个变量的值添加到whos给出的结构中,作为名为val的新字段(例如):

    for i=1:length(whosValues)
           whosValues(i).val=eval(whosValues(i).name);
    end
    

    然后只需将whosValues设置为输出参数,将您的函数声明为

    function [a b whosValues]=runCalScript(fileName,testCaseNum)