Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中从Structs向函数加载变量_Matlab - Fatal编程技术网

在Matlab中从Structs向函数加载变量

在Matlab中从Structs向函数加载变量,matlab,Matlab,假设我有一个项目,包括: 一个主脚本,用于处理我的模拟的所有运行 几个较小的函数 包含数据的两个结构 在脚本中,我将在for循环中多次访问函数(在长达一分钟的模拟中,有些函数访问了一千多次)。每个函数还将查找包含在结构文件中的数据作为其计算的一部分,这些数据通常是在模拟过程中固定的参数,但是需要在运行之间手动更改以观察效果 由于这些函数通常构成了运行时的大部分,我正试图节省时间,因为我的模拟无法按现状实时运行(最终目标),并且我在函数周围传递变量/参数时损失了大量时间。所以我有三个想法来尝试

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

  • 一个主脚本,用于处理我的模拟的所有运行
  • 几个较小的函数
  • 包含数据的两个结构
在脚本中,我将在for循环中多次访问函数(在长达一分钟的模拟中,有些函数访问了一千多次)。每个函数还将查找包含在结构文件中的数据作为其计算的一部分,这些数据通常是在模拟过程中固定的参数,但是需要在运行之间手动更改以观察效果

由于这些函数通常构成了运行时的大部分,我正试图节省时间,因为我的模拟无法按现状实时运行(最终目标),并且我在函数周围传递变量/参数时损失了大量时间。所以我有三个想法来尝试这样做:

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

  • 就系统的效率而言(随着项目的发展,这一点最为重要),而且可能从“良好实践”的角度来看,我不是专业的程序员,那么什么是最好的解决方案呢?还有没有其他我没有考虑过的选项?

    如上述评论中所述,第一项是最好的

    您是否使用了探查器来找出代码在哪里花费了大部分时间

    配置文件打开
    %运行你的代码
    配置文件查看器
    


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

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

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

    [modified_array] = somesubroutine(struct.original_array);
    struct.original_array=modified_array;
    
    您也可以在一行中完成此操作。从概念上讲,传递给子例程的数据越少,内存占用就越小。我还建议大家多读一读,因为它与此相关


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

    第一个对我来说似乎是最有效的。传递和引用结构变量是一个有效的操作。寻找其他地方来优化软件。看看您当前从循环调用的函数是否可以矢量化,以便一次处理整个过程。向我们提供有关您的代码到底在哪里变慢的更多信息会很有帮助。我提供了一个答案,但鉴于您在回答matlabgui的答案时所说的一些话,我不确定这是否会有所帮助。感谢您的回答,是的,我一直在使用探查器来了解流程。作为一名物理学家,我并不擅长编写特别有效或“好”的代码,虽然在某些地方时间是必要的,但我的论点开始变得愚蠢。若您想要详细信息,可以使用一个函数更改两个结构值,然后将其传递回模拟的其余部分以再次读取。虽然变化的函数很小,影响不大,但通常是较大的函数成为瓶颈。