尝试在MATLAB中使用parfor(并行for循环)时出错

sus*_*hma 4 parallel-processing matlab loops

我正在处理一个非常庞大的矩阵,因此希望在MATLAB中使用并行计算来运行集群.在这里,我使用以下方法创建了一个稀疏矩阵

Ad = sparse(length(con)*length(uni_core), length(con)*length(uni_core));
Run Code Online (Sandbox Code Playgroud)

我有一个书面函数,adj使用它我可以填充矩阵Ad.的循环运行时,都会从功能adj我得到的方形对称矩阵将被分配给Ad3682*(i-1)+13682 *(i-1)+3682在第一索引并且类似地在第二索引.这显示在这里:

parfor i = 1:length(con)
  Ad((3682*(i-1))+1:((3682*(i-1))+3682), ...
     (3682*(i-1))+1:((3682*(i-1))+3682)) = adj(a, b, uni_core);
end
Run Code Online (Sandbox Code Playgroud)

在正常的for循环中,它运行没有任何问题.但在parfor并行计算中,我收到的错误是使用切片数组时出现问题parfor.

Edr*_*ric 5

PARFOR循环的输出必须是简化变量(例如计算求和)或"切片".有关详细信息,请参阅文档中的此页面.

在您的情况下,您正在尝试形成"切片"输出,但您的索引表达式对于PARFOR而言过于复杂.在PARFOR中,切片输出必须通过以下方式索引:一个下标的循环变量,以及其他下标的一些常量表达式.常量表达式必须是:,end或文字标量.以下示例显示了几个切片输出:

x3 = zeros(4, 10, 3);
parfor ii = 1:10
    x1(ii) = rand;
    x2(ii,:) = rand(1,10);
    x3(:,ii,end) = rand(4,1);
    x4{ii} = rand(ii);
end
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您在Ad中的索引表达式太复杂,无法处理PARFOR.您可以做的最简单的事情是将计算作为单元格数组返回,然后Ad使用常规FOR循环将它们注入主机端,如下所示:

parfor i = 1:length(con)
   tmpout{i} = ....;
end
for i = 1:length(con)
   Ad(...) = tmpout{i};
end
Run Code Online (Sandbox Code Playgroud)