MATLAB®金宝app支持对循环迭代必须是独立的规则的重要异常,称为还原。一个减少变量累积依赖于所有迭代的值,但与迭代顺序无关。MATLAB允许减少变量parfor
循环。
减少变量出现在分配声明的两侧,例如下列任何一个,其中expr.
是一个MATLAB表达式。
X = X + exp |
x = expr + x |
X = X - expr |
参见约简赋值中的结合性裁减作业的要求 |
X = X .* expr |
x = expr。* x |
x = x * expr |
x = expr * x |
X = X |
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 = union(X, expr) |
x = Union(expr,x) |
X = intersect(X, expr) |
x =相交(expr,x) |
这个表中列出的每个允许的语句被称为a减少作业.根据定义,reduce变量只能出现在这种类型的赋值中。
减少转让的一般形式是
x = f(x,expr) |
X = f(expr, X) |
下面的示例显示了reduction变量的典型用法X
.
X = 0;%做一些初始化xparfori = 1:n X = X + d(i);结束
这个循环等价于下面的循环,在这里计算每个循环d(我)
通过不同的迭代。
x = x + d(1)+ ... + d(n)
在常规为
循环、变量X
将在进入循环之前或从循环的上一次迭代中获取其值。然而,这个概念并不适用于parfor
循环。
在一个parfor
-loop,值X
从不从客户传递给工人或从工人传递给工人。相反,增加的d(我)
在每个工人完成我
范围内容1: n
正在对那个工人进行。然后将结果发送回客户端,该客户将部分和的工作人员添加到X
.因此,工作人员做一些添加,而客户做其余的工作。
如果你的parfor
代码不遵守标签上的指导方针和限制要求,你得到一个错误。MATLAB在读取代码时捕获其中一些错误,以及当它执行代码时。这些错误被标记为必需(静态)或者所需的(动态)分别。不会导致错误的指导方针被标记为推荐.您可以使用MATLAB代码分析器来帮助parfor
-loops遵循指南。
以下要求进一步定义与给定变量相关联的约简赋值。
必需(静态)对于任何约简变量,在该变量的所有约简赋值中必须使用相同的约简函数或操作。 |
的parfor
- 左侧leop无效,因为减少分配使用+
在一个例子中,[,]
在另一个。的parfor
右边的-loop是有效的。
无效的 | 有效的 |
---|---|
parfori = 1: n如果testlevel(k)a = a + i;其他的a = [a,4 + i];结束%环形体继续结束 |
parfori = 1: n如果testlevel(k)a = a + i;其他的A = A + i + 5*k;结束%环形体继续结束 |
必需(静态):如果reduce赋值使用* ,[,] , 或者[,] ,然后X 必须始终指定为每次减少任务中的第一个或第二个参数。 |
的parfor
左边的-loop无效,因为连接项的顺序在整个循环中不一致。的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 = 0.parforI = 1:10 a.x = a.x + 1结束 |
tmpx = 0parforI = 1:10 TMPX = TMPX + 1;结束a.x = tmpx; |
减少作业。除了表中列出的特定形式的减少分配减少变量,唯一的另一种(更一般)的减少任务形式是
x = f(x,expr) |
X = f(expr, X) |
必需(静态):f 可以是函数或变量。如果f 是一个变量,那么你就不能改变了f 在parfor 身体(换句话说,它是一个广播变量)。 |
如果f
是一个变量,那么对于所有实际目的,运行时的值是函数句柄。但是,只要可以评估右侧,所产生的值存储在X
.
的parfor
- 在左边的leop不正确执行,因为声明f = @times.
原因f
被归类为临时变量。因此f
在每次迭代开始时被清除。的parfor
右边的-loop是正确的,因为它不赋值f
内循环。
无效的 | 有效的 |
---|---|
f = @(x,k)x * k;parforI = 1:n a = f(a, I);%环形体继续f = @times;%影响f结束 |
f = @(x,k)x * k;parforI = 1:n a = f(a, I);%环形体继续结束 |
运营商& &
和||
是不是在表格中列出了减少变量.除了& &
和||
,所有的矩阵运算MATLAB都有相应的函数f
,这样u op v
相当于f (u, v)
.为& &
和||
,这样的函数不能写,因为u&&v
和u | | v
可能或可能无法评估v
.然而,f (u, v)
总是评估v
在调用之前f
.因此& &
和||
被排除在允许的减少分配的表格之外parfor
-环形。
每个减少分配都有一个相关的功能f
.的属性f
确保在以下部分中讨论了Parcon语句的确定性行为。
减少任务中的关联性。建议使用以下练习f
,用于简化变量的定义。但是,如果不遵守该规则,则不会产生错误。因此,您需要确保您的代码满足该建议。
推荐:获得确定性行为parfor -loops,还原函数f 必须关联。 |
要结合,函数f
必须满足以下所有人一个
,b
, 和c
.
f(a,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
.
推荐:过载+ ,* ,.* ,[,] , 或者[,] 在aparfor -环形。 |
推荐:过载+ ,.* ,联盟 , 或者相交 必须是换向的。 |
同样的,由于特殊的处理X = X - expr
,推荐如下。
推荐:负运算符的重载(- )必须遵守数学定律X - ( 相当于(X - . |
在本例中,您在一个循环中运行计算,并存储最大值和相应的循环索引。你可以用自己的约简函数和parfor
-loop加快代码。在每次迭代中,将计算值和循环索引存储在2元素行向量中。使用自定义缩小功能将此向量与存储的向量进行比较。如果来自计算的值大于存储的值,则将旧的向量替换为新矢量。
创建减少函数valueAndIndex
.该函数以两个向量作为输入:valueandindexa.
和valueandindexb.
.每个向量包含一个值和一个索引。减少功能valueAndIndex
返回具有最大值(第一个元素)的向量。
功能v = compareValue(valueAndIndexA, valueAndIndexB) valueA = valueAndIndexA(1);valueB = valueAndIndexB (1);如果valueA > valueB v = valueAndIndexA;其他的v = valueandindexb;结束结束
创建一个1 × 2的全是0的向量,maxvalueandindex.
.
maxValueAndIndex = [0 0];
parfor
-环形。在每次迭代中,使用兰德
创建随机值。然后,使用减少函数valueAndIndex
比较maxvalueandindex.
到随机值和循环索引。当您将结果存储为maxvalueandindex.
, 你用maxvalueandindex.
作为减少变量。
parfor2 = 1:10 0%模拟一些实际计算thisValueAndIndex = [rand() ii];%比较值maxvalueandindex = Compvevalue(maxvalueandindex,thingvalueandindex);结束
后parfor
循环结束运行,reduce变量maxvalueandindex.
在客户端上可用。第一个元素是所计算的最大随机值parfor
-loop,第二个元素是对应的循环索引。
maxvalueandindex.
maxvalueandindex = 0.9706 89.0000
matlab对表单的分配进行分类X = expr op X
或者x = x op expr
当它们等价于带括号的赋值时,作为reduce语句X = (expr) op
或者X = 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
或者X = X op (expr)
.
X = 0;parfori=1:10 X = X * 1 + 2;结束
作为最佳实践,使用括号显式指定链式约简赋值的操作符优先级。