减少变量
MATLAB®万博1manbetx支持一个重要的例外,称为减少,循环迭代的规则必须独立。一个减少变量积累的值取决于一起迭代,但独立于迭代顺序。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 = 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 是一个变量,那么你不能改变吗f 在parfor 身体(换句话说,它是一个广播变量)。 |
如果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&&v
和u | | 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 - ( 相当于(X - 。 |
减少使用自定义函数
在本例中,您在一个循环中运行计算和存储的最大价值和相应的循环指数。您可以使用自己的功能和减少parfor
循环加速您的代码。在每个迭代中,存储的值计算和循环指数2-element行向量。减少使用自定义函数来比较这个向量存储向量。如果计算的值大于存储值,取代旧的向量与向量。
创建一个减函数compareValue
。这个函数接受两个向量作为输入:valueAndIndexA
和valueAndIndexB
。每个向量都包含一个值和一个索引。减少功能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 X
或X = X op expr
为减少语句时相当于括弧内作业X = X (expr) op
或X = 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) op
或X = X op (expr)
。
X = 0;parfor我= 1:10 X = X * 1 + 2;结束
作为一项最佳实践,应该使用括号来显式地指定运算符优先级减少连接作业。