主要内容

还原变量

MATLAB®金宝app支持对循环迭代必须是独立的规则的重要异常,称为还原。一个还原变量累加一个值,该值取决于所有迭代,但与迭代顺序无关。MATLAB允许在parfor循环。

减少变量出现在赋值语句的两侧,如以下任一语句,其中expr是一个MATLAB表达式。

X=X+expr X=expr+X
X = X - expr 参见约简赋值中的结合性裁减任务的要求
X=X.*expr X=expr.*X
X=X*expr X=expr*X
X=X&expr X=expr&X
X=X | expr X=expr | X
X=[X,expr] X = [expr, X]
X = [X;expr) X=[expr;X]
X=最小值(X,expr) X=最小值(expr,X)
X = max(X, expr) X=最大值(expr,X)
X = union(X, expr) X=接头(expr,X)
X=相交(X,expr) X=相交(expr,X)

本表中列出的每个允许的语句都称为减少作业.根据定义,reduce变量只能出现在这种类型的赋值中。

归约赋值的一般形式是

X=f(X,expr) X = f(expr, X)

下面的示例显示了reduction变量的典型用法X

X=0;%对X进行一些初始化parfori = 1:n X = X + d(i);结束

此循环相当于以下内容,您可以在其中计算每个d(我)通过不同的迭代。

X=X+d(1)+…+d(n)

定期循环、变量X将在进入循环之前或从循环的上一次迭代中获取其值。但是,这一概念不适用于parfor循环。

在一个parfor-循环的值X从未从客户传输到工人或从工人传输到工人。相反,增加了d(我)在每个工人身上完成,并且在数据集的子集上进行测距1:n在该辅助进程上执行。然后将结果传输回客户端,客户端将辅助进程的部分和添加到X.因此,工人做一些添加,客户做其余。

关于所需和建议指南的说明

如果你的parfor代码不遵守标签上的指导方针和限制要求的,您将得到一个错误。MATLAB在读取代码时捕获其中一些错误,在执行代码时捕获其他错误。这些错误标记为必需(静态)必需(动态)分别地不会导致错误的指南被标记为推荐.您可以使用MATLAB代码分析器来帮助parfor-loops遵循指南。

简化变量的基本规则

以下要求进一步定义了与给定变量相关的缩减分配。

必需(静态)对于任何约简变量,在该变量的所有约简赋值中必须使用相同的约简函数或操作。

parfor-左侧的循环无效,因为缩减分配使用+在一个例子中,以及[,]在另一个。的parfor右边的-loop是有效的。

无效的 有效的
parfori=1:n如果测试级别(k)A=A+i;其他的A=[A,4+i];结束%环体结束
parfori=1:n如果测试级别(k)A=A+i;其他的A=A+i+5*k;结束%环体结束
必需(静态):如果reduce赋值使用[,][,],然后X必须始终指定为每个约简赋值中的第一个或第二个参数。

parfor-左侧的循环无效,因为在整个循环中串联项的顺序不一致。这个parfor右边的-loop是有效的。

无效的 有效的
parfori=1:n如果testLevel(k) = [A, 4+i];其他的A=[r(i),A];结束%环体结束
parfori=1:n如果testLevel(k) = [A, 4+i];其他的A=[A,r(i)];结束%环体结束
必需(静态):不能索引或下标还原变量。

左边的代码无效,因为它试图建立索引一个,因此MATLAB无法将其归类为约简变量。为了修复它,右边的代码使用了一个非索引变量。

无效的 有效的
a、 x=0parforI = 1:10 a.x = a.x + 1结束
tmpx=0parfori=1:10tmpx=tmpx+1;结束a、 x=tmpx;

裁减任务的要求

减少任务。除了表中列出的具体形式的缩减分配外还原变量,唯一的另一种(更普遍的)归约赋值形式是

X=f(X,expr) X = f(expr, X)
必需(静态)f可以是函数或变量。如果f是一个变量,则不能更改fparforbody(换句话说,它是一个广播变量)。

如果f是一个变量,那么对于所有实际用途,它在运行时的值都是一个函数句柄。但是,只要可以计算右侧,结果值就存储在X

parfor-左侧的循环无法正确执行,因为语句f=@次原因f被归类为临时变量。因此f在每次迭代开始时清除parfor右边的-loop是正确的,因为它不赋值f内循环。

无效的 有效的
f=@(x,k)x*k;parfori=1:na=f(a,i);%环体f=@次;%影响f结束
f=@(x,k)x*k;parfori=1:na=f(a,i);%环体结束

运营商& &||是不是在表格中列出了还原变量.除了& &||,所有的矩阵运算MATLAB都有相应的函数f,以致u op v相当于f(u,v). 对于& &||,无法编写此函数,因为u&vu | | v可能评估,也可能不评估v然而f(u,v)总是评估v在调用之前f.因此& &||从允许的减少分配表中排除parfor-循环。

每个约简赋值都有一个关联函数f.产品的特性f确保parfor语句的确定性行为的方法将在以下部分中讨论。

归约赋值中的关联性。对于该功能,建议采用以下做法f,用于定义缩减变量。但是,如果不遵守此规则,则不会生成错误。因此,您需要确保您的代码符合此建议。

推荐:获得的确定性行为parfor-循环,还原函数f必须关联。

要结合,函数f必须满足以下所有要求:一个bc

f(a,f(b,c))=f(f(a,b,c)

变量的分类规则,包括归约变量,是纯语法的。他们无法确定f你所提供的是否真的具有关联性。结合性是假定的,但是如果你违反了这个规则,每次执行循环可能会得到不同的答案。

请注意

数学实数的加法是相联的。然而,浮点数的加法只是近似相联的。此运算的不同执行parfor语句可能产生的值X使用不同的舍入错误。您无法避免这种并行性成本。

例如,左边的语句返回1,而右边的语句返回1+每股收益

(1+eps/2)+eps/21+(eps/2+eps/2)

除了减号运算符(-),表中列出的所有特殊情况还原变量具有相应的(近似的)联想功能。MATLAB计算分配X = X - expr通过使用X=X+(-expr)(因此,从技术上讲,计算此缩减分配的函数是)然而,任务X = expr - X无法使用关联函数写入,这解释了它从表中排除的原因。

约化赋值中的交换性。一些结合函数,包括+.*最大值相交联盟,也是可交换的。也就是说,它们满足以下所有条件一个b

f(a,b)=f(b,a)

非交换功能包括(因为矩阵乘法对于两个维度都大于一的矩阵是不可交换的),[,][,].非交换性是要求这些函数的参数顺序一致的原因。作为一个实际问题,更有效的算法是可能的,当一个函数是交换的和结合的,并且parfor被优化以利用交换性。

推荐:除了[,][,],函数f赋值必须是可交换的。如果f是不可交换的,循环的不同执行可能会导致不同的答案。

在用于还原的函数中违反对交换性的限制可能导致意想不到的行为,即使它没有产生错误。

除非f是一个已知的非交换内建函数,它被假定是交换的。中目前没有方法指定用户定义的非交换函数parfor

推荐:超负荷的+.*[,][,]如果在中的缩减赋值中使用,则必须是关联的parfor-循环。
推荐:超负荷的+.*联盟相交必须是可交换的。

同样地,由于对X = X - expr,推荐如下。

推荐:负运算符的重载(-)必须遵守数学定律X-(y+z相当于(X -y) -z

使用自定义缩减函数

假设一个循环的每个迭代执行一些计算,并且您感兴趣的是找出一个循环的哪个迭代产生最大值。这种减少练习在循环的多个迭代中进行积累。你的简化函数必须比较迭代结果,直到所有迭代都比较后,最大值可以确定。

首先考虑约简函数本身。为了将一个迭代结果与另一个迭代结果进行比较,该函数要求将当前结果和到目前为止其他迭代的已知最大值作为输入。每个输入都是包含迭代结果和迭代数的向量。

作用mc=比较最大值(A,B)%用于2元素向量输入的自定义缩减函数如果A(1)>=B(1)%比较两个输入数据值mc=A;返回带有较大结果的向量其他的mc=B;结束结束

在循环内部,每次迭代都调用缩减函数(比较最大),传入一对二元向量:

  • 累积最大值及其迭代指标,即约简变量库马克斯

  • 迭代值和索引

如果当前迭代的数据值大于中的最大值cummmax,该函数返回新值及其迭代次数的向量。否则,该函数将返回现有的最大值及其迭代次数。

每次迭代调用缩减函数比较最大比较自己的数据(dat我)向已经积累的数据库马克斯。请为此循环尝试以下代码。

% cummax的第一个元素是最大数据值%cummax的第二个元素是(迭代)最大值出现的位置cummax=[0];%初始化还原变量parforIi = 1:100 dat = rand();%模拟一些实际计算= comparemax(Cummax, [dat ii]);结束disp(cumax);

链接减少运营商

MATLAB对表单的赋值进行分类X=expr op XX=X运算表达式当它们等价于带括号的赋值时,作为reduce语句X=(expr)op XX = X op (expr)分别地X是一个变量,op是还原运算符,并且expr具有一个或多个二进制约简运算符的表达式。因此,由于MATLAB运算符的优先规则,MATLAB可能不会对某些赋值形式进行分类X=expr op1 X op2 expr2。。。,即链运算符,如parfor循环。

在本例中,MATLAB对X作为约简变量,因为赋值等于X=X+(1*2)

X=0;parfori=1:10 X = X + 1 * 2;结束

在本例中,MATLAB对X作为临时变量,因为赋值,相当于X=(X*1)+2,而不是X=(expr)op XX = X op (expr)

X=0;parfori=1:10 X = X * 1 + 2;结束

最佳做法是,使用括号明确指定链式缩减指定的运算符优先级。

相关话题