主要内容

减少变量

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是一个变量,那么你就不能改变了fparfor身体(换句话说,它是一个广播变量)。

如果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&&vu | | 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 - (y+z相当于(X -y) -z

使用自定义缩减函数

在本例中,您在一个循环中运行计算,并存储最大值和相应的循环索引。你可以用自己的约简函数和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;结束

作为最佳实践,使用括号显式指定链式约简赋值的操作符优先级。

相关话题