【问题标题】:Why won't matlab run my simple nested for loop in parallel?为什么 matlab 不能并行运行我的简单嵌套 for 循环?
【发布时间】:2015-05-05 17:52:48
【问题描述】:

不幸的是,我不得不运行一个简单但庞大且嵌套 3 次的 for 循环。这些循环填充一个 3 维矩阵,表示函数在 3 空间坐标中的强度。 (有必要填充整个矩阵,因为我需要它来绘制 3d 强度云图...)

我想并行运行它,因为我的笔记本电脑需要数周才能顺序运行:

 % Initialize vars
 c0values = 400:1:600;
 n0values = 1:1:10000;
 phivalues = 0:0.1:2*pi;
 mtxHeight = zeros(numel(c0values),numel(n0values),numel(phivalues));
 % Run over c0
 parfor c0ctr=1:numel(c0values)
     % Run over n0
     for n0ctr=1:numel(n0values)
         % Run over phi
         for phictr=1:numel(phivalues)
             % Sum over ell
             dHeight = 0;
             for ell=1:10
                  dHeight = dHeight + fnToMaximize(mtxObs(ell,:), ...
                      c0values(c0ctr), ...
                      n0values(n0ctr), ...
                      phivalues(phictr));
             end     
             mtxHeight(c0ctr,n0ctr,phictr) = dHeight;
         end
     end
 end

由于某种原因,Matlab 抱怨mtxHeight 无法分类并拒绝以并行化的方式运行代码。

我在做什么是不允许的?

【问题讨论】:

  • 并行化不是一件容易的事。特别是对于机器。

标签: matlab parallel-processing nested-loops


【解决方案1】:

我认为 MATLAB 无法使用 parfor 处理 3 个嵌套循环。我建议您在内部 for 循环之外更新 mtxHeight
像这样的:

 parfor c0ctr=1:numel(c0values)
     % Run over n0
     for n0ctr=1:numel(n0values)
         % Run over phi
         dHeight = zeros(1,numel(phivalues));
         for phictr=1:numel(phivalues)
             % Sum over ell
             for ell=1:10
                  dHeight(phictr) = dHeight(phictr) + fnToMaximize(mtxObs(ell,:), ...
                      c0values(c0ctr), ...
                      n0values(n0ctr), ...
                      phivalues(phictr));
             end     
        end
       mtxHeight(c0ctr,n0ctr,:) = dHeight;      
     end
 end

【讨论】:

    猜你喜欢
    • 2021-03-15
    • 1970-01-01
    • 2013-06-05
    • 2016-11-15
    • 2017-04-18
    • 2022-09-30
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多