我有两个并行的Matlab会话。
为方便起见,我只是将每次运行中硬编码的参数更改为脚本。
所以我的问题是,当第一个Matlab会话运行该脚本时,我可以更改脚本吗?在我更改并保存了那个脚本之后,第一个Matlab会话是否会根据脚本的原始版本运行?
我有多个相互调用的脚本。在这种情况下会更复杂吗?
如果答案是肯定的,那么在我看来,对于每次运行,Matlab都会制作所有脚本的临时副本并运行该副本而不管硬盘更改。
答案 0 :(得分:7)
MATLAB按下“run”后的第一步是将所有脚本/函数的M代码及其所有依赖项解析为类似于“字节代码”的东西。这意味着无论MATLAB运行什么,它都完全在内存中,因此不再与M文件中的内容耦合。
因此,您可能确实使用另一个MATLAB会话来更改M文件中的参数,保存它,并在新会话中运行它,而不会影响第一个会话的结果。
请务必保存或打印这些变量的值;以这种方式工作是一种确定的方法,可以忘记这些参数的哪些值再次属于哪个会话:)
请注意,这不适用于:
答案 1 :(得分:1)
更好的工作流程是将这些脚本转换为接收可配置参数作为输入的模块化函数,而不是对代码中的值进行硬编码。
这样你在每个MATLAB会话中调用相同的函数而不对M文件进行任何更改,只有每个会话根据需要传递不同的输入参数。
要了解有关MATLAB如何检测M文件更改的更多信息,请运行以下命令:
>> help changeNotification
>> help changeNotificationAdvanced
您还可能还想了解以下功能:rehash
和clear functions
找出当前“加载到内存中”哪些脚本/函数的一种方法是使用inmem
。比如说我们将以下脚本保存在路径上可用的文件中(对于函数也是如此):
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上进行测试,看看是否有相同的效果......
答案 2 :(得分:0)
可以在不影响正在进行的运行的情况下更改脚本。但是,如果您的流程变得更加复杂,那么依赖于将会发生什么可能会有问题:
以下是您不太可能需要的一些流程:
main1
来电sub
sub
已修改main2
调用sub main1
继续投放并再次致电sub
在上面的情况中,我希望第二轮main1
能够调用sub
的更改版本,但我不会依赖它。
main1
来电sub
sub
已修改sub
调用的main1
点击了一个断点我甚至不确定会发生什么,但我相信你会停在原来的路线上,但会看到编辑后的代码。所以你找到的那条线甚至可能不再是断点线。
总而言之:不要经常改变你的脚本来改变输出,而是给它输入来决定输出。