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