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:单输入,单位方阵

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 兼容。

另请参阅: speyeoneszeros

 
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"

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

示例 1:常数值 val 的 MxN 矩阵

C = val * ones (m, n)

示例 2:MxN 的 uint8 矩阵

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

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

另请参阅: zerostruefalse

 
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"

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

示例:MxN 的 uint8 矩阵

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

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

另请参阅: onestruefalse

 
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 维数组。

形成一个大小为 mn 列的块矩阵,每个元素都是矩阵 A 的一个副本。

如果未指定 n,则形成一个 mm 列的块矩阵。对于超过两个维度的复制,请在第二个参数中以向量形式指定每个维度 mnp……的复制次数。

另请参阅: bsxfunkronrepelems

 
y = repelems (x, r)

x 构造一个包含重复元素的向量。

r 是一个 2xN 的整数矩阵,指定要重复哪些元素以及每个元素重复多少次。第一行中的条目 r(1,j) 选择一个要重复的元素。第二行中对应的条目 r(2,j) 指定重复次数。如果 x 是一个矩阵,则为了选择索引的目的,x 的列被视为堆叠在一起。始终返回一个行向量。

概念上,结果按如下方式计算:

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

另请参阅: repmatcat

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

x 和重复指令 R_1……构造一个包含重复元素的数组。

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

重复指令 R_j 必须是标量或向量。如果指令是标量,则 x 在维度 j 中的每个分量重复 R_j 次。如果指令是向量,则它必须具有与 x 的对应维度 j 相同数量的元素。在这种情况下,维度 j 的第 k 个分量重复 R_j(k) 次。

如果 x 是标量或向量,则将向量视为 1xN 的矩阵,并分别指定行和列的重复次数。

返回的数组与输入 x 具有相同的维度数。

示例:

x = [2, 3, 4]
repelem (x, [1, 2, 3])
⇒ [2, 3, 3, 4, 4, 4]

另请参阅: repmatrepelemshistc

 
y = linspace (base, limit)
y = linspace (base, limit, n)

返回一个行向量,其中包含 n 个线性间隔的点,从 baselimit

如果未指定点数 n,则默认为 100。如果 n 是 1,则返回 limit

baselimit 的区间二等分的点数由 2n - 1 给出。

如果 baselimit 是复数,则将线性间隔的点分别应用于实部和虚部。

编程注意:当 n 是 2 时,前两个点位于 baselimit 处。如果 n 大于 2,则在 baselimit 之间插入点。对于 n 为零或负数,返回一个空的 1x0 矩阵。

另请参阅: 冒号logspace

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

返回一个行向量,其中包含从 10^a 到 10^bn 个对数间隔的元素。

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

如果 b 等于 pi,则点在 10^a 和 pi 之间,而不是 10^a 和 10^pi 之间,这对数字信号处理很有用。

编程注意:为了与 MATLAB 兼容,当请求单个值 (n = 1) 时,返回区间的右端点 (10^b)。如果 n 不是整数,则使用 floor (n) 对元素数量取整。如果 n 为零或负数,则返回一个空的 1x0 矩阵。

另请参阅: 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")

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

rand ("state", v)

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

默认情况下,生成器通过从墙上时钟时间、CPU 时间、当前秒的小数部分、进程 ID 以及(如果可用)C++ 随机数源 random_device(可能是非确定性的,取决于实现)中收集熵来初始化。注意,这与 MATLAB 不同,后者总是在启动时将随机数生成器初始化为相同的状态。要获得与 MATLAB 相当的行为,请在 Octave 的启动文件中使用确定性状态向量进行初始化(参见 启动文件)。

编程注意:为了计算伪随机序列,rand 使用 Mersenne Twister,周期为 2^{19937}-1(参见 M. Matsumoto 和 T. Nishimura 的论文 "Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator",ACM Trans. on Modeling and Computer Simulation,第 8 卷,第 1 期,第 3–30 页,1998 年 1 月,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" 关键字将生成器的状态或种子重置为新的随机值。

另请参阅: randirandnranderandgrandp

 
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 的方阵。

如果使用两个或更多标量整数大小参数,或者一个整数值向量调用,返回具有指定维度的数组。

整数范围可以选择由包含下限和上限的两个元素矩阵描述,在这种情况下,返回的整数将在区间 [iminimax] 上。

可选参数 class 将返回请求类型的矩阵。默认值为 "double"。支持的类有:"double""single""int8""int16""int32""uint8""uint16""uint32""logical"

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

当输出类是 "logical" 时,该函数按指定构造一个随机整数数组,然后应用测试 x > 0 来确定哪些元素为 true。由于函数的单输入形式使用 1 作为 iminrandi 将始终返回一个全为 1 的矩阵。

示例:范围 1–10 内的 150 个整数。

ri = randi (10, 150, 1)

另请参阅: randrandnranderandgrandp

 
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"(默认)或 "single"

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

额外的调用形式提供了与底层随机数生成器的接口。有关查询和控制随机数生成器的文档,请参见 rand

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

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

另请参阅: randrandiranderandgrandp

 
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 维数组,其元素来自参数 rate 为 0 的指数分布。

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

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

如果使用两个或更多标量整数参数,或者一个整数值向量调用,返回具有指定维度的数组。

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

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

额外的调用形式提供了与底层随机数生成器的接口。有关查询和控制随机数生成器的文档,请参见 rand

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

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

另请参阅: randrandirandnrandgrandp

 
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"(默认)或 "single"

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

额外的调用形式提供了与底层随机数生成器的接口。有关查询和控制随机数生成器的文档,请参见 rand

编程注意:根据 l 的范围以及 l 是标量还是矩阵,使用五种不同的算法。

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

W.H. Press 等人,Numerical Recipes in C,剑桥大学出版社,1992 年。

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

W.H. Press 等人,Numerical Recipes in C,剑桥大学出版社,1992 年。

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

E. Stadlober 等人,WinRand 源代码,可通过 FTP 获取。

对于矩阵 l > 10,使用拼布拒绝法。

E. Stadlober 等人,WinRand 源代码,可通过 FTP 获取,或 H. Zechner,Efficient sampling from continuous and discrete unimodal distributions,博士论文,第 156 页,奥地利格拉茨技术大学,1994 年。

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

L. Montanet 等人,"Review of Particle Properties",Physical Review D,50,第 1284 页,1994 年。

另请参阅: randrandirandnranderandg

 
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"(默认)或 "single"

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

额外的调用形式提供了与底层随机数生成器的接口。有关查询和控制随机数生成器的文档,请参见 rand

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

gamma (a, b)a > -1b > 0
r = b * randg (a)
beta (a, b)a > -1b > -1
r1 = randg (a, 1)
r = r1 / (r1 + randg (b, 1))
Erlang (a, n)
r = a * randg (n)
chisq (df)df > 0
r = 2 * randg (df / 2)
t (df)0 < df < inf(如果 df 为无穷大,使用 randn)
r = randn () / sqrt (2 * randg (df / 2) / df)
F (n1, n2)0 < n10 < n2
## 如果 n1 为无穷大,r1 等于 1
r1 = 2 * randg (n1 / 2) / n1
## 如果 n2 为无穷大,r2 等于 1
r2 = 2 * randg (n2 / 2) / n2
r = r1 / r2
负二项分布 binomial (n, p)n > 00 < p <= 1
r = randp ((1 - p) / p * randg (n))
非中心 chisq (df, L),当 df >= 0L > 0

(如果 L = 0,使用 chisq)

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)

另请参阅: randrandirandnranderandp

 
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" 关键字将随机数生成器重置为默认值。默认值是使用 Mersenne Twister 生成器,种子为 0。

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

默认情况下,以及使用 "twister" 选项时,使用 Mersenne Twister 计算伪随机序列,其周期为 2^{19937}-1(参见 M. Matsumoto 和 T. Nishimura 的论文 "Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator",ACM Trans. on Modeling and Computer Simulation,第 8 卷,第 1 期,第 3–30 页,1998 年 1 月,http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html)。不要将其用于密码学,除非对多个返回值进行安全哈希处理,否则生成器状态在读取 624 个连续值后可能被获知。

另请参阅: randrandn

生成器以新风格或旧风格一起运行,不能混合使用。使用 "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 是独立的,因为旧的 randerandgrandp 生成器会调用 randrandn

生成器在启动时使用随机状态初始化,因此每次运行 Octave 时随机数序列都不同。7 如果您确实需要精确重现一个数字序列,可以将状态或种子设置为特定值。

如果不带参数调用,randrandn 返回随机序列的单个元素。

原始的 randrandn 函数使用来自 RANLIB 的 Fortran 代码,这是一个由德克萨斯大学 M.D. Anderson 癌症中心生物数学系的 Barry W. Brown 和 James Lovato 编写的 Fortran 随机数生成库,地址为德克萨斯州休斯顿 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 的旧版本从系统时钟获取其初始种子。


下一个:著名矩阵,前一个:重排矩阵,上级:矩阵操作   [目录][索引]