全局变量的替代方案:MATLAB中的持久变量和嵌套函数

问题描述:

首先,我已经看过这个优秀的article了。 我有一个MATLAB脚本,名为sdp。我有另一个MATLAB脚本track。我在sdp之后运行track,因为track使用了一些来自sdp的输出。为了运行轨迹,我需要多次调用一个名为action的函数。我把action定义为一个单独的MATLAB文件中的函数。这个action的每个调用都有一些输入,比如x1,x2,x3,但是x2,x3只是“数据”,它永远不会改变。它们在sdp中相同,在track中相同,并且在action中保持不变。在这里,x2,x3是巨大的矩阵。其中有很多(想想x2,x3,...x10全局变量的替代方案:MATLAB中的持久变量和嵌套函数

跛脚的方式是将x2,x3定义为sdp中的全局然后跟踪,因此我可以调用只有x1的动作。但这会让我的表现难以置信地变慢。我怎样才能通过x1来一次又一次的行动,使它记得x2,x3是什么?每个通话都非常快,如果我以内联方式进行通话,则速度非常快。

也许我可以使用一些持久变量。但我不明白它们是否适用于我的例子。我不知道如何正确使用它们。

看看object oriented programming in Matlab。创建一个action对象,您可以将成员变量x2 ...分配给sdp的结果。然后你可以调用action的方法,只有x1。将对象看作一个带有状态的函数,其中状态信息是sdp的恒定结果。

另一种方法是使用功能性方法,通过action将其追踪为function handle,其中它可以在track的变量上运行。

+0

面向对象的编程方法会更快吗?我不确定。你熟悉持久变量还是嵌套这些函数,或许这是相关的? – bissi

在MATLAB中传递大型矩阵是有效的。在语义上它使用按值调用,但是它被实现为调用引用直到被修改。将所有不变参数包裹在参数结构中并传递给它。

params.x2 = 1; 
params.x3 = [17 39]; 
params.minimum_velocity = 19; 

action('advance', params); 

您已经发现全局变量执行不好。不要担心在某处隐藏变量的语法糖......清楚地看到输入来自哪里,并且性能会很好。

这种方法还可以很容易地添加新的数据成员,甚至是辅助元数据,例如运行描述,执行时间等。结构可以组合成数组来描述具有不同参数的多次运行。

+0

参数结构只是一种美学结构,还是它对性能也有积极影响?这不仅仅是传递x2和x3,而是将它们隐藏在params参数中? 如果我将动作粘贴到我的脚本文件跟踪中,则代码将在闪存中运行。多次调用动作令其令人难以置信。 – bissi

+0

这听起来像函数调用开销。参数传递可能不是问题。请记住,函数优化比脚本更好,所以确保一切都是函数。 – Peter