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
必须满足以下所有一个
,b
和C
。
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;结束
作为最佳实践,使用括号明确指定运算符优先级的链式减少分配。