Matlab/Octave 代码如何从向量创建布尔矩阵?

How does this Matlab/Octave code create a Boolean matrix from a vector?

第一行代码使用 "discrete labels" 创建一些向量,第二行代码创建一个稀疏矩阵,其中 1 位于标签表示的索引处。 "eye" 创建一个单位矩阵,但是即使向量 "a" 长得多,这种创建稀疏矩阵的效果仍然有效!?

你能帮我理解这是怎么回事吗?

octave:4> a = [1 3 5 7 9 2 4 6 8 10]
a =

    1    3    5    7    9    2    4    6    8   10

octave:5> eye(10)(a,:)
ans =

Permutation Matrix

   1   0   0   0   0   0   0   0   0   0
   0   0   1   0   0   0   0   0   0   0
   0   0   0   0   1   0   0   0   0   0
   0   0   0   0   0   0   1   0   0   0
   0   0   0   0   0   0   0   0   1   0
   0   1   0   0   0   0   0   0   0   0
   0   0   0   1   0   0   0   0   0   0
   0   0   0   0   0   1   0   0   0   0
   0   0   0   0   0   0   0   1   0   0
   0   0   0   0   0   0   0   0   0   1

Octave 中的符号 eye(10)(a,:) 表示:构建大小为 10 的单位矩阵 (eye(10)),然后按照 a (请注意,a 用作第一个索引,对应于行,: 用作第二个索引,这意味着 "take all columns")。因此,例如,结果的第 4 行是单位矩阵的第 7 行,因为 a 的第 4 项包含 7

从这个解释可以清楚地看出 a 可以任意长,前提是它的所有值都是 1...10 范围内的整数(这些是eye(10)).

中可用的行

请注意,在 Matlab 中,此 "chained" 索引是不允许的。您必须首先将 eye(10) 分配给一个变量,然后索引到该变量:

m = eye(10);
m(a,:)

最后,一个小"technical"注意:得到的矩阵不是logical类型(Matlab的布尔数据类型),也不是sparse。相反,它是 double.

类型的 full 矩阵