主要内容

排除变量parfor循环

确保parfor循环变量是连续增加的整数

循环变量的parfor连续循环必须增加整数。出于这个原因,下面的例子返回错误:

parfori = 0:0.2:1%不是整数parforj = 1:2:11%不是连续的parfork = 12: 1:1%不增加
你可以修复这些错误的循环变量转换成一个有效范围。例如,您可以修复noninteger示例如下:
iValues = 0:0.2:1;parforidx = 1:元素个数(iValues)我= iValues (idx);结束

避免溢出parfor循环

如果MATLAB®检测到parfor循环变量可以溢出,它会报告错误。

溢出条件 例子 解决方案

的长度parfor循环循环变量类型的范围超过了最大值。

因为,MATLAB报告一个错误长度(128:127)> maxint (“int8”):

parforidx = int8 (128:127) idx;结束

使用一个较大的数据类型parfor循环变量。如果你想保持原始数据输入你的计算,转换parfor内循环变量parfor循环。

parforidx = 128:127 int8 (idx);结束

的初始值parfor循环范围的最小值等于循环变量类型。

因为,MATLAB报告一个错误0 = intmin (“uint32”):

parforidx = uint32 (0:1) idx;结束

  • 使用一个较大的数据类型最小值较低,与前面的解决方案。

  • 增量值的范围。例如:

    parforidx = uint32 (0:1) + 1 idx-1;结束

解决变量的分类问题parfor循环

在MATLAB中认识到一个名称parfor循环变量,变量分类的几个类别,如下表所示。确保你的变量是独特的分类,满足分类要求。parfor违反要求的循环返回一个错误。

分类 描述
循环变量 循环指数
切变量 数组部分的操作在不同的循环迭代
广播变量 定义的变量在循环内部的循环,其价值是必需的,但从未分配内部循环
减少变量 累积值的变量在循环迭代,迭代顺序无关
临时变量 变量创建内部的循环,而不是访问外循环

找出哪些变量,检查代码片段。表中所有变量分类表示在这段代码中:

如果你遇到变量分类问题,考虑这些方法在你采取更困难的身体转换的方法parfor圈成一个函数。

  • 如果你使用一个嵌套循环索引到切片数组,你不能使用其他地方的数组parfor循环。因为左边的代码不工作一个嵌套的内切和索引吗循环。右边的代码,因为工作v被分配给一个在嵌套循环之外。你可以计算整个行,然后执行一个任务到切片输出。

    无效的 有效的
    A = 0 (10);parfori = 1:4j = 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;结束

  • 左边的代码不工作,因为变量xparfor不能分类。这个变量不能被分类,因为有多个任务的不同部分x。因此parfor不能确定是否有循环迭代之间的依赖关系。右边的代码工作,因为你完全覆盖的价值xparfor现在可以确定明确了吗x是一个临时变量。

    无效的 有效的
    parforidx = 1:10 x (1) = 7;x (2) = 8;(idx) = (x)之和;结束
    parforidx = 1:10 x = [7,8];(idx) = (x)之和;结束

  • 这个例子展示了如何切片的结构化数组。看到结构体获取详细信息。左边的代码不工作,因为变量一个parfor不能分类。这个变量不能被分类,因为索引的形式不是一个切片变量有效。的第一级索引不是切片索引操作,即使字段x一个似乎正确切片。右边的代码工作因为你提取的字段结构体到一个单独的变量tmpxparfor现在可以正确地确定这个变量是切片。一般来说,你不能使用领域结构体年代对象或属性切片中的输入或输出变量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语句的透明度

全球和持久的变量

的身体parfor循环不能包含全球持续的变量声明。

相关的话题