我正在使用Octave(或Matlab......我两者都有),并试图创建一个函数,以设置我的重要变量,在我的调查的其余部分使用。
然而,默认情况下,在函数中声明的变量只有该函数的有限范围。
有什么方法可以做到这一点吗?
function defineBasicTerms()
global G = 9.807;
global F = [exp(1) 0; 0 1/exp(1)];
endfunction
以便在调用这个函数后,变量 G
和 F
存在于全局命名的变量集中?
全局变量需要在使用它们的每个作用域中声明。例如,如果你有一个函数 M-file defineBasicTerms.m
包含。
function defineBasicTerms
global G = 9.807;
end
然后在基础工作区中你可以写。
defineBasicTerms
G % produces error: variable doesn't exist
global G
G % gives 9.807
接下来,在一个使用常量的函数中 G
:
function out = computeSomethingImportant(m)
global G
out = G * m;
end
也就是说,每次我们想使用 G
我们要做 global G
要访问的全局变量 G
.
请注意,这是一个非常危险的情况。有两种情况会出错。
一些函数将全局变量 G
,改变其在当前会话剩余时间内的值。真的很难知道发生了这种情况,但是...。computeSomethingImportant
将会从这一点上返回错误的值,直到我们再次调用 defineBasicTerms
.
我们称之为 computeSomethingImportant
呼叫前 defineBasicTerms
在会话中,MATLAB中(以及扩展到Octave中)定义常量的既定方法是通过函数。
在MATLAB中(扩展到Octave中),定义常量的既定方法是通过函数。可以将函数写成总是返回相同的值(MATLAB没有其他方法可以将一个变量声明为常量),而且函数在所有工作空间和所有上下文中都自动可用(当然只要函数在路径上)。
在你的例子中,我们会写一个M文件函数,即 G.m
包含。
function value = G
value = 9.807;
end
现在,在基本工作区,
G % gives 9.807
使用常量的函数 G
现在看起来就像这样。
function out = computeSomethingImportant(m)
out = G * m;
end
请注意,常量如 pi
在MATLAB和Octave中是这样定义的。
你必须为每一个你要声明的常量写一个函数M文件。有一种替代方法,涉及到一个具有静态值的类,这样所有的常量都可以在一个文件中定义。然而,语法却变得不同,我们需要使用 constants.G
,或类似的东西,来访问内容值。