2017-11-25 1 views
1

i eine Funktion in MATLAB geschrieben haben, die eine Kostenfunktion für ein Array zu berechnen, ist:Fehler mit 'parfor' in Matlab

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 

aber ich habe 2 Problem mit der Linie Com(j,2)=sum(FlattedAdjMat((Community),Com(j,1))),

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

    dieser Fehler occ: mit parfor

  1. wenn ich versuche es parallel auszuführen urs in der Zeile: Index exceeds matrix dimensions während im Normalfall (nicht parallel) gibt es kein Problem

  2. es ist sehr zeitaufwendig und verlangsamen die Geschwindigkeit.

NeighMat ist eine gewichtete Adjazenzmatrix, Community ein Array der Matrix-Indizes ist, FlattedAdjMat ist Adjazenzmatrix.

Würdest du mir bitte helfen?

Beispieldaten:

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, sollten Sie geändert haben 'für j = 1: numel (Com (:, 1))' zu 'parfor j = 1: numel (Com (:, 1))' –

+0

@SardarUsama, ich möchte die Funktion 'F1' parallel ausführen. nicht nur eine Schleife in dieser Funktion. –

+0

Was ist der Zweck, es fünf Mal auszuführen, wenn Sie die Eingabeargumente für alle Iterationen unverändert lassen? –

Antwort

1

Sie haben ein Problem mit globalen Variablen. Dieses Problem wird gut diskutiert here.

ich Ihren Code ein bisschen umschreiben und es funktioniert perfekt für mich (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

Es ist kein Duplikat. In einem weiteren diskutierten SO Problem, wie mit globalen Variablen in Parfor umzugehen ist. Hier hatte die Person keine Ideen, warum der Code nicht funktioniert hat. Die Antwort ist, verwenden Sie keine globale Variable, oder wenn Sie es brauchen, siehe Link. – zlon

+0

Danke. Du hast recht. –

Verwandte Themen