简变量

MATLAB®金宝app支持一个重要的例外,所谓的还原,这打破了循环迭代必须是独立的。一个减少变量积累依赖于所有的迭代在一起,但独立于迭代顺序的值。MATLAB允许减少变量PARFOR-loops。

减少变量出现在赋值语句的双方,如下列任何一种,其中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,表达式) X =分钟(表达式,X)
X = MAX(X,表达式) X =最大值(表达式,X)
X =联盟(X,表达式) X =联盟(表达式,X)
X =交叉(X,表达式) X =相交(表达式,X)

在该表中列出的允许语句的每一个被称为减少分配。根据定义,还原变量只能在这种类型的分配出现。

减少分配的一般形式是

X = F(X,表达式) X = F(表达式,X)

下面的示例示出了减少变量的典型用法X

X = 0;%做X的一些初始化PARFORI = 1:N X = X + d(I);结束

这个循环是等效于下面,在那里你计算每d(I)由不同的迭代。

X = X + d(1)+ ... + d(n)的

在常规对于-loop,可变X无论是进入循环前或循环的前一次迭代会得到它的价值。但是,这个概念并不适用于PARFOR-loops。

在一个PARFOR-loop,的值X不会从客户端发送到工人或工人工人。相反,增加的d(I)在每个工人完成后,用一世测距过的所述子集1:N对工人执行。然后将结果发送回客户机,这增加了工人的部分和成X。因此,工人做一些补充的,而客户端没有休息。

注意有关所需和推荐指南

如果你的PARFOR代码不符合标示为指导和限制需要,你会得到一个错误。MATLAB捕捉一些这些错误在当时它读取的代码,和其他人的时候执行的代码。这些错误被标记为必需(静态)要么必需(动态)分别。这不会导致错误指引标记为推荐的。您可以使用MATLAB代码分析器来帮助PARFOR-loops遵守的准则。

减少变量的基本规则

下列要求进一步定义与给定变量相关联的减少赋值。

必需(静态):对于任何减小变量中,相同的还原功能或操作必须在所有还原分配该变量使用。

PARFOR-loop左边是无效的,因为减少分配用途+在一个实例,[,]在另一个。该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;结束%循环体继续结束
必需(静态):如果减少分配用途*[,], 要么[;], 然后X必须始终如一指定为每减少分配第一或第二个参数。

PARFOR-loop左侧,因为在拼接项目的顺序不是整个循环保持一致是无效的。该PARFOR-loop右边是有效的。

无效 有效
PARFORI = 1:n的如果testLevel(K)A = [A,4 + I];其他A = [R(i)中,A];结束%循环体继续结束
PARFORI = 1:n的如果testLevel(K)A = [A,4 + I];其他A = [A,R(I)];结束%循环体继续结束
必需(静态):您不能索引或下标减少变量。

左边的代码是无效的,因为它试图索引一个等MATLAB不能将其分辨为减少变量。为了解决这个问题,在右边的代码使用非索引变量。

无效 有效
a.x = 0PARFORI = 1:10 a.x = a.x + 1;结束
tmpx = 0PARFORI = 1:10 tmpx = tmpx + 1;结束a.x = tmpx;

减少作业要求

减少分配。除了减少分配的具体形式列在表中的简变量中,减少分配的唯一的其他(并且更一般的)的形式是

X = F(X,表达式) X = F(表达式,X)
必需(静态)F可以是一个函数或变量。如果F是一个变量,那么你不能改变F在里面PARFOR体(换言之,它是一个广播变量)。

如果F是一个变量,那么对于所有的实际目的其在运行时的值是一个函数句柄。然而,只要在右侧可以评价,所得到的值被存储在X

PARFOR-loop左侧没有因为语句正确执行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,这样ü运v相当于F(U,V)。对于&&||,这样的功能不能写,因为ü&& vü|| v可能或不可能评估v。然而,F(U,V)总是评估板v致电前F。因此&&||被排除在允许减少分配要的表PARFOR-循环。

每减少分配具有相关功能F。的性质F这保证了PARFOR声明确定的行为在下面的章节中讨论。

关联性在减少作业。下面的练习推荐功能F,如在减少变量的定义中使用。但是,如果没有遵守本规则不产生错误。因此,它是由你来确保你的代码符合这一建议。

推荐的:要获得确定性的行为PARFOR-loops,还原功能F必须是关联的。

要关联,功能F必须满足以下所有一个bC

F(A,F(B,C))= F(F(A,B),C)

变量,包括减少变量的分类规则,是纯粹的语法。他们不能确定是否F您提供的是真正的关联与否。假定关联性,但如果违背这个规律,循环的每次执行可能会导致不同的答案。

注意

加法数学实数是关联的。然而,除了浮点数的大约只有联想。这种不同的执行PARFOR声明可能会产生的值X用不同的舍入误差。你不能避免并行的这笔费用。

例如,在左侧产量1的声明,而右边返回1语句+EPS

(1 + EPS / 2)+ EPS / 2 1 +(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 - (ÿ+ž相当于(X -ÿ) -ž

使用自定义功能降低

假定一个循环执行的每次迭代一些计算,并且你有兴趣在寻找其中循环的迭代产生的最大值。这种减少运动使得整个循环的多次迭代的积累。您还原功能必须比较迭代结果,直到可以全部迭代进行比较后确定的最大值。

首先考虑减少函数本身。进行比较的另一个一次迭代结果,功能需要输入当前结果和来自其它的迭代中已知的最大为止。每个的两个输入端是包含迭代结果与迭代次数的载体。

功能MC = comparemax(A,B)2元素向量输入定制%减少功能如果A(1)> = B(1)%比较两个输入数据值MC = A;%回用更大的结果的矢量其他MC = B;结束

在循环中,每次迭代调用减弱功能(comparemax),传递在一对两个元素的向量的:

  • 累积的最大和其迭代指数,这是减少可变cummax

  • 迭代值和指数

如果当前迭代的数据值比最大更大cummmax,该函数返回的新值和它的迭代次数的向量。否则,该函数返回的最大存在和它的迭代次数。

每次迭代调用缩小功能comparemax比较其自己的数据[DAT I]在已经积累的数据cummax。试试这个循环将下面的代码。

%cummax的第一个元素是最大数据值cummax的%第二元件是其中(迭代)最大值出现cummax = [0 0];%初始化减少可变PARFORII = 1:100的DAT = RAND();%模拟一些实际计算cummax = comparemax(cummax,[DAT II]);结束DISP(cummax);

链接运营商减少

MATLAB分类形式分配X = EXPR运算X要么X = X运算EXPR当他们等同于括号内的分配减少声明X =(表达式)运算X要么X = X OP(表达式)分别。X是一个变量,是降低操作者,并且EXPR是与一种或多种二元减少运营商的表达式。因此,由于MATLAB运算符优先级规则,MATLAB可能不会进行分类形式的一些任务X = EXPR OP1 X OP2表达式2 ...,该链运营商,如减少陈述中PARFOR-loops。

在这个例子中,MATLAB进行分类X作为还原的变量,因为分配是等效于X = X +(1 * 2)

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

在这个例子中,MATLAB进行分类X作为临时变量,因为分配时,相当于X =(X * 1)+ 2,是形式的不X =(表达式)运算X要么X = X OP(表达式)

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

作为最佳实践,使用括号明确指定运算符优先级的链式减少分配。

相关话题