2015-05-05 102 views
0

不幸的是,我不得不運行一個簡單但巨大的3次嵌套for循環。循環填充表示三維座標中函數強度的三維矩陣。 (需要填充整個矩陣,因爲我需要它來繪製3D強度雲圖...)爲什麼matlab不能並行運行我的簡單嵌套for循環?

我想並行運行它,因爲使用我的筆記本電腦需要數週時間才能順序運行:

% 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無法分類並拒絕運行並行化的代碼。

我在做什麼是不允許的?

+2

並行化並不是一件容易的事。特別是對於一臺機器。 – knedlsepp

回答

0

MATLAB不能處理3個嵌套循環與parfor我認爲。我建議你在內部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