我有来自不同作者的老年代码,他们使用多年的全局变量以及以下挑战:我从excel文件导入了几个(> 200)变量。它们不在函数内部,并且不被指定为全局函数。为了使函数起作用,它们必须是因为有一个函数1调用函数2.函数1仅调用一次而函数2调用> 10000次,所以我希望任何全局函数都在函数内.1我很容易将它们全部变成全局变量并将它们传递给函数2?
示例(方案)
% function1
% global *other variables exist here already*
% this function calls function2 at a certain point further below
L=whos
save L % some variables a b c ... are parameters in function2
% function2
% global *other variables exist here already*
load L % i dont want to load my workspace everytime, I rather wish to just access global variables a b c...
% the problem is that my variables sometimes change name and I want to have
% them all global in an automatic way. Or live with a workaround.
感谢您的耐心等待,我随时准备提问!
更新I:
我管理了一个解决方法,我不完全满意,因为它涉及代码中的手动操作。所以这是一个临时的解决方案。
%假设您有一些工作区变量,并以此名称保存它们,然后加载它们: load workspacevars.mat;
L = who%将这些变量的名称作为字符串列 L = L'%,并且使您能够将其用作全局(如行)
%不幸的是,使用全局L并不适合我。有任何想法吗? %我必须在工作区中转到L,然后单击并将生成的长字符串拖动到文本编辑器中。 在那里,我删除了大括号{}和'',因为这是全局喜欢变量的方式:纯。
%最终它看起来像这样:global var1 var2 var3 ....
答案 0 :(得分:0)
答案是,使用结构文件而不是全局变量。
创建结构后,(c.constant1,c.constant2 ...),您只需提供问题c中的函数。我过去经常使用工作区,这解释了为什么我保存我的工作区并加载它一次(因为常量不改变,所以这不是很多次)所以这就是它的样子:
mainfunction
c.constant1=1;
save c.mat
[Time,Results] = ode15s(@(x, c) f1(x, c),[0 c.length],x0,options)
end
function [OUTPUT] = f1(t, x, c)
load c.mat
end
输入是x和c,它们可以在主函数和子函数之间自由共享。如果常量由于函数中的某些事件而发生变化,它们可能会在子函数内部使用if条件保存,并在代码的下一次迭代中重新加载(但这是另一个问题:Change a constant in ODE calculations under particular conditions with a flag)