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