parfor
循环parfor
-循环变量是连续递增的整数语句中的循环变量parfor
-loop必须是连续递增的整数。因此,下面的例子返回错误:
parfori = 0:0.2:1%不是整数parforj = 1:2:11%不连续parfork = 12: 1:1%不增加
iValues = 0:0.2:1;parforidx = 1:numel(iValues) 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
-循环违反要求返回错误。
分类 | 描述 |
---|---|
循环变量 | 循环指数 |
切变量 | 通过循环的不同迭代运行阵列 |
广播变量 | 在循环中所需的循环之前定义的变量,但从不分配在循环中 |
减少变量 | 在循环迭代中累积一个值的变量,与迭代顺序无关 |
临时变量 | 在循环内部创建的、不在循环外部访问的变量 |
要找出您拥有哪些变量,请检查代码片段。表中的所有变量分类都表示在这段代码中:
如果遇到变量分类问题,请在使用更困难的方法转换变量的主体之前考虑这些方法parfor
循环到函数中。
如果使用嵌套为
-loop索引到切片数组,但不能在切片数组的其他地方使用该数组parfor
循环。左边的代码不能工作是因为一个
是切片和索引内嵌套为
循环。右边的代码能工作是因为v
被分配给一个
在嵌套循环之外。您可以计算整行,然后对切片输出执行单个赋值。
无效的 | 有效的 |
---|---|
A = 0 (4, 10);parfori = 1:4为A(i, j) = i + j;结束disp((我,1))结束 |
A = 0 (4, 10);parforv = 0 (1, 10);为v(J) = I + J;结束disp(v(1))) A(i,:) = v;结束 |
左边的代码不能工作,因为变量x
在parfor
不能分类。的不同部分有多个赋值,因此不能对该变量进行分类x
.因此parfor
无法确定循环迭代之间是否存在依赖关系。右边的代码可以工作,因为您完全重写了值x
.parfor
现在可以明确地确定了吗x
是临时变量。
无效的 | 有效的 |
---|---|
parfordrawtext(1) = 1, '买进','卖出';x (2) = 8;(idx) = (x)之和;结束 |
parforx = 1 / 2;(idx) = (x)之和;结束 |
这个例子展示了如何对结构化数组的字段进行切片。看到结构体
获取详细信息。左边的代码不能工作,因为变量一个
在parfor
不能分类。这个变量不能分类,因为索引的形式对切片变量无效。索引的第一级不是切片索引操作,即使字段x
的一个
看起来切得很正确。的字段,因此右边的代码可以工作结构体
变成一个单独的变量tmpx
.parfor
现在可以正确地确定该变量是否被切片。一般情况下,不能使用结构体
S或对象的属性,如在中的切片输入或输出变量parfor
.
无效的 | 有效的 |
---|---|
a.x = [];parfora: = 1;结束 |
tmpx = [];parfortmpx = 1 / 2;结束a.x = tmpx; |
控件中不能创建结构parfor
-循环使用点符号赋值。在左边的代码中,循环中的两行都会生成一个分类错误。在右边的代码中,作为一种变通方法,您可以使用结构体
函数在循环中或在第一个字段中创建结构。
无效的 | 有效的 |
---|---|
parforI = 1:4 temp.myfield1 = rand();temp.myfield2 =我;结束 |
parforI = 1:4 temp = struct();temp.myfield1 = rand ();temp.myfield2 =我;结束 parfortemp = struct()“myfield1”,兰德(),“myfield2”,我);结束 |
不能将结构字段作为切片使用输入或输出数组parfor
循环。换句话说,您不能使用循环变量来索引结构字段的元素。在左边的代码中,循环中的两行都因为索引而产生分类错误。在右边的代码中,作为分段输出的解决方案,您在循环中使用了单独的分段数组。然后在循环完成后分配结构字段。
无效的 | 有效的 |
---|---|
parforoutputData.outArray1(i) = 1/i;outputData.outArray2 (i) = i ^ 2;结束 |
parforoutArray1(i) = 1/i;outArray2 (i) = i ^ 2;结束outputData =结构(“outArray1”outArray1,'Outarray2', outArray2); |
切片输入的解决方法是在循环之前将结构字段赋值给一个单独的数组。可以对切片输入使用新数组。
inArray1 = inputData.inArray1;inArray2 = inputData.inArray2;parfortemp1 = inArray1(i);temp2 = inArray2(我);结束
parfor
-循环到函数中如果所有其他人失败,您通常可以解决变量分类问题parfor
类的函数体来执行parfor
循环到函数中。在左边的代码中,code Analyzer用变量标记问题y,但无法解决。在右边的代码中,您可以通过转换parfor
循环到函数中。
无效的 | 有效的 |
---|---|
函数Parfor_loop_body_bad data = rand(5,5);意味着= 0(1、5);parfori = 1:5%代码分析器标记问题%下面有变量yy.mean =意味着(数据(:,i));意味着(i) = y.mean;结束disp(意味着);结束 |
函数Parfor_loop_body_good数据= rand(5,5);意味着= 0(1、5);parfori = 1:5%呼叫函数意味着(i) = computeMeans(数据(:,i));结束disp(意味着);结束%这个函数现在包含了主体parfor循环的%函数手段=计算机(数据)y.mean =均值(数据);手段= y.mean;结束 使用'local'配置文件启动并行池(parpool)…与4名工人相连。0.6786 0.5691 0.6742 0.6462 0.6307 |
如果你使用一个MATLAB不能明确区分的名字作为一个变量parfor
在解析时MATLAB假定你正在引用一个函数。然后在运行时,如果不能找到函数,MATLAB产生一个错误。看到变量名.例如,在下面的代码中f (5)
可以引用数组的第5个元素f
,或指向名为f
争论5
.如果f
在代码中没有明确定义为变量,MATLAB寻找函数f
在代码运行时的路径上。
parfori = 1: n...一个= f (5);...结束
parfor
循环a的主体parfor
循环必须透明的:所有对变量的引用必须在代码文本中“可见”。有关透明度的详细信息,请参见确保parfor循环或spmd语句的透明度.