排除变量故障parfor
循环
确保parfor
循环变量是连续递增的整数
中的循环变量parfor
-loop必须是连续递增的整数。出于这个原因,下面的例子返回错误:
parforI = 0:0.2:1%非整数parforJ = 1:2:11%非连续parforK = 12:-1:1%不增加
iValues = 0:0.2:1;parforidx = 1: i = iValues(idx);...结束
避免在parfor
循环
如果MATLAB®检测parfor
-loop变量可能溢出,将报告错误。
溢出条件 | 例子 | 解决方案 |
---|---|---|
的长度 |
在这里,MATLAB报告一个错误,因为 parforidx = int8 (128:127) idx;结束 |
的数据类型使用较大的数据类型 parforidx = 128:127 int8 (idx);结束 |
的初始值 |
在这里,MATLAB报告一个错误,因为 parforidx = uint32 (0:1) idx;结束 |
|
解决变量分类问题parfor
循环
当MATLAB识别一个名称parfor
-loop作为一个变量,变量被划分为以下几个类别之一,如下表所示。确保您的变量是唯一分类的,并满足类别要求。parfor
违反要求的-loop返回错误。
分类 | 描述 |
---|---|
循环变量 | 循环指数 |
切变量 | 数组,其段由循环的不同迭代操作 |
广播变量 | 在循环之前定义的变量,其值在循环中是必需的,但在循环中从未赋值 |
减少变量 | 在循环的迭代中累积值的变量,而不考虑迭代顺序 |
临时变量 | 在循环内部创建的变量,不能在循环外部访问 |
要找出有哪些变量,请检查代码片段。表中所有变量分类都用下面的代码表示:
如果遇到变量分类问题,请在使用更困难的方法(转换对象体)之前考虑这些方法parfor
-loop转换为函数。
如果使用嵌套
为
类的其他地方不能使用该数组parfor
循环。左边的代码不能工作,因为一个
在嵌套内进行切片和索引为
循环。右边的代码可以工作,因为v
被分配给一个
在嵌套循环之外。您可以计算整行,然后对切片输出执行单个赋值。无效的 有效的 A = 0 (4,10);parforI = 1:4为A(i, j) = i + j;结束disp((我,1))结束
A = 0 (4,10);parforI = 1:4 v = 0 (1,10);为J = 1:10 v(J) = I + J;结束dip (v(1)) A(i,:) = v;结束
左边的代码不能工作,因为变量
x
在parfor
不能分类。的不同部分有多个赋值,因此不能对该变量进行分类x
.因此parfor
无法确定循环的迭代之间是否存在依赖关系。右边的代码可以工作,因为您完全覆盖了的值x
.parfor
现在可以明确地确定了吗x
是临时变量。无效的 有效的 parforIdx = 1:10 x(1) = 7;X (2) = 8;Out (idx) = sum(x);结束
parforIdx = 1:10 x = [7,8];Out (idx) = sum(x);结束
这个例子展示了如何对结构化数组的字段进行切片。看到
结构体
获取详细信息。左边的代码不能工作,因为变量一个
在parfor
不能分类。此变量不能分类,因为索引的形式对切片变量无效。索引的第一级不是切片索引操作,即使字段x
的一个
看起来被正确地切片了。的字段可以正常工作,因为您提取了结构体
变成一个单独的变量tmpx
.parfor
现在可以正确地确定这个变量被切片了。一般来说,不能使用的字段结构体
S或对象的属性,作为切片的输入或输出变量parfor
.无效的 有效的 A.x = [];parfora.x(Idx) = 7;结束
TMPX = [];parfortmpx(Idx) = 7;结束A.x = tmpx;
在parfor-Loops中构造数组
创建临时结构
类型中不能创建结构parfor
-循环使用点符号赋值。在左边的代码中,循环中的两行都会生成一个分类错误。在右边的代码中,可以使用结构体
函数在循环中或第一个字段中创建结构。
无效的 | 有效的 |
---|---|
parforI = 1:4 temp.myfield1 = rand();Temp.myfield2 = i;结束 |
parforI = 1:4 temp = struct();Temp.myfield1 = rand();Temp.myfield2 = i;结束 parforI = 1:4 temp = struct(“myfield1”,兰德(),“myfield2”,我);结束 |
切片结构域
不能以切片的方式使用结构字段输入或输出数组中的数组parfor
循环。换句话说,不能使用loop变量为结构字段的元素建立索引。在左边的代码中,由于索引,循环中的两行都生成了分类错误。在右边的代码中,作为切片输出的一种变通方法,您在循环中使用了单独的切片数组。然后在循环完成后分配结构字段。
无效的 | 有效的 |
---|---|
parforoutputData.outArray1(i) = 1/i;outputData.outArray2(i) = i^2;结束 |
parforoutArray1(i) = 1/i;outArray2(i) = i^2;结束输出数据= struct(“outArray1”outArray1,“outArray2”, outArray2); |
切片输入的解决方法是在循环之前将结构字段分配给一个单独的数组。您可以将这个新数组用于切片的输入。
inArray1 = inputData.inArray1;inArray2 = inputData.inArray2;parfori = 1:4 temp1 = inArray1(i);temp2 = inArray2(i);结束
类的主体转换parfor
-循环成函数
如果以上方法都失败了,通常可以在parfor
类的函数体转换为parfor
-loop转换为函数。在左边的代码中,code Analyzer标记了变量的问题y,但不能解决它。在右边的代码中,通过转换parfor
-loop转换为函数。
无效的 | 有效的 |
---|---|
函数Parfor_loop_body_bad data = rand(5,5);均值= 0 (1,5);parforI = 1:5%代码分析器标记问题%,变量y如下Y.mean = mean(数据(:,i));均值(i) = y.均值;结束disp(意味着);结束 |
函数Parfor_loop_body_good data = rand(5,5);均值= 0 (1,5);parforI = 1:5而是调用一个函数means(i) = computeMeans(data(:,i));结束disp(意味着);结束这个函数现在包含body%的parfor循环函数mean = mean(数据);Means = y.mean;结束 使用'Processes'配置文件启动并行池(parpool)…连接4个工人。0.6786 0.5691 0.6742 0.6462 0.6307 |
明确的变量名称
如果您使用的名称是MATLAB无法明确区分的变量parfor
-loop,在解析时MATLAB假定你引用的是一个函数。然后在运行时,如果找不到函数,MATLAB就会生成一个错误。看到变量名.例如,在下面的代码中f (5)
可以引用数组的第五个元素命名为f
,或到一个名为f
论证是5
.如果f
在代码中没有明确定义为变量,MATLAB中寻找函数f
在代码运行时的路径上。
parforI = 1:n...A = f(5);...结束
透明的parfor
循环
身体parfor
-loop必须为透明的:所有对变量的引用必须在代码文本中“可见”。有关透明度的详细信息,请参见确保parfor-Loops或spmd语句的透明度.