如何获取Matlab脚本(*.m)文件访问的工作空间变量列表?

如何获取Matlab脚本(*.m)文件访问的工作空间变量列表?,matlab,variables,workspace,Matlab,Variables,Workspace,是否有代码分析功能/实用程序,提供.m脚本文件使用/访问的现有工作区变量列表 情景: 三个脚本按顺序运行。第一个是一组变量。第二个使用第一个生成的变量子集。第三个使用由第一个和第二个脚本生成的变量子集。 我想要一个由第二个和第三个脚本访问的变量列表。我不想要who()提供的完整的变量列表。这不是一个简单的方法,但是我想我已经想到了一种方法,它确实假设您的脚本运行很快,否则它将永远运行每个脚本多次以找到依赖项 在我详细介绍之前-短期内,尤其是长期内,一个更好的解决方案是将脚本转换为函数-这真的没那

是否有代码分析功能/实用程序,提供.m脚本文件使用/访问的现有工作区变量列表

情景: 三个脚本按顺序运行。第一个是一组变量。第二个使用第一个生成的变量子集。第三个使用由第一个和第二个脚本生成的变量子集。
我想要一个由第二个和第三个脚本访问的变量列表。我不想要who()提供的完整的变量列表。

这不是一个简单的方法,但是我想我已经想到了一种方法,它确实假设您的脚本运行很快,否则它将永远运行每个脚本多次以找到依赖项

在我详细介绍之前-短期内,尤其是长期内,一个更好的解决方案是将脚本转换为函数-这真的没那么难,我已经用客户端代码做了很多次了)。

那么如何使用脚本来实现它

为了演示,我创建了3个用于测试的虚拟脚本

% SCRIPT 1 - a truly horrible way to create variables - NEVER do this in practice...
for ii=97:122
  eval ( sprintf ( '%s = %i;', char(ii), ii ) );
end
脚本2

% SCRIPT 2 - simply access some of the variables created above.
e;
a;
b;
c;
h;
t;
v;
脚本3

% SCRIPT 3 - a similar script which access vars (some shared with 2)
a;
b;
c;
e;
m;
n;
v;
z;
现在,我们创建了一个方法,该方法将多次运行脚本,每次删除每个变量,以检查是否需要:

function testScript
  % run script 1 to get all variables
  script1;
  % save to a temp file
  save ( 'temp' );
  % run the function that does the work
  runner ( 'temp' )
end
function runner ( fname )
  % load the variables
  allvars = load(fname);
  % extract out all the variables
  fnames = fieldnames(allvars);
  % calculate the number of total variables
  nvars = length(fnames);
  % create a array to save whether the script runs or not
  flags = true(nvars,1);
  % loop through all variables - removing them 1 at a time from the 
  %  workspace to see if the dependent script runs without each variable
  for iCount=1:nvars
    % run the test
    flags(iCount) = runTestWithoutVar ( fname, fnames{iCount} );
  end
  % display the variables required to run the script.
  disp ( fnames(~flags) )
end
function flag = runTestWithoutVar ( fname, removeVar )
  % load the data
  load(fname)
  % remove one variable
  clear ( removeVar )
  try
    % try to run script2
    script2;
    % You can also run script3 -> that will produce a complete list
    %     script3;
    % return true is script runs okay.
    flag = true;
  catch
    % return false if it crashes (i.e. that variable was needed)
    flag = false;
  end
end
我重复了几点:

  • 如果您的脚本速度慢,这可能是不现实的
  • 转换为函数会更好!:)
    我可以建议另一种不太清楚的方法

  • 创建Simulink项目(主页->新建->Simulink项目)。不要 麻烦了,我们不需要任何Simulink
  • 将脚本添加到项目中
  • 运行依赖关系分析
  • 对于测试,我创建了一个m文件xz.m

    z = a + 4 * b;
    disp(z);
    
    这是结果。希望这有帮助。

    @TroyHaskin我认为这不是复制品。OP还希望获取已访问(读取)的变量。这是困难的,即使你不考虑邪恶<代码> EVA/COD>。使用
    load
    ,脚本可以将任意变量加载到工作区中,同样,使用
    save
    和变量参数可以读取任意变量。见鬼,即使是MATLAB编辑器也不能很好地检测未定义变量的访问…@TroyHaskin,Zeemonkez是对的。我没有答案,但是:如果存在('foo','var'),你是否计算
    ;bar=foo;结束
    是否访问
    foo
    这是一种可怕的编码方式,对输入和输出使用适当的函数,而不是依赖于像那样的依赖脚本!无论如何,在这里可能会有一些关于FEX的意见可以提供帮助:fdep、farg……在向函数传递和返回矩阵时没有内存损失!MATLAB使用写时惰性复制策略,只要函数输入未修改,就将其视为类似于C/C++的“pass by const ref”。。在MATLAB中编写
    A=0(…某个大垫子…);B=A
    它将共享数据,只有在您进行修改时才会复制。所以你没有理由不使用函数!matlabgui,谢谢你的回答。在我的作品中,第二个脚本需要30多分钟。我想知道不使用函数是否是一种编程反模式:)。您可以尝试并确定什么需要时间(您的
    配置文件
    ),并且您可以进行一些小的修改,以减少评估可变问题所需的时间……Zvord,视觉输出非常吸引人。当我第一次有时间玩Simulink时,我肯定会喜欢探索它。:)