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

时间:2015-01-27 22:34:04

标签: arrays matlab matrix octave linear-algebra

第一行代码使用“离散标签”创建一些向量,第二行代码创建一个稀疏矩阵,其中包含标签所代表的索引处的一个。 “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

1 个答案:

答案 0 :(得分:6)

Octave中的符号eye(10)(a,:)表示:构建大小 - 10单位矩阵(eye(10)),然后按a给出的顺序选择其行(请注意a用作第一个索引,对应于行,:用作第二个索引,这意味着“占用所有列”。因此,例如,结果的4行是单位矩阵的行7,因为4的{​​{1}}条目包含a

从这个解释中可以明确7只要你愿意,只要它的所有值都是a ... 1范围内的整数(这些是行)可在10)中找到。

请注意,在Matlab中,不允许使用“链式”索引。您必须首先将eye(10)分配给变量,然后索引到该变量:

eye(10)

最后,一个次要的“技术”注释:获得的矩阵不是m = eye(10); m(a,:) 类型(Matlab的布尔数据类型),也不是logical。相反,它是sparse类型的full矩阵。