将所有当前工作区变量转换为全局变量

时间:2014-11-21 21:14:43

标签: excel matlab function global workspace

我有来自不同作者的老年代码,他们使用多年的全局变量以及以下挑战:我从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 ....

1 个答案:

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