【问题标题】:running different matlab scripts from different folders by using one script使用一个脚本从不同文件夹运行不同的 matlab 脚本
【发布时间】:2017-04-09 09:00:36
【问题描述】:

我想用一个脚本从不同文件夹运行多个脚本

例如我有以下代码:

Original_AddRun1 = 'F:\UPT\Root\Run\S1.m';
Original_AddRun2 = 'F:\UPT\Root\Run2\S2.m';
Original_AddRun3 = 'F:\UPT\Root\Run3\S3.m';
Original_AddRun4 = 'F:\UPT\Root\Run4\Subfolder\S4.m';

run(Original_AddRun1);
run(Original_AddRun2);
run(Original_AddRun3);
run(Original_AddRun4);

我要运行四个脚本(S1.m、S2.m、S3.m 和 S4.m),它们位于文件夹(Run、Run2、Run3 和 Run4 中的子文件夹)中

上面的 Matlab 是在包含所有文件夹的“根”文件夹中创建的

但是当我运行代码时会发生以下错误

Undefined function or variable 'Original_AddRun2'.

Error in AllRun (line 7)
run(Original_AddRun2);

第一个脚本运行,我得到了我想要的图形,但是当它尝试运行第二个脚本时它停止了,每个单独的脚本都可以完美运行并且之前已经过测试

记住 S2.m 需要 S1.m 生成的变量才能工作,同样 S3.m 需要 S2.m 生成的变量,S4.m 需要 S3.m 生成变量...这就是为什么这些脚本需要按顺序运行并且不能使用Function,因为它使用自己的工作区而不是一般工作区

我使用save() 在每个脚本末尾保存常规工作区,然后清除常规工作区以便能够运行下一个脚本,然后使用load() 在该脚本中将我需要的变量加载到常规工作区以再次使用它们

我觉得有一种更简单的方法可以做到这一点,即迂回方式save()load()

【问题讨论】:

  • 也许你在第一个脚本中调用clear?作为一种解决方案,您可以使用函数而不是脚本。
  • 你为什么要这样做?你想达到什么目的?
  • 如果您从命令行手动运行脚本,了解会发生什么会很有帮助。假设它们都在您的路径中, S1 然后 S2 (在执行 S1 之后)会起作用吗?您的 S1 是否有任何副作用使 S2 无法执行?我最好的选择是:例如,您是否在 S1 结束和/或 S2 开始时清除所有变量?在这种情况下,工作区中不再有任何变量(这就是未定义 Original_AddRun2 的原因)
  • @m7913d @pacta_sunt_servanda 我尝试使用Clear,但它不起作用,它已经用 S1.m (Clear All) 编写,它们不能用作函数,因为 S2.m 使用 S1 .m 的变量和 S3.m 使用 S2.m 的变量等等,而函数(据我所知)不使用一般的工作空间.....我正在处理的这四个脚本来自我的朋友,他问我帮助他完成计算肌肉能量的项目,每个项目大约需要 1 到 2 分钟才能完成......这就是为什么我想编写一个代码来一个一个地运行它们,而我不必留在屏幕上手动操作做吧
  • 我的意思是,您应该使用我的回答中指出的clear

标签: matlab


【解决方案1】:

我认为尽可能避免clear 更容易。它应该只用在主脚本的顶部。解决方案是使用function workspace(通过创建function)而不是全局工作区。通过这种方式,我们避免了混乱的全局工作空间。

ma​​in.m:

clear all

Original_AddRun1 = 'F:\UPT\Root\Run\S1.m';
Original_AddRun2 = 'F:\UPT\Root\Run2\S2.m';
Original_AddRun3 = 'F:\UPT\Root\Run3\S3.m';
Original_AddRun4 = 'F:\UPT\Root\Run4\Subfolder\S4.m';

run(Original_AddRun1);
run(Original_AddRun2);
run(Original_AddRun3);
run(Original_AddRun4);

F:\UPT\Root\Run\S1.m:

function S1()
    ... % global variables (ex. Original_AddRun1) are not defined here
    ... % newly defined variables are not added to global scope
end

【讨论】:

  • 它不起作用,因为每个脚本都需要使用由先前运行的脚本生成的常规工作区中的变量,而 Function 不允许这样做,正如我之前所说,我将更新很快的问题
  • 在我看来,干净的解决方案是使用函数参数仅传递所需的变量。
【解决方案2】:

我发现,当您从另一个 .m 脚本运行 .m 脚本时,您必须先清除工作区,然后才能在同一进程中运行另一个 .m 脚本。

由于每个脚本都依赖于问题中前一个脚本的变量,这是不可能的。为了避免这个问题并仍然实现目标,可以使用save() 函数来保存工作区,然后将其清除以运行下一个脚本,然后使用load() 再次加载它。 这样做有点迂回,但它有效。

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 2021-11-30
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多