【问题标题】:Can I change the script from one Matlab session while the other one is running that script?我可以从一个 Matlab 会话中更改脚本,而另一个正在运行该脚本吗?
【发布时间】:2014-01-20 12:33:57
【问题描述】:

我有两个 Matlab 会话并行运行。

为了方便起见,我只是在每次运行时更改硬编码到脚本中的参数。

所以我的问题是,我可以在第一个 Matlab 会话运行该脚本时更改该脚本吗?在我更改并保存了那个脚本之后,第一个 Matlab 会话会按照脚本的原始版本运行吗?

我有多个相互调用的脚本。这种情况会更复杂吗?

如果答案是肯定的,在我看来,对于每次运行,Matlab 都会制作所有脚本的临时副本并运行该副本,而不管硬盘是否发生变化。

【问题讨论】:

  • @RobertP。你是部分正确的。我实际上使用带有无限循环的脚本进行了尝试。但是后来我意识到我有多个脚本互相调用所以我的问题的重点实际上是第二部分,这是关于matlab解析过程的机制。罗迪以一种很棒的方式回答了这个问题

标签: matlab parallel-processing


【解决方案1】:

按下“运行”后,MATLAB 的第一步是将所有脚本/函数的 M 代码及其所有依赖项解析为类似于“字节代码”的内容。这意味着无论 MATLAB 正在运行什么,都完全在内存中,因此不再与 M 文件中的内容耦合。

因此,您确实可以使用另一个 MATLAB 会话来更改 M 文件中的参数、保存它并在新会话中运行它,而不会影响第一个会话的结果。

请务必保存或打印这些变量的值;以这种方式工作是忘记这些参数的哪些值再次属于哪个会话的可靠方法:)

请注意,这不适用于:

  • 数据文件或其他在运行时显式读取的文件
  • MEX 文件

【讨论】:

  • 谢谢。这回答了我问题的两个方面。
  • +1,你怎么知道这一切..?我的意思是,matlab 如何处理计算机内存和对文件的动态访问..?
  • @Adiel:嗯,这就是“多年的经验”倾向于完成的事情:) 我曾经担任过这个人的职位......我花了大约 30 个小时(可能更多)来弄清楚如何这行得通。我感到失去工作的痛苦,因为我没有保存变量,不得不重新做这项工作,发现更改数据文件确实会影响结果,阅读所有文档,等等等等等等。到现在为止,我在 MATLAB 上拥有的不仅仅是10.000 hours of practice
  • @RodyOldenhuis hh..LOL。 +1 评论也... :)
  • 这不是matlab给出的答案。他们说每次对 .m 文件进行函数调用时,都会更新内存中的版本。 uk.mathworks.com/matlabcentral/newsreader/view_thread/261376.
【解决方案2】:

更好的工作流程是将这些脚本转换为模块化函数,接收可配置参数作为输入,而不是硬编码代码中的值。

这样您在每个 MATLAB 会话中调用相同的函数而不对 M 文件进行任何更改,只有每个会话根据需要传递不同的输入参数。


要详细了解 MATLAB 如何检测 M 文件中的更改,请运行以下命令:

>> help changeNotification
>> help changeNotificationAdvanced

您可能还想了解以下函数:rehashclear functions


编辑:

找出哪些脚本/函数当前“加载到内存中”的一种方法是使用inmem。例如,我们将以下脚本保存在路径上可用的文件中(函数同样适用):

testScript.m

x = 10;
disp(x)

现在从一个干净的会话开始,脚本最初没有加载。调用脚本后,文件被加载并保留在内存中:

% initially not loaded
>> ismember('testScript', inmem())
ans =
     0

% execute script
>> testScript
   10

% file is cached in memory
>> ismember('testScript', inmem())
ans =
     1

立即继续同一会话,对文件进行编辑(例如将x 更改为99)。通过再次检查加载的函数/脚本列表,您将看到 MATLAB 已经检测到更改,并通过将缓存版本从内存中删除来使其无效:

>> % .. make changes to testScript.m file

% file is automatically unloaded
>> ismember('testScript', inmem())
ans =
     0

% execute the new script
>> testScript
    99

% the result is cached once more
>> ismember('testScript', inmem())
ans =
     1

我在我的 Windows 机器上测试了上述内容,但我不能保证这种行为是跨平台的,你必须在 Mac/Linux 上测试它,看看是否能正常工作......

【讨论】:

  • +1,完全同意您关于工作流程的说法。
  • @RodyOldenhuis:谢谢。我添加了一条说明如何使用 inmem 检查加载的函数(这也适用于脚本、类和 MEX 函数)。
【解决方案3】:

脚本绝对可以在不影响正在进行的运行的情况下进行更改。但是,如果您的流程变得更加复杂,则取决于将发生的情况可能会有问题:

以下是一些您可能不想要的流程:

  • main1 致电sub
  • sub 已编辑
  • main2 调用子
  • main1 继续运行并第二次调用sub

在上述情况下,我预计 main1 的第二次运行将调用 sub 的更改版本,但我不会依赖它。

  • main1 致电 sub
  • sub 已编辑
  • main1 调用的 sub 遇到断点

我什至不确定会发生什么,但我相信你会停在原行,但会看到编辑后的代码。所以你找到的那一行可能不再是断点所在的那一行了。


因此得出结论:不要频繁更改脚本以更改输出,而是为其提供将确定输出的输入。

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 2013-10-16
    • 2017-12-01
    • 1970-01-01
    • 2021-08-28
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多