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



第一行代码创建一些带有"离散标签"的向量,第二行代码创建一个稀疏矩阵,其中标签表示的索引处有 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。相反,它是类型 doublefull矩阵。

相关内容

  • 没有找到相关文章