主要内容

排除变量parfor循环

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

循环变量parfor-loop必须是连续递增的整数。因此,以下示例返回错误:

parfori = 0:0.2:1%不是整数parforj = 1:2:11%不是连续的parfork = 12: 1:1%不增加
可以通过将循环变量转换为有效范围来修复这些错误。例如,你可以修改非整数的例子如下:
iValues = 0:0.2:1;parforidx = 1: numl (iValues) i = iValues(idx);...结束

避免溢出parfor循环

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

溢出条件 例子 解决方案

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

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

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

类使用较大的数据类型parfor循环变量。如果希望在计算中保留原始数据类型,请将parfor变量中的-loop变量parfor循环。

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

的初始值parfor-loop range =循环变量类型的最小值。

在这里,MATLAB报告了一个错误,因为0 = intmin(“uint32”)

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

  • 与上一个解决方案一样,使用具有较低最小值的较大数据类型。

  • 增加值的范围。例如:

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

中的变量分类问题parfor循环

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

分类 描述
循环变量 循环指数
切变量 数组,其段由循环的不同迭代操作
广播变量 在循环之前定义的变量,其值在循环中是必需的,但在循环中从未赋值
减少变量 在循环的各个迭代中累积值的变量,而不考虑迭代的顺序
临时变量 在循环内部创建的变量,而不在循环外部访问

要找出您有哪些变量,请检查代码片段。表中所有的变量分类都用下面的代码表示:

如果您遇到变量分类的问题,在您求助于转换对象主体的更困难的方法之前,请考虑这些方法parfor-loop转换为函数。

  • 如果使用嵌套类的其他地方不能使用该数组parfor循环。左边的代码不起作用,因为一个是否在嵌套内进行切片和索引循环。右边的代码有用是因为v被分配给一个在嵌套循环之外。可以计算整个行,然后对切片输出执行单个赋值。

    无效的 有效的
    A = 0 (4,10);parfori = 1:4j = 1:10 A(i, j) = i + j;结束disp((我,1))结束
    A = 0 (4,10);parforI = 1:4 v = 0 (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

    无效的 有效的
    a.x = [];parfora.x(Idx) = 7;结束
    tmpx = [];parforIdx = 1:10 tmpx(Idx) = 7;结束a.x = tmpx;

在parfor-Loops中构造数组

创建临时结构

中不能创建结构parfor-循环使用点符号赋值。在左边的代码中,循环中的两行都产生了分类错误。在右边的代码中,您可以使用结构体函数在循环中或第一个字段中创建结构。

无效的 有效的
parforI = 1:4 temp.myfield1 = rand();temp.myfield2 =我;结束
parforI = 1:4 temp = struct();temp.myfield1 = rand ();temp.myfield2 =我;结束
parforI = 1:4 temp = struct(“myfield1”,兰德(),“myfield2”,我);结束

切片结构领域

不能将结构字段作为切片使用输入或输出数组parfor循环。换句话说,不能使用loop变量索引结构字段的元素。在左边的代码中,循环中的两行都因为索引而产生分类错误。在右边的代码中,作为切片输出的解决方法,您在循环中使用了单独的切片数组。然后在循环完成后分配结构字段。

无效的 有效的
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(i);temp2 = inArray2(我);结束

转换一个parfor-循环到一个函数

如果其他方法都失败了,通常可以用parfor对象的主体进行转换parfor-loop转换为函数。在左边的代码中,code Analyzer标记了变量的一个问题y,但无法解决。在右边的代码中,您通过转换的主体来解决这个问题parfor-loop转换为函数。

无效的 有效的
函数Parfor_loop_body_bad data = rand(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循环的%函数均值=均值(数据);意味着= y.mean;结束
使用“Processes”配置文件启动并行池(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循环不能包含全球持续的变量声明。

相关的话题

Baidu
map