【发布时间】:2015-05-14 00:33:10
【问题描述】:
我在 parfor 循环 中的代码越来越长,我想将其拆分。将部分代码保存在不同的脚本文件中 看起来合乎逻辑且非常有吸引力,因为除了保存代码的位置之外它不会改变任何东西,看起来它应该可以工作。但事实并非如此。
我收到通常的“违反透明度错误”。
这个问题看起来很典型,但我在任何地方都没有发现这个问题被问或回答。
下面是一个小的工作示例。
(是的,这可以作为一个函数。但如果输入和输出变量更多,这在 imo 中变得非常丑陋,并且可能由于传递参数而更慢)
C = NaN(10,1); %Result vector
parfor loop = 1:10
a = 1;
b = 2;
MFile_Test %Run the m-file which contains only one line:
% c = a + b;
C(loop)=c;
end
MFile_Test 是一个仅包含一行 c = a + b 的脚本。
我开始明白为什么并行计算在这里有问题,但不知道如何解决它。因为如果我在 parfor 文件中只有 c = a + b 行,这将毫无问题,我无法相信没有简单的方法来解决这个问题(例如,在最坏的情况下,告诉 matlab 从另一个加载文本文件并在此处和现在将其作为代码运行)。
如果有其他方法可以在不使用脚本文件的情况下构建我的代码(并且,如果可能,不只使用函数;))当然,我也会很感激这样的 cmets。
非常感谢, 丹尼尔
【问题讨论】:
-
顺便说一句,我还尝试了 addAttachedFiles(gcp,{'mydata'}) 或在脚本中使用 save('mydata') 然后 load('mydata') 但都没有成功。
-
作为将所有变量传递给函数的另一种方法,您可以将工作区保存在调用脚本中,然后在函数中再次加载。
-
你为什么要避开函数? MATLAB 脚本非常适合原型设计,尤其是单元模式脚本,但不应用于结构化编程。我强烈推荐函数。
-
感谢 cmets。我刚刚开始使用单元格,Parag,但感觉它让我的代码不太清晰。但是好的,我会继续使用它。保存和重新加载工作区的选项对我来说听起来很不错,我会研究一下,谢谢 Cecilia。
标签: matlab parallel-processing parfor