【问题标题】:Matlab - setting up a nested parfor loopMatlab - 设置嵌套的 parfor 循环
【发布时间】:2016-05-25 05:54:44
【问题描述】:

我在 matlab 中设置 parfor 循环时遇到了麻烦。我知道这很容易,但我有点卡在这里,这就是为什么我会感谢所有帮助。

我已经尝试了以下

valuesforM = zeros(901,100);
valuesforOPratio = zeros(100,1);
counter=1;
x = xlsread ('gtc.xlsx', 'A2:A10000');
y = xlsread ('gtc.xlsx','C2:C10000');
z = xlsread ('gtc.xlsx','B2:B10000');

parfor M = 100:1000;
counter=counter+1
for OPratio = 1:100;
NPVtotal = cut_off_optimisation(M,OPratio,x,y,z);
valuesforOPratio(OPratio)=NPVtotal;
end
valuesforM(M-99,:) = valuesforOPratio;
end

我收到以下错误:

 Error using senitivity_script_10000_steps (line 10)
 Error: The variable valuesforOPratio in a parfor cannot be classified.

我该如何解决这个问题?非常感谢。

编辑

按照评论建议,我尝试了以下方法:

valuesforM = zeros(901,100);
x = xlsread ('gtc.xlsx', 'A2:A10000');
y = xlsread ('gtc.xlsx','C2:C10000');
z = xlsread ('gtc.xlsx','C2:C10000');

parfor M = 100:1000;
NPVtotal = cut_off_optimisation(M,1:100,x,y,z);
valuesforM(M-99,:) = NPVtotal;
end

这给出了以下错误:

In an assignment A(:) = B, the number of elements in A and B must be the same.
Error in parforscript (line 8)
parfor M = 100:1000;

知道如何解决这两个问题吗?

【问题讨论】:

  • 您的counter 没有做任何事情。此外,尝试将嵌套的for 循环整体包装在一个函数中,只调用parfor 中的函数。这可能与 MATLAB 很难看到 valuesforOPratio 始终只是 100 x 1 双精度有关。
  • 谢谢,会试试的。柜台只是为了让我知道它的先进程度。 (我明白它在 parfor 循环中没有意义)
  • 不需要临时存储变量NPVtotal,并且,如果您的自定义cut_off_optimisation 函数支持它,您可以使用cut_off_optimisation(M,1:100,x,y,z);,即在第二个参数上输入一系列值。那可以让你直接保存在valuesforM,我认为这也可以解决问题。
  • 不幸的是,它出现了另一个错误-(我编辑了帖子)
  • 如果你对一些随机的M 运行size(cut_off_optimisation(M,1:100,x,y,z)),它会给你一个1 x 100 数组吗?

标签: matlab parfor


【解决方案1】:

正如您在 cmets 中所说,由于不需要计数器,因此我已将其删除,并且计数器也不会那样工作,因为不同的迭代将以非顺序​​方式运行并尝试更新相同的变量。这是不允许的。

接下来,您必须在parfor loop 中执行valuesforOPratio = zeros(1,100),因为如果将其放在循环之外,那么每次迭代都将尝试访问相同的变量。这是不允许的。这就是为什么您会收到该错误。当你把它放在里面时,每次迭代都将访问一个本地创建的变量。这也是您在基本工作区中找不到它的原因。这是更正后的代码。

valuesforM = zeros(901,100);
x = xlsread ('gtc.xlsx', 'A2:A10000');
y = xlsread ('gtc.xlsx','C2:C10000');
z = xlsread ('gtc.xlsx','B2:B10000');

parfor M = 100:1000;
    valuesforOPratio = zeros(1,100);

    for OPratio = 1:100;
        NPVtotal = cut_off_optimisation(M,OPratio,x,y,z);
        valuesforOPratio(OPratio)=NPVtotal;
    end

    valuesforM(M-99,:) = valuesforOPratio;
end

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多