16.3特别的工具矩阵

 
I = eye ()
I = eye (n)
I = eye (m, n)
I = eye ([m, n])
I = eye (…, class)

返回一个单位矩阵。

如果不带参数调用,返回标量值1.

如果带一个标量参数n调用,返回一个NxN的单位矩阵。

如果带两个参数(m, n), 或一个2元素向量 [mn]调用, 返回一个MxN的单位矩阵,其中m是行数,n是列数。

可选参数class指定了返回矩阵的类型,默认为"double".

例子 1 : 1输入,单位方阵

eye (3)
 ⇒   1  0  0
     0  1  0
     0  0  1

例子 2 : 以下表达式都会返回2x2单位矩阵

eye (2) ≡ eye (2, 2) ≡ eye (size ([1, 2; 3, 4]))
 ⇒   1  0
     0  1

例子 3 : 2x2 uint8 单位矩阵

I = eye (2, "uint8")

编程注意:不带参数调用eye等价于带参数1调用。 任何负维度都被视为零。这些奇怪的定义是为了与MATLAB兼容。

详见: speye,ones,zeros.

 
x = ones ()
x = ones (n)
x = ones (m, n, …)
x = ones ([m, n, …])
x = ones (…, class)
x = ones (…, "like", var)

返回一个标量,矩阵或N维数组,其元素均为 1.

如果不带参数调用,返回标量值1.

如果使用单个标量整数参数n调用,返回一个NxN方阵。

如果使用两个或多个标量整数参数或整数向量调用,则返回具有给定维度的数组。

可选参数class指定返回数组的类,默认为"double".

如果变量var在之后指定"like",输出val将具有与相同的数据类型、复杂度和稀疏性var.

例子 1 : MxN 矩阵,元素值为val

C = val * ones (m, n)

例子 2 : MxN 矩阵,元素为 uint8

C = ones (m, n, "uint8")

编程注意:任何负数维度都被视为零,任何零维度将导致一个空矩阵。这些奇怪的定义是为了与MATLAB兼容。

详见: zeros, true, false.

 
x = zeros ()
x = zeros (n)
x = zeros (m, n, …)
x = zeros ([m, n, …])
x = zeros (…, class)
x = zeros (…, "like", var)

返回一个标量,矩阵或N维数组,其元素均为 0.

如果不带参数调用,返回标量值0.

如果使用单个标量整数参数n调用,返回一个NxN方阵。

如果使用两个或多个标量整数参数或整数向量调用,则返回具有给定维度的数组。

可选参数class指定返回数组的类,默认为"double".

如果变量var在之后指定"like",输出val将具有与相同的数据类型、复杂度和稀疏性var.

例子 : MxN的uint8矩阵

C = ones (m, n, "uint8")

编程说明:任何负数维度都被视为零,任何零维度将导致一个空矩阵。这些奇怪的定义是为了与MATLAB兼容。

详见: ones, true, false.

 
B = repmat (A, m)
B = repmat (A, m, n)
B = repmat (A, m, n, p …)
B = repmat (A, [m n])
B = repmat (A, [m n p …])

重复矩阵或N-D数组。

形成大小的块矩阵mxn,带有矩阵的副本A作为每个元素。

如果n未指定,形成mxm块矩阵。如果沿两个以上维度进行复制,请指定跨每个维度进行复制的次数m,n,p,…,在第二个自变量的向量中。

详见: bsxfun,kron,repelems.

 
y = repelems (x, r)

从中构造重复元素的向量x.

r是2xN指定要重复的元素以及重复每个元素的频率的整数矩阵。第一行中的分量,r(1,j),选择要重复的元素。第二行中的相应分量,r(2,j),指定重复计数。如果x是amatrix,那么的列x为了选择索引的目的,被想象为堆叠在彼此之上。总是返回行向量。

从概念上讲,结果计算如下:

y = [];
for i = 1:columns (r)
  y = [y, x(r(1,i)*ones(1, r(2,i)))];
endfor

详见: repmat,cat.

 
xxx = repelem (x, R)
xxx = repelem (x, R_1, …, R_n)

从中构造重复元素的数组x和重复指令R_1, ...

x必须是标量、向量或N维数组。

重复指令R_j必须是标量或向量。如果该指令是标量,则的每个组件x在尺寸上j重复R_j时间。如果指令是一个向量,那么它必须具有与相应维度相同数量的元素j属于x。在这种情况下k维度的第th个分量j以色列R_j(k)时间。

如果x是标量或向量,那么repelem只需一条重复指令即可调用Rrepelem将返回与输入方向相同的向量。

如果x是一个矩阵,那么至少有两个R_j必须指定s。

注意:使用repelem带有向量x和的向量R_j相当于游程长度解码。

示例:

A = [1 2 3 4 5];
B = [2 1 0 1 2];
repelem (A, B)
  ⇒    1   1   2   4   5   5
A = magic (3)
  ⇒   A =
       8   1   6
       3   5   7
       4   9   2
B1 = [1 2 3];
B2 = 2;
repelem (A, B1, B2)
  ⇒      8   8   1   1   6   6
         3   3   5   5   7   7
         3   3   5   5   7   7
         4   4   9   9   2   2
         4   4   9   9   2   2
         4   4   9   9   2   2

更多R_j可以指定的尺寸数x.任何超额R_j必须是标量(因为x的尺寸仅为1),并且x将在这些维度上被复制。

A = [1 2 3 4 5];
B1 = 2;
B2 = [2 1 3 0 2];
B3 = 3;
repelem (A, B1, B2, B3)
  ⇒     ans(:,:,1) =
           1   1   2   3   3   3   5   5
           1   1   2   3   3   3   5   5

        ans(:,:,2) =

           1   1   2   3   3   3   5   5
           1   1   2   3   3   3   5   5

        ans(:,:,3) =
           1   1   2   3   3   3   5   5
           1   1   2   3   3   3   5   5

R_j必须按顺序指定。占位符1可以用于不需要复制的维度。

repelem ([-1, 0; 0, 1], 1, 2, 1, 2)
  ⇒   ans(:,:,1,1) =
        -1  -1   0   0
         0   0   1   1

      ans(:,:,1,2) =
        -1  -1   0   0
         0   0   1   1

如果更少R_j给定的维数大于中的维数x,repelem将假定R_j对于这些尺寸为1。

A = cat (3, [-1 0; 0 1], [-1 0; 0 1])
  ⇒   ans(:,:,1) =
        -1   0
         0   1

      ans(:,:,2) =
        -1   0
         0   1

repelem (A,2,3)
  ⇒   ans(:,:,1) =
        -1  -1  -1   0   0   0
        -1  -1  -1   0   0   0
         0   0   0   1   1   1
         0   0   0   1   1   1

      ans(:,:,2) =
        -1  -1  -1   0   0   0
        -1  -1  -1   0   0   0
         0   0   0   1   1   1
         0   0   0   1   1   1

repelem保留的类x,并与字符串、元胞数组、NA和NAN输入一起起作用。如果有R_j如果为0,则输出将为空数组。

repelem ("Octave", 2, 3)
  ⇒     OOOccctttaaavvveee
        OOOccctttaaavvveee

repelem ([1 2 3; 1 2 3], 2, 0)
  ⇒     [](4x0)

详见: cat,kron,repmat.

函数linspacelogspace使创建具有均匀或对数间隔元素的向量变得非常容易。详见范围.

 
y = linspace (start, end)
y = linspace (start, end, n)

返回带有的行向量n之间的线性间隔元素startend.

如果元素的数量n大于1,则端点startend总是包含在范围内。如果start大于end,元素按递减顺序存储。如果,则点数n则使用值100。

这里的linspace当两者都存在时,函数返回一个行向量startend是标量。如果一个或两个输入都是向量,那么linspace将它们转换为列向量,并返回一个矩阵,其中每行是之间的独立序列start(row_n), end(row_n) .

编程说明:为了兼容MATLAB,返回第二个参数(end)当单个值(n=1)。如果n不是整数,则floor (n)用于舍入元素的数量。如果n为零或为负,则返回一个空的1x0矩阵。

详见: colon,logspace.

 
y = logspace (a, b)
y = logspace (a, b, n)
y = logspace (a, pi)
y = logspace (a, pi, n)

返回带有的行向量n对数间隔为10的元素^a至10^b.

如果元素的数量n未指定,则默认为50。

如果b等于topi,点在10之间^a以及pi,10^a和10^pi,这在数字信号处理中是有用的。

编程说明:为了兼容MATLAB,返回范围的右手侧(10^b)当单个值(n=1)。如果n不是整数,则floor (n)用于对元素的数量进行舍入。如果n为零或为负,则返回一个空的1x0matrix。

详见: linspace.

 
x = rand ()
x = rand (n)
x = rand (m, n, …)
x = rand ([m, n, …])
x = rand (…, class)
v = rand ("state")
rand ("state", v)
rand ("state", "reset")
v = rand ("seed")
rand ("seed", v)
rand ("seed", "reset")

返回一个标量、矩阵或N维数组,其元素是均匀分布在区间(0, 1)上的随机数。

如果不带参数调用,返回一个标量随机值。

如果只带一个标量整数参数n调用,则返回一个NxN方阵。

如果以两个或多个标量整数参数调用,或以整数向量调用,则返回一个具有给定维度的数组。

可选参数 class 指定返回数组的类。有效的选项只有 "double" (默认) 或 "single"

编程说明:任何负维度都被视为零,任何零维度将导致一个空矩阵。这种奇怪的行为是为了兼容 MATLAB

其他的调用形式提供了一个接口到基础随机数生成器。

您可以使用以下形式查询随机数生成器的状态

v = rand ("state")

这将返回一个列向量v长度625。稍后,您可以将随机数生成器恢复到状态v使用形式

rand ("state", v)

您也可以从长度≤625的任意向量初始化状态向量v。此新状态将是基于的值的哈希vv它本身

默认情况下,生成器是通过从全局时钟时间、CPU时间、当前秒数、进程ID以及C++随机数源的1024位(如果可用)中贡献熵来初始化的random_device,这可能是不确定性的(具体实现)。 请注意,这与MATLAB不同, 其总是在启动时初始化随机数生成器到相同的状态。要获得与MATLAB类似的行为, 请在Octave的启动文件中使用确定的状态向量进行初始化(详见Startup Files)。

编程说明:为了计算伪随机数,rand使用梅森旋转器,其周期为2^{19937}-1。 (详见 M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator", ACM Trans. on Modeling and Computer Simulation, Vol. 8, No. 1, pp. 3–30, January 1998, http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html). 不要用于加密目的,除非将几个返回值安全地组合在一起,否则生成器状态将在读取624个连续值后就可以被学习。

旧版本的Octave使用了不同的随机数生成器。默认情况下使用新生成器,因为它比旧生成器快得多,并且生成循环时间长得多的随机数。然而,在某些情况下,可能希望获得与旧生成器生成的随机序列相同的随机序列。要执行此操作,请使用关键字"seed"用于指定应使用旧生成器,如中所示

rand ("seed", val)

将生成器的种子设置为val。可以使用查询生成器的种子

s = rand ("seed")

但是,需要注意的是,查询种子不会导致rand要使用旧的生成器,只需设置种子即可。要再次使用rand并使用新生成器,必须使用关键字"state"重置rand的状态.

生成器的状态或种子可以使用重置为新的随机值"reset"关键字。

详见: randi, randn, rande, randg, randp.

 
R = randi (imax)
R = randi (imax, n)
R = randi (imax, m, n, …)
R = randi (imax, [m, n, …])
R = randi ([imin, imax], …)
R = randi (…, "class")

返回一个标量、矩阵或N维数组,其元素在区间[1, imax]当中.

如果不带参数调用,返回一个标量随机值。

如果只带一个标量整数参数n调用,则返回一个NxN方阵。

如果以两个或多个标量整数参数调用,或以整数向量调用,则返回一个具有给定维度的数组。

整数范围可以选择性地从具有下界和上界的双元素矩阵来描述,在这种情况下,返回的整数将在区间上[imin,imax] .

可选参数class将返回对应类型的矩阵。默认是"double". 支持的类是: "double", "single", "int8", "int16", "int32", "uint8", "uint16", "uint32", 和 "logical".

编程说明:randi依赖于内部rand, 其使用"double"类型来表示数字。这限制了由flintmax函数返回的最大值(imax)和范围(imax-imin)。 对于IEEE 754浮点数,此值为2^{53} - 1

当输出的类型是"logical"时,函数构造一个指定随机整数数组,并且应用测试 x > 0 来确定哪些元素将为真。因为函数的单输入参数形式使用 1用于imin,所以randi 将始终返回一个全为1的矩阵。

例子: 150个整数,范围在1–10之间.

ri = randi (10, 150, 1)

详见: rand, randn, rande, randg, randp.

 
x = randn ()
x = randn (n)
x = randn (m, n, …)
x = randn ([m, n, …])
x = randn (…, class)
v = randn ("state")
randn ("state", v)
randn ("state", "reset")
v = randn ("seed")
randn ("seed", v)
randn ("seed", "reset")

返回一个标量、矩阵或N维数组,其元素来自标准正态分布,均值为0,方差为1

如果不带参数调用,返回一个标量随机值。

如果只带一个标量整数参数n调用,则返回一个NxN方阵。

如果以两个或多个标量整数参数调用,或以整数向量调用,则返回一个具有给定维度的数组。

可选参数class将返回对应类型的矩阵。支持的类是"double" (default)或"single".

编程注意:任何负尺寸都被视为零,任何零维度都将导致空矩阵。这种奇怪的行为是为了与MATLAB兼容。

额外的调用形式提供了对底层随机数生成器的接口。详见rand 文档关于查询和控制随机数生成器的说明。

编程注意:默认地,randn使用Marsaglia和Tsang的“Ziggurat技术”将均匀分布转换为正态分布。

参考文献: G. Marsaglia and W.W. Tsang, "Ziggurat Method for Generating Random Variables", J. Statistical Software, Vol. 5, 2000, https://www.jstatsoft.org/v05/i08/

详见: rand, randi, rande, randg, randp.

 
x = rande ()
x = rande (n)
x = rande (m, n, …)
x = rande ([m, n, …])
x = rande (…, class)
v = rande ("state")
rande ("state", v)
rande ("state", "reset")
v = rande ("seed")
rande ("seed", v)
rande ("seed", "reset")

返回一个标量、矩阵或N维数组,其元素来自指数分布,均值为0.

如果不带参数调用,返回一个标量随机值。

如果只带一个标量整数参数n调用,则返回一个NxN方阵。

如果以两个或多个标量整数参数调用,或以整数向量调用,则返回一个具有给定维度的数组。

可选参数class将返回对应类型的矩阵。支持的类是"double" (default)或"single".

编程注意: 任何负尺寸都被视为零,任何零维度都将导致空矩阵。这种奇怪的行为是为了与MATLAB兼容。

其他的调用形式提供了对底层随机数生成器的接口。详见rand 文档关于查询和控制随机数生成器的说明。

编程注意:默认地,rande使用Marsaglia和Tsang的“Ziggurat技术”将均匀分布转换为指数分布。

参考文献: G. Marsaglia and W.W. Tsang, "Ziggurat Method for Generating Random Variables", J. Statistical Software, Vol 5, 2000, https://www.jstatsoft.org/v05/i08/

详见: rand, randi, randn, randg, randp.

 
x = randp (l)
x = randp (l, n)
x = randp (l, m, n, …)
x = randp (l, [m, n, …])
x = randp (…, class)
v = randp ("state")
randp ("state", v)
randp ("state", "reset")
v = randp ("seed")
randp ("seed", v)
randp ("seed", "reset")

返回一个标量、矩阵或N维数组,其元素来自泊松分布,均值为l.

如果不带参数调用,返回一个标量随机值。

如果只带一个标量整数参数n调用,则返回一个NxN方阵。

如果以两个或多个标量整数参数调用,或以整数向量调用,则返回一个具有给定维度的数组。

可选参数class将返回对应类型的矩阵。支持的类是"double" (default)或"single".

编程注意:任何负尺寸都被视为零,任何零维度都将导致空矩阵。这种奇怪的行为是为了与MATLAB兼容。

额外的调用形式提供了对底层随机数生成器的接口。详见rand 文档关于查询和控制随机数生成器的说明。

编程注意:根据l的范围和l是不是标量或矩阵使用五个不同的算法。

对于标量l ≤ 12,使用直接法。

W.H. Press, et al., Numerical Recipes in C, Cambridge University Press, 1992.

对于标量l > 12,使用拒绝法。

W.H. Press, et al., Numerical Recipes in C, Cambridge University Press, 1992.

对于矩阵l ≤ 10,使用反转法。[2]

E. Stadlober, et al., WinRand source code, available via FTP.

对于矩阵l > 10,使用补丁拒绝法。

E. Stadlober, et al., WinRand source code, available via FTP, or H. Zechner, Efficient sampling from continuous and discrete unimodal distributions, Doctoral Dissertation, pp. 156, Technical University Graz, Austria, 1994.

对于l > 1e8,使用正态近似。

L. Montanet, et al., "Review of Particle Properties", Physical Review D, 50, p. 1284, 1994.

See also: rand, randi, randn, rande, randg.

 
x = randg (a)
x = randg (a, n)
x = randg (a, m, n, …)
x = randg (a, [m, n, …])
x = randg (…, class)
v = randg ("state")
randg ("state", v)
randg ("state", "reset")
v = randg ("seed")
randg ("seed", v)
randg ("seed", "reset")

返回一个标量、矩阵或N维数组,其元素服从伽马分布gamma (a,1).

如果不带参数调用,返回一个标量随机值。

如果只带一个标量整数参数n调用,则返回一个NxN方阵。

如果以两个或多个标量整数参数调用,或以整数向量调用,则返回一个具有给定维度的数组。

可选参数class将返回对应类型的矩阵。支持的类是"double" (default)或"single".

编程注意:任何负尺寸都被视为零,任何零维度都将导致空矩阵。这种奇怪的行为是为了与MATLAB兼容。

额外的调用形式提供了对底层随机数生成器的接口。详见rand 文档关于查询和控制随机数生成器的说明。

编程注意:伽马分布可用于生成许多其他分布:

gamma (a, b) for a > -1, b > 0
r = b * randg (a)
beta (a, b) for a > -1, b > -1
r1 = randg (a, 1)
r = r1 / (r1 + randg (b, 1))
Erlang (a, n)
r = a * randg (n)
chisq (df) for df > 0
r = 2 * randg (df / 2)
t (df) for 0 < df < inf (use randn if df is infinite)
r = randn () / sqrt (2 * randg (df / 2) / df)
F (n1, n2) for 0 < n1, 0 < n2
## r1 equals 1 if n1 is infinite
r1 = 2 * randg (n1 / 2) / n1
## r2 equals 1 if n2 is infinite
r2 = 2 * randg (n2 / 2) / n2
r = r1 / r2
negative binomial (n, p) for n > 0, 0 < p <= 1
r = randp ((1 - p) / p * randg (n))
non-central chisq (df, L), for df >= 0 and L > 0

(如果L = 0)

r = randp (L / 2)
r(r > 0) = 2 * randg (r(r > 0))
r(df > 0) += 2 * randg (df(df > 0)/2)
Dirichlet (a1, … ak)
r = (randg (a1), ..., randg (ak))
r = r / sum (r)

详见: rand, randi, randn, rande, randp.

 
rng (seed)
rng (seed, "generator")
rng ("shuffle")
rng ("shuffle", "generator")
rng ("default")
s = rng ()
rng (s)
s = rng (…)

设置或查询从使用的随机数生成器的种子randrandn.

输入seed是一个标量数值,用于初始化随机数生成器的状态向量。

可选字符串generator指定要使用的随机数生成器的类型。其值可以是"twister","v5uniform""v5normal"这里的"twister"关键字描述如下。"v5uniform""v5normal"详见曾使用不同随机数生成器的Octave工具版本。

可以使用将随机数生成器的状态或种子重置为新的随机值"shuffle"关键字。

可以使用将随机数生成器重置为默认值"default"关键字。默认值是使用种子为0的MersenneTwister生成器。

可选返回值s包含调用函数时(即,根据输入参数对其进行修改之前)随机数生成器的状态。它被编码为具有三个字段的结构体变量:"Type","Seed""State"。随机数生成器可以恢复到状态s使用rng (s)当算法需要伪随机数的同一序列时,这是有用的。

默认情况下,使用"twister"参数,伪随机序列使用Mersenne Twister计算,周期为2.{19937}-1 (详见 M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator", ACM Trans. on Modeling and Computer Simulation, Vol. 8, No. 1, pp. 3–30, January 1998, http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html). 不要用于加密目的,除非将几个返回值安全地组合在一起,否则生成器状态将在读取624个连续值后就可以被学习。

详见: rand,randn.

发电机以新的或旧的方式一起运行,两者不可能混合使用。使用初始化任何生成器"state""seed"导致其他人切换到相同的风格以备将来调用。

每个生成器的状态是独立的,对不同生成器的调用可以交错进行,而不会影响最终结果。例如,

rand ("state", [11, 22, 33]);
randn ("state", [44, 55, 66]);
u = rand (100, 1);
n = randn (100, 1);

rand ("state", [11, 22, 33]);
randn ("state", [44, 55, 66]);
u = zeros (100, 1);
n = zeros (100, 1);
for i = 1:100
  u(i) = rand ();
  n(i) = randn ();
end

返回等效的结果。当生成器以旧样式初始化时"seed"只有randrandn独立,因为旧rande,randgrandp生成器调用randrandn.

生成器在启动时使用随机状态进行初始化,因此每次运行Octave时随机数的序列并不相同。7如果你真的想精确地复制一个数字序列,你可以将状态或种子设置为一个特定的值。

如果在没有自变量的情况下调用,randrandn返回随机序列中的一个元素。

原件randrandn函数使用的Fortran代码来自兰利卜,一个用于随机数生成的Fortran子程序库,从德克萨斯大学癌症中心癌症医学博士Barry W.Brown和James Lovato编辑,休斯敦,TX 77030。

 
v = randperm (n)
v = randperm (n, m)

返回包含的随机排列的行向量1:n.

如果m已提供,返回m唯一分量,采样时不替换1:n.

复杂度为O(n)在内存和O中(m)及时,除非m<n/5,在这种情况下O(m)内存也被使用了。使用rand()执行随机化。所有排列的可能性都相等。

详见: perms.


脚注

7.

的旧版本randrandn从系统时钟中获得它们的初始种子。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2