ошибка с 'parfor' в Matlab

я написал функцию в 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

Но у меня 2 проблемы со строкой Com(j,2)=sum(FlattedAdjMat((Community),Com(j,1))),

  1. когда я пытаюсь выполнить его параллельно, используя parfor:

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

    эта ошибка возникает в строке: Index exceeds matrix dimensions в то время как в обычном случае (не Parallel) проблем нет

  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)

person Reza Sh    schedule 25.11.2017    source источник
comment
IIUC, вы должны были изменить for j=1:numel(Com(:,1)) на parfor j=1:numel(Com(:,1))   -  person Sardar Usama    schedule 25.11.2017
comment
@SardarUsama, я хочу выполнить функцию F1 параллельно. не просто цикл в этой функции.   -  person Reza Sh    schedule 25.11.2017
comment
В чем смысл запускать его пять раз, если вы сохраняете одинаковые входные аргументы для всех итераций?   -  person Sardar Usama    schedule 25.11.2017
comment
это просто функция моего тезиса, для разных сообществ мне нужно работать параллельно, поэтому входные данные в каждом потоке разные. потоки работают независимо.   -  person Reza Sh    schedule 25.11.2017
comment
это не повторяющийся вопрос, я проверил   -  person Reza Sh    schedule 27.11.2017


Ответы (1)


У вас проблема с глобальной переменной. Эта проблема хорошо обсуждается здесь.

Я немного переписываю Ваш код, и он у меня отлично работает (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
person zlon    schedule 26.11.2017
comment
Это не дубликат. В другом сообщении SO обсуждалась проблема, как работать с глобальными переменными в parfor. Здесь у человека не было идей, почему код не работал. Ответ: не используйте глобальную переменную, или, если вам это нужно, посмотрите ссылку. - person zlon; 26.11.2017