2017-11-25 119 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

谢谢。你是对的。 –