在Matlab中从Structs中将变量加载到函数中

时间:2014-12-23 10:43:11

标签: matlab

假设我有一个由以下项目组成的项目:

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

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

通常这些功能构成了运行时的大部分时间,我试图节省时间,因为我的模拟无法实时运行(最终目标),而且我失去了很多时间传递函数周围的变量/参数。所以我有三个想法尝试这样做:

  1. 在主模拟中加载结构,然后以大参数(当前解决方案)的形式将每个变量依次传递给函数。
  2. 每次调用函数时加载结构。
  3. 将结构体定义为全局变量。
  4. 就系统的效率而言(随着项目的发展而最相​​关),并且可能因为我没有来自良好实践的专家程序员和#34;透视什么是最好的解决方案?还有其他选择我没有考虑过吗?

2 个答案:

答案 0 :(得分:1)

如上文评论中所述 - 第1项是最佳项目。

您是否使用过探查器来查找代码占用大部分时间的位置?

profile on % run your code profile viewer

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

答案 1 :(得分:0)

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

如果您的子程序正在改变数组的一小部分,那么最好的办法就是将这一小部分传递给它,然后分配输出。例如,

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

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

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