parfor
-Loopsparfor
-循环变量是连续递增的整数在循环变量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
-Loops如果MATLAB®检测到parfor
-loop变量可以溢出,它会报告错误。
溢出条件 | 例 | 解 |
---|---|---|
的长度 |
在这里,MATLAB报告错误,因为 parforIDX = INT8(-128:127)IDX;结束 |
属性使用较大的数据类型 parforIDX = -128:127 INT8(IDX);结束 |
的初始值 |
在这里,MATLAB报告错误,因为 parforidx = uint32 (0:1) idx;结束 |
|
parfor
-Loops当MATLAB识别的名称parfor
-loop作为一个变量,该变量被划分为几个类别之一,如下表所示。确保变量是唯一分类的,并满足类别要求。parfor
违反要求的循环返回一个错误。
分类 | 描述 |
---|---|
循环变量 | 循环指数 |
切变量 | 阵列,它的片段被循环的不同迭代上被操作 |
广播变量 | 变量,其值是必需的循环内的循环之前定义的,但从来没有分配环内 |
简变量 | 其累积跨越循环迭代的值,无论迭代顺序变量 |
临时变量 | 在循环内部创建的、在循环外部不能访问的变量 |
要找出你有哪些变量,检查代码片段。表中的所有变量的分类都代表了这样的代码:
如果您遇到变量分类问题,请在诉诸转换a的主体这一更困难的方法之前考虑这些方法parfor
-loop成一个函数。
如果使用嵌套为
-loop索引到一个切片阵列,你不能在其他地方的使用数组parfor
循环。左边的代码不起作用,因为一个
是否在嵌套内进行切片和索引为
循环。右边的作品,因为代码v
被分配给一个
嵌套循环的外部。您可以计算整个行,然后执行到切片输出分配一次。
无效 | 有效 |
---|---|
A =零(4,10);parfori = 1:4为A(i, j) = i + j;结束DISP(A(I,1))结束 |
A =零(4,10);parforI = 1:4 V =零(1,10);为J = 1:10 V(J)= I + J;结束DISP(V(1))A(I,:) = 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
现在可以正确地确定这个变量切片。在一般情况下,你不能使用的领域结构
S或对象的属性作为切片的输入或输出变量parfor
。
无效 | 有效 |
---|---|
一个。x= [];parforIDX = 1:10 a.x(IDX)= 7;结束 |
tmpx = [];parfortmpx(idx) = 7;结束a.x = tmpx; |
您不能创建在一个结构parfor
-loop使用点符号分配。在左侧的代码,循环内部两条线生成分类误差。在右边的代码,作为一种解决方法,你可以使用结构
函数在循环或第一个字段中创建结构。
无效 | 有效 |
---|---|
parforI = 1:4 temp.myfield1 = RAND();temp.myfield2 = I;结束 |
parforI = 1:4温度=结构();temp.myfield1 = RAND();temp.myfield2 = I;结束 parfori = 1:4'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;parforI = 1:4的temp1 = inArray1(ⅰ);TEMP2 = inArray2(ⅰ);结束
parfor
-循环到一个函数如果一切都失败了,你通常可以解决变量的分类问题parfor
通过转换的主体-loopsparfor
-loop成一个函数。在左侧的代码,代码分析器标志与变量的问题y,但不能解决它。在右边的代码,通过转换的车身解决这个问题parfor
-loop成一个函数。
无效 | 有效 |
---|---|
功能parfor_loop_body_bad数据=兰特(5,5);意味着= 0 (1、5);parfori = 1:5%代码分析器标志问题变量y如下y.mean =平均值(数据(:,i))的;指(i)= y.mean;结束disp(意味着); |
功能parfor_loop_body_good data = rand(5,5);意味着= 0 (1、5);parfori = 1:5%调用一个函数,而不是意味着(i) = computeMeans(数据(:,i));结束disp(意味着);%此函数现在包含主体%的parfor循环功能手段= computeMeans(数据)y.mean =平均值(数据);手段= y.mean; 使用“本地”配置文件启动并行池(parpool)…与4名工人联系。0.6786 0.5691 0.6742 0.6462 0.6307 |
如果您使用的名称MATLAB不能明确区分作为变量内parfor
-loop,在分析时MATLAB假定你正在引用的函数。然后,在运行时,如果函数不能被发现,MATLAB产生错误。看到变量名(MATLAB)。例如,在下面的代码中f (5)
既可以是指命名阵列的第五元件f
,或指定为f
用的参数5
。如果f
没有清楚地定义为代码的变量,MATLAB查找功能f
在代码运行时在路径上。
parforI = 1:n的…A = F(5);…结束
parfor
循环a的主体parfor
-loop必须透明的:所有对变量的引用必须在代码文本中是“可见的”。有关透明度的更多细节,请参见确保parfor循环或spmd语句的透明性。