排除变量parfor-Loops

确保这件事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-Loops

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

溢出条件

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

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

parforIDX = INT8(-128:127)IDX;结束

属性使用较大的数据类型parfor-loop变量。如果你想保持原来的数据类型在你的计算,转换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-Loops

当MATLAB识别的名称parfor-loop作为一个变量,该变量被划分为几个类别之一,如下表所示。确保变量是唯一分类的,并满足类别要求。parfor违反要求的循环返回一个错误。

分类 描述
循环变量 循环指数
切变量 阵列,它的片段被循环的不同迭代上被操作
广播变量 变量,其值是必需的循环内的循环之前定义的,但从来没有分配环内
简变量 其累积跨越循环迭代的值,无论迭代顺序变量
临时变量 在循环内部创建的、在循环外部不能访问的变量

要找出你有哪些变量,检查代码片段。表中的所有变量的分类都代表了这样的代码:

如果您遇到变量分类问题,请在诉诸转换a的主体这一更困难的方法之前考虑这些方法parfor-loop成一个函数。

  • 如果使用嵌套-loop索引到一个切片阵列,你不能在其他地方的使用数组parfor循环。左边的代码不起作用,因为一个是否在嵌套内进行切片和索引循环。右边的作品,因为代码v被分配给一个嵌套循环的外部。您可以计算整个行,然后执行到切片输出分配一次。

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

  • 左边的代码不能工作,因为变量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现在可以正确地确定这个变量切片。在一般情况下,你不能使用的领域结构S或对象的属性作为切片的输入或输出变量parfor

    无效 有效
    一个。x= [];parforIDX = 1:10 a.x(IDX)= 7;结束
    tmpx = [];parfortmpx(idx) = 7;结束a.x = tmpx;

在parfor循环中构造数组

创建临时的结构

您不能创建在一个结构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语句的透明性

全球性和持久性变量

a的主体parfor循环不能包含全球要么持续的变量声明。

相关话题