我想在matlab中并行化部分代码。例如下面的部分:
v1=[1,3,6,8];
ggx=5.*ones(15,14);
gax=ones(15,14);
parfor i = 1:length(v1)
m = v1(i);
if m > 1
gax(1:m-1,m-1) = ggx(1:m-1,m-1);
end
if m<nn
gax(m+1:end,m) = ggx(m+1:end,m);
end
end
但是有一个错误: 错误:parfor中的变量gax无法分类。参见MATLAB中的循环并行,&#34;概述&#34;。
有谁知道如何删除错误?其他有用的信息是v1是一个增加的向量,它不包含任何重复的元素。
答案 0 :(得分:1)
如错误消息中所述,您必须遵循Sliced Variable rule。
gax
和gay
都违反了Fixed Index Listing
和Form of Indexing
的规则。此外,您可以将此示例A(i,20:30,end) % 20:30 not scalar
作为文档中未切片变量的示例。
因此,您应该更改parfor
的所有部分以获得正确的并行计算。换句话说,您必须设计一个适当的并行算法,您可以根据循环变量并行化该方法。
第一级索引的类型 - 索引的第一级是括号,()或大括号,{}。
固定索引列表 - 在第一级括号或大括号内,索引列表对于给定变量的所有匹配项都是相同的。
索引形式 - 在变量的索引列表中,只有一个索引涉及循环变量。
数组的形状 - 数组保持恒定的形状。在分配切片变量时,赋值的右侧不能是[]或'',因为这些运算符会尝试删除元素。