第一行代码创建一些带有"离散标签"的向量,第二行代码创建一个稀疏矩阵,其中标签表示的索引处有 1。"眼睛"创建了一个单位矩阵,但是即使向量"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
用作第一个索引,对应于行,:
用作第二个索引,这意味着"取所有列")。因此,例如,结果的第4
行是单位矩阵的第 7
行,因为 a
的第4
个条目包含 7
。
从这个解释中可以清楚地看出,a
可以任意长,只要它的所有值都是 1
范围内的整数......10
(这些是 eye(10)
中可用的行)。
请注意,在 Matlab 中,这种"链式"索引是不允许的。您必须首先将eye(10)
分配给变量,然后索引到该变量中:
m = eye(10);
m(a,:)
最后,一个小的"技术"说明:获得的矩阵不是logical
类型(Matlab的布尔数据类型),也不是sparse
。相反,它是类型 double
的full
矩阵。