2017-11-25 188 views
1

我已經寫在Matlab一個函數,這是計算的成本函數的數組:誤差與在Matlab「PARFOR」

function [F1val, Com]=F1(Community,NeighMat) 
     global FlattedAdjMat; 
     Com=zeros(numel(Community),3); 
     Com(:,1)=Community'; % The First row of Com= Community's Nodes 
     % Calculating INTERNAL Edges of Community 
      for j=1:numel(Com(:,1)) 
       Com(j,2)=sum(FlattedAdjMat((Community),Com(j,1)));% Internal Degrees of Node j    
      end 
     F1val=(nansum(Com(:,3)./((Com(:,2)+Com(:,3))))); 
    end 

但是我有2個問題與線Com(j,2)=sum(FlattedAdjMat((Community),Com(j,1)))

  1. 當我嘗試並行執行它使用parfor

    parfor iii=1:5 
        [z,p]=F1(Community,NeighMat) 
    end 
    

    此錯誤OCC Urs在線:Index exceeds matrix dimensions 而在正常情況下(不是並行)沒有問題

  2. 這是非常耗時並且減慢速度。

NeighMat是加權鄰接矩陣, Community是矩陣索引的陣列, FlattedAdjMat是鄰接矩陣。

請問你能幫我嗎?

樣本數據:

for ii=1:10 
    NeighMat{ii}=randi(10,1,10) 
end 

Community=[1,5,6,8,9];` 

global FlattedAdjMat 
FlattedAdjMat=randi([0,1],10,10) 
+0

IIUC,你應該已經改變了'對於j = 1:numel(COM(:,1))'到'parfor j = 1:numel(Com(:,1))' –

+0

@SardarUsama,我想並行執行函數'F1'。不只是該函數的一個循環。 –

+0

運行五次的目的是什麼?如果你保持所有迭代的輸入參數相同? –

回答

1

您有全局變量的一個問題。這個問題很好地討論here

我重寫代碼了一下,這對我的作品完美(Matlab的2017b Win64上)

close all 
clear all 
clc 
%% SAMPLE DATA 
for ii=1:10 
    NeighMat{ii}=randi(10,1,10); 
end 
Community=[1,5,6,8,9]; 
FlattedAdjMat=randi([0,1],10,10); 
%% BODY 
parfor iii=1:5 
    [z,p]=F1(Community,NeighMat,FlattedAdjMat) 
end 

%% FUNCTION 
function [F1val, Com]=F1(Community,NeighMat,FlattedAdjMat) 
    Com=zeros(numel(Community),3); 
    Com(:,1)=Community'; % The First row of Com= Community's Nodes 
    % Calculating INTERNAL Edges of Community 
    for j=1:numel(Com(:,1)) 
     Com(j,2)=sum(FlattedAdjMat((Community),Com(j,1)));% Internal Degrees of Node j 
    end 
    F1val=(nansum(Com(:,3)./((Com(:,2)+Com(:,3))))); 
end 
+1

它不是重複的。在另一個SO帖子中討論瞭如何在parfor中處理全局變量的問題。在這裏,這個人沒有想法爲什麼代碼不起作用。答案是不要使用全局變量,或者如果你需要它,請看鏈接。 – zlon

+0

謝謝。你是對的。 –