主要内容

减少变量

MATLAB®万博1manbetx支持一个重要的例外,称为减少,循环迭代的规则必须独立。一个减少变量积累的值取决于一起迭代,但独立于迭代顺序。MATLAB允许减少变量parfor循环。

减少变量出现在赋值语句的双方,如下列,exprMATLAB是一个表达式。

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 = min (X, expr) X = min (expr X)
X = max (X, expr) X = max (expr X)
X =联盟(X, expr) X =联盟(expr X)
X =相交(X, expr) X =相交(expr X)

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

减少作业的一般形式

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

下面的示例显示了一个典型的使用减少变量X

X = 0;%做一些初始化的Xparfori = 1: n X = X + d(我);结束

这个循环相当于以下,你计算d(我)由不同的迭代。

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

在一个常规循环、变量X会得到它的值在进入循环或上一次迭代的循环。然而,这并不适用于概念parfor循环。

在一个parfor循环的价值X从来没有从客户端传播从工人工人或工人。相反,增加的d(我)在每个工人做,范围的子集1:n执行工作。结果传回到客户端,增加的部分和工人X。因此,工人做一些补充,和客户的休息。

要求和建议的指导方针

如果你的parfor代码不遵守指导方针和限制贴上要求,你会得到一个错误。MATLAB捕获这些错误时它读取代码,和其他人的时候执行的代码。这些错误都贴上要求(静态)所需的(动态)分别。标记为指导方针,不会引起错误推荐。您可以使用MATLAB代码分析器的帮助parfor循环遵守指导方针。

为减少变量基本规则

以下需求进一步定义减少作业与给定变量相关。

要求(静态):对于任何减少变量,减少相同的函数或操作必须用于所有变量减少作业。

parfor减少循环左边是无效的,因为作业使用+在一个实例[,]在另一个。的parfor循环在右边是有效的。

无效的 有效的
parfori = 1: n如果testLevel (k) = A + i;其他的一个= (,4 + i);结束%循环体持续结束
parfori = 1: n如果testLevel (k) = A + i;其他的= +我+ 5 * k;结束%循环体持续结束
要求(静态):如果减少作业使用*,[,],或[,],然后X必须始终指定为第一或第二个参数减少在每一个任务。

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

无效的 有效的
parfori = 1: n如果testLevel (k) = (, 4 + i);其他的一个= [r (i), A];结束%循环体持续结束
parfori = 1: n如果testLevel (k) = (, 4 + i);其他的一个= (A r (i));结束%循环体持续结束
要求(静态):你不能指数或下标变量减少。

左边的代码是无效的,因为它试图指数一个MATLAB,所以不能把它归类为减少变量。要修复它,右边的代码使用一个非索引变量。

无效的 有效的
一个。x = 0parfor我= 1:10。x = a。x + 1;结束
tmpx = 0parfor我= 1:10 tmpx = tmpx + 1;结束一个。x = tmpx;

要求减少作业

减少作业。除了减少分配表中列出的具体形式减少变量,唯一的其他(更普遍)的任务是减少形式

X = f (X, expr) X = f (expr X)
要求(静态):f可以是一个函数或一个变量。如果f是一个变量,那么你不能改变吗fparfor身体(换句话说,它是一个广播变量)。

如果f是一个变量,那么实际上在运行时它的值是一个函数处理。然而,只要右边可以评估,得到的值存储在X

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

无效的 有效的
f = @ (x, k) x * k;parfori = 1: n = f(我);%循环体持续f = @times;%影响f结束
f = @ (x, k) x * k;parfori = 1: n = f(我);%循环体持续结束

运营商& &| |表中没有列出在吗减少变量。除了& &| |,所有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必须满足以下所有一个,b,c

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

变量的分类规则,包括减少变量,纯粹是语法。他们不能确定f你是否真正关联提供。结合性假设,但如果你违反这条规则,每个执行的循环可能导致不同的答案。

请注意

的数学实数是联想。然而,浮点数的增加只是大约关联。不同的执行parfor声明可能产生的值X与不同的舍入错误。你不能避免这种并行性的成本。

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

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

除了-操作符(- - - - - -),表中列出的所有特殊情况减少变量有一个相应的(大约)关联函数。MATLAB计算任务X = X - expr通过使用X = X + (expr)。(所以,从技术上讲,函数计算减少作业+,而不是-)。然而,作业X = expr - X不能使用一个关联函数写的,这也解释了它被排除在桌子上。

交换性在减少作业。一些关联函数,包括+,。*,最小值,马克斯,相交,联盟也交换。也就是说,他们满足以下所有一个b

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

非交换功能包括*(因为矩阵乘法不交换矩阵的两个维度都大小大于1),[,],[,]。不可交换性的顺序一致性的原因是这些函数的参数是必需的。作为一个实际问题,更有效的算法是可能的交换以及关联函数时,和parfor优化利用交换性。

推荐:的情况下除外*,[,],[,],函数f减少任务必须交换。如果f不是交换,循环可能导致的不同执行不同的答案。

违反限制在一个函数用于交换性减少可能导致意想不到的行为,即使它不产生一个错误。

除非f是一种已知的非交换内置函数,它是假定为交换。目前还没有指定一个用户定义的方式,非交换功能parfor

推荐:超载的+,*,。*,[,],或[,]必须关联如果用于减少作业吗parfor循环。
推荐:超载的+,。*,联盟,或相交必须交换。

同样,由于特殊待遇X = X - expr,以下是推荐。

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

减少使用自定义函数

在本例中,您在一个循环中运行计算和存储的最大价值和相应的循环指数。您可以使用自己的功能和减少parfor循环加速您的代码。在每个迭代中,存储的值计算和循环指数2-element行向量。减少使用自定义函数来比较这个向量存储向量。如果计算的值大于存储值,取代旧的向量与向量。

创建一个减函数compareValue。这个函数接受两个向量作为输入:valueAndIndexAvalueAndIndexB。每个向量都包含一个值和一个索引。减少功能compareValue返回向量最大的值(第一个元素)。

函数v = compareValue (valueAndIndexA valueAndIndexB) valueA = valueAndIndexA (1);valueB = valueAndIndexB (1);如果valueA > valueB v = valueAndIndexA;其他的v = valueAndIndexB;结束结束

创建一个向量1×2 0,maxValueAndIndex

maxValueAndIndex = [0 0];
运行一个parfor循环。在每个迭代中,使用兰德创建一个随机值。然后,使用减函数compareValue比较maxValueAndIndex随机值和循环指数。当你保存结果maxValueAndIndex,可以使用maxValueAndIndex作为减少变量。

parfor2 = 1:10 0%模拟一些实际计算thisValueAndIndex = (rand () ii);%比较值maxValueAndIndex = compareValue (maxValueAndIndex thisValueAndIndex);结束

parfor循环结束运行时,减少变量maxValueAndIndex可以在客户端。第一个元素是最大的随机值计算parfor循环,第二个元素是相应的循环指数。

maxValueAndIndex
maxValueAndIndex = 0.9706 - 89.0000

链接减少运营商

MATLAB分类作业的形式X = expr op XX = X op expr为减少语句时相当于括弧内作业X = X (expr) opX = X op (expr)分别。X是一个变量,人事处减少运营商,expr是一个表达式与一个或多个二进制减少运营商。因此,由于MATLAB的运算符优先级规则,MATLAB可能不作业的形式进行分类X = expr op1 X op2 expr2……连锁运营商,为减少语句parfor循环。

在这个例子中,MATLAB分类X为减少变量,因为作业相当于X = X + (1 * 2)

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

在这个例子中,MATLAB分类X作为一个临时变量,因为作业,相当于X = X * 1 + 2,不是形式X = X (expr) opX = X op (expr)

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

作为一项最佳实践,应该使用括号来显式地指定运算符优先级减少连接作业。

相关的话题