主要内容

变量分类议案- 酥油

概述

马铃薯®编码器™将变量分类为一个议案- 进入下表中的一个类别。它不支持它无法对的变量。金宝app如果一个议案-loop包含不能唯一分类的变量,或者如果变量违反其类别限制,则议案-loop生成错误。

分类 描述
环形 用作阵列的循环索引
切片 通过不同的循环迭代运行段的数组
播送 在循环中使用的循环之前定义的变量,但未在循环中分配
减少 无论迭代顺序如何,累积循环迭代的值
暂时的 在循环中创建的变量,但与切片或减少变量不同,循环外不可用

此代码片段中显示这些变量分类中的每一个:

a = 0;c = pi;z = 0;r = rand(1,10);Parcon i = 1:10 A = I;%'a'是临时变量z = z + i;%'z'是减少变量b(i)= r(i);%'B'是切片输出变量;如果i <= c%'c'是广播变量d = 2 * a,则%'r'是切片的输入变量;%'d'是一个临时可变结束

切片变量

一种切片变量是一个人可以分成段的价值,或者切片,然后通过不同的线程单独操作。循环的每次迭代都适用于阵列的其他片。

在下一个例子中,一片切片一种由该数组的一个元素组成:

Parcon i = 1:长度(a)b(i)= f(a(i));结尾

切片变量的特征

一个变量议案-Loop如果具有以下特征,则会切片:

  • 第一级索引类型 - 第一级索引是括号,()

  • 固定索引列表 - 在第一级括号内,索引列表对于给定变量的所有出现是相同的。

  • 索引的形式 - 在变量的索引列表中,恰好一个索引涉及循环变量。

  • 数组的形状 - 在分配切片变量时,分配的右侧不是[]要么''(这些运营商表示删除元素)。

第一级索引类型。对于切片变量,第一级索引括在括号中,()。例如,一种(...)。如果您使用点表示法引用变量,斧头,变量不会切片。

多变的一种在左边没有切片;多变的一种在右边切片:

A.Q(i,12)a(i,12).q

固定索引清单。在切片变量的索引的第一级括号内,对于给定变量的所有出现,索引列表是相同的。

多变的B.在左边没有切片,因为B.是索引的一世I + 1在不同的地方。多变的B.在右边切片。

Parcel i = 1:10 b(i)= b(i + 1)+ 1;结尾
Parcel i = 1:10 b(i + 1)= b(i + 1)+ 1;结尾

索引的形式。在切片变量的索引列表中,一个索引是表单一世我+ K.我知道K + I., 要么K-I.

  • 一世是循环变量。

  • K.是一个常量或简单(非indexed)变量。

  • 每个其他索引都是一个常量,一个简单的变量,冒号或结尾

当您使用其他变量以及循环变量来索引数组时,无法在循环中设置这些变量。这些变量在整个执行时常量议案陈述。您不能将循环变量本身组合以形成索引表达式。

在以下示例中,一世是循环变量,jK.是非出现的变量。

变量A没有切片 变量A切片
a(i + f(k),j,:3)a(i,20:30,结束)a(i,:,s.field1)
a(i + k,j,:,3)a(i,:,结束)a(i,:,k)

阵列的形状。切片变量必须保持恒定的形状。在以下示例中,变量一种没有切片:

a(i,:) = [];a(结束+ 1)= i;

广播变量

一种广播变量是除循环变量之外的变量还是未在循环内未修改的切片变量。

减少变量

一种减少变量累积取决于所有迭代的值,但与迭代顺序无关。

这个例子显示了一个议案-loop使用标量缩减分配。它使用减少变量X积累一笔余额10.循环的迭代。线程上迭代的执行顺序无关紧要。

x = 0;parcon i = 1:10 x = x + i;结束X.

在哪里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 = min(x,expr) x = min(expr,x)
x = max(x,expr) x = max(expr,x)
x = f(x,expr)
功能F必须是用户定义的函数。
x = f(expr,x)
减少减少函数的分配,关联性和换向

每个允许的陈述被称为a减少任务。还原变量只能在此类型的分配中出现。

以下示例显示了减少变量的典型用法X

x = ......;%de x par for i = 1:n x = x + d(i)的初始化;结尾

此循环相当于以下内容,其中D(i)由不同的迭代计算:

x = x + d(1)+ ... + d(n)

如果循环是常规的为了-loop,变量X在每个迭代中,在进入循环或从循环的先前迭代之前会获得其值。但是,这个概念不适用于议案- 砍伐。

在一个议案-loop,值X不会直接在每个线程内更新。相反,添加了D(i)在每个线程中完成,有一世范围内容1:n ..正在对该线程进行。然后该软件将结果累积为X

同样,减少:

r = r  x(i)
相当于:
r = R  x(1)]  x(2)...  x(n)
操作首先应用于x(1)... x(n),然后将部分结果应用于R.

如果操作采用两个输入,应符合以下标准之一:

  • 采取两个论点typeof(x(i))并回归typeof(x(i))

  • 争论typeof(r)一之一typeof(x(i))并回归typeof(r)

减少变量的规则

在所有降低分配中使用相同的缩小功能或操作。对于减少变量,您必须在该变量的所有缩减作业中使用相同的缩小功能或操作。在以下示例中,议案- 在左侧无效,因为减少分配使用+在一个实例中,*在另一个。

无效使用减少变量 有效使用减少变量
il i = 1:n如果a> 5 * k a = a + 1;否则a = a * 2;结尾
il i = 1:n如果a> 5 * k a = a * 3;否则a = a * 2;结尾

减少函数参数和返回类型的限制。减少r = r x(i),应该采取论据typeof(x(i))并回归typeof(x(i))或采取争论typeof(r)typeof(x(i))并回归typeof(r)

在以下示例中,在无效循环中,R.是一个固定点类型和2不是。解决这个问题,演员2与之相同R.

无效使用减少变量 有效使用减少变量
函数r = fiops(in)r = fi(in,'wordlength',20,...'fractionlength',14,...'summode','specifyprecision',...'sumwordlength',20,..。'sumfractionlength',14,...'productmode','specifyprecision',...'profectwordlength',20,...'ProductFractionLength',14);Parcel i = 1:10 r = r * 2;结尾
r = fi(in,'wordlength',20,...'fractionlength',14,...'summode','specifyprecision',...'sumwordlength',20,...'sumfractionlength',14,...'productMode','specifyprecision',...'profectwordlength',20,...'ProductFractionLength',14);t = numerictype;f = r.fimath;Parcon i = 1:10 r = r * fi(2,t,f);结尾

在以下示例中,减少函数FCN.无效,因为输入时不会处理案例是固定的点。(这+*操作是自动多态性的。)您必须编写多态版本FCN.处理预期的输入类型。

无效使用减少变量 有效使用减少变量
功能[y0,y1,y2] = pfuserfcn(u)y0 = 0;Y1 = 1;[f,n] = fiprops();y2 = fi(1,n,f);parcol(i = 1:numel(u),12)y0 = y0 + u(i);Y1 = Y1 * U(i);y2 = fcn(y2,u(i));结束函数y = fcn(u,v)y = u * v;结尾
功能[y0,y1,y2] = pfuserfcn(u)y0 = 0;Y1 = 1;[f,n] = fiprops();y2 = fi(1,n,f);parcol(i = 1:numel(u),12)y0 = y0 + u(i);Y1 = Y1 * U(i);y2 = fcn(y2,u(i));结束末端%FCN处理Double%和FI函数Y = FCN(U,V)的输入ISA(U,'Double')Y = U * V;否则[f,n] = fiprops();Y = U * fi(v,n,f); end end function [F, N] = fiprops() N = numerictype(1,96,30); F = fimath('ProductMode',... 'SpecifyPrecision',... 'ProductWordLength',96); end

减少减少函数的分配,关联性和换向

减少任务Matlab编码器不允许减少变量在任何地方读取议案- 除了还原陈述之外。在以下示例中,呼叫Foo(r)减少声明后r = r + i导致循环无效。

函数r = temp%#codegen r = 0;il i = 1:10 r = r + i;foo(r);结束

减少任务中的关联性。如果使用用户定义的函数F在减少变量的定义中,获得确定性行为议案- 减少函数F必须是联想。

笔记

如果F不是联想,Matlab编码器不会生成错误。您必须编写符合此建议的代码。

要关联,功能F必须满足以下所有人一种B., 和C

f(a,f(b,c))= f(f(a,b),c)

减少作业中的换向。一些关联功能,包括+, 和最大限度,也是换向的。也就是说,他们满足所有人的满足一种B.

f(a,b)= f(b,a)

功能F减少分配必须是合作的。如果F不是换向的,不同的循环执行可能会导致不同的答案。

除非F是一个已知的非传染性内置,软件假定它是换向的。

临时变量

一种临时变量是一个可变的变量,它是直接,非诊断的目标,但不是减少变量。在下面的议案-环形,一种D.是临时变量:

a = 0;z = 0;r = rand(1,10);parcer i = 1:10 a = i;%变量A是临时z = z + i;如果我<= 5 d = 2 * a;%变量D是临时结束端

与a的行为相反为了- 在每次迭代之前议案-环形,Matlab编码器有效地清除临时变量。因为迭代必须是独立的,所以临时变量的值不能从循环的一个迭代传递给另一个迭代。因此,临时变量必须设置在a的主体内议案-Loop,因此它们的值是单独定义的每次迭代。

在上下文中的临时变量议案语句与循环外部存在的相同名称的变量不同。

未初始化的临时

因为临时变量在每次迭代开始时都被清除,Matlab编码器可以检测到某些情况,其中通过循环迭代在迭代之前使用临时变量。在这种情况下,Matlab编码器发出静态错误而不是运行时错误,因为如果将发生运行时错误,则允许执行时几乎没有点。例如,假设您写入:

b =真;Parcon i = 1:n如果b && some_condition(i)do_something(i);b = false;结束......结束

这个循环是普通的为了- 但作为一个议案-环形,B.是临时变量,因为它直接发生作为循环内部的分配的目标。因此,它在每次迭代开始时被清除,因此它在其条件下使用如果是未初步的。(如果你改变了议案为了, 的价值B.假设循环连续执行,这样do_something(i)仅用于较低的值一世直到B.是一定的错误的。)