【问题标题】:error with 'parfor' in matlabmatlab中的“parfor”错误
【发布时间】:2023-04-06 07:19:01
【问题描述】:

我在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

但我对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 而在正常情况下(非并行)没有问题

  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)

【问题讨论】:

  • IIUC,你应该把for j=1:numel(Com(:,1))改成parfor j=1:numel(Com(:,1))
  • @SardarUsama,我想并行执行函数F1。不仅仅是该函数中的一个循环。
  • 如果您在所有迭代中保持输入参数相同,那么运行五次的目的是什么?
  • 这只是我论文的一个功能,对于不同的社区我需要并行运行,所以每个线程的输入是不同的。线程独立运行。
  • 这不是重复的问题,我已经检查过了

标签: matlab matrix parallel-processing parfor


【解决方案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

【讨论】:

  • 不是重复的。在另一篇 SO 帖子中讨论了如何处理 parfor 中的全局变量的问题。在这里,这个人不知道为什么代码不起作用。答案是不要使用全局变量,或者如果您需要它,请查看链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2016-05-19
  • 1970-01-01
相关资源
最近更新 更多