【问题标题】:Loading Variables into Functions from Structs in Matlab将变量从 Matlab 中的结构加载到函数中
【发布时间】:2014-12-23 10:43:11
【问题描述】:

假设我有一个项目,其中包括:

  • 处理我的所有模拟运行的主脚本
  • 几个较小的函数
  • 几个包含数据的结构体

在脚本中,我将在 for 循环中多次访问这些函数(在长达一分钟的模拟中有些超过一千次)。每个函数也在寻找包含在结构文件中的数据作为其计算的一部分,这些数据通常是在模拟过程中固定的参数,但是需要在运行之间手动改变以观察效果。

由于这些函数通常构成运行时的大部分,我试图节省时间,因为我的模拟不能完全按照目前的方式实时运行(最终目标),而且我会浪费很多时间来传递变量/ 函数周围的参数。所以我有三个想法来尝试这样做:

  1. 在主模拟中加载结构体,然后将每个变量以大参数的形式依次传递给函数(当前解决方案)。
  2. 每次调用函数时加载结构。
  3. 将结构定义为全局变量。

就系统的效率(随着项目的发展而最相​​关)以及从“良好实践”的角度来看,我可能不是专业程序员而言,最好的解决方案是什么?还有其他我没有考虑过的选择吗?

【问题讨论】:

  • 第一个对我来说似乎最有效。
  • 传递和引用结构变量是一种高效的操作。寻找其他地方来优化软件。查看您当前从循环中调用的函数是否可以向量化以一次处理整个
  • 向我们提供更多关于您的代码究竟在哪里变慢的信息​​会很有帮助。我提供了一个答案,但鉴于您在回应 matlabgui 的回答时所说的一些内容,我不确定它是否会有所帮助。

标签: matlab


【解决方案1】:

正如上面在 cmets 中提到的 - 第一项是最好的。

您是否使用探查器来找出您的代码花费最多时间的地方?

profile on % run your code profile viewer

注意:如果您在子函数中修改输入结构 -> 这将花费更多时间,但如果您只是引用它们,那么这应该不是问题。

【讨论】:

  • 感谢您的回答,是的,我一直在使用分析器来了解流程。作为一名物理学家,我并不精通编写特别有效或“好”的代码,虽然在某些地方需要时间,但我的论点开始采用的规模变得愚蠢。如果您想要详细信息,可以使用一个函数更改几个结构值,然后将其传递回模拟的其余部分以再次读取。变化的功能很小,影响不大,通常是较大的瓶颈。
【解决方案2】:

在函数之间传递参数时,Matlab 会执行所谓的“lazy copy”。这意味着它将指向数据的指针传递给函数,而不是创建该数据的新实例,这在内存和速度方面非常有效。但是,如果您在子例程中对该数据进行任何更改,则它必须创建该参数的新实例,以免覆盖主函数中的参数值。您对 matlabgui 的回复表明您正在这样做。因此,子例程可能在每次调用时都在创建一个全新的结构,即使它只修改了该结构值的一小部分。

如果您的子例程正在更改数组的一小部分,那么您最好的选择是将那一小部分传递给它,然后分配您的输出。例如,

[modified_array] = somesubroutine(struct.original_array);
struct.original_array=modified_array;

您也可以在一行中完成此操作。从概念上讲,传递给子例程的数据越少,内存占用就越小。我还建议阅读in-place operations,因为它与此有关。

此外,作为一般规则,不要在 Matlab 中使用全局变量。我没有亲身经历过,也没有读过他们真正更快的例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2011-07-03
    • 1970-01-01
    • 2014-12-01
    • 2011-09-20
    • 1970-01-01
    相关资源
    最近更新 更多