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

Jos*_*h.F 0 arrays matlab matrix linear-algebra octave

第一行代码使用"离散标签"创建一些向量,第二行代码创建一个稀疏矩阵,在标签所代表的索引处有一个."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
Run Code Online (Sandbox Code Playgroud)

Lui*_*ndo 6

eye(10)(a,:)Octave中的表示法意味着:构建size- 10identity矩阵(eye(10)),然后按照给定的顺序选择其行a(注意,a它用作第一个索引,对应于行,并:作为第二个索引,这意味着"占用所有列").因此,例如,结果的4第th行是7单位矩阵的行,因为包含的4第th个条目.a7

根据这个解释,很明显a只要你想要它,只要它的所有值都是范围内的整数1...... 10(这些是可用的行eye(10)).

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

m = eye(10);
m(a,:)
Run Code Online (Sandbox Code Playgroud)

最后,一个次要的"技术"注释:获得的矩阵不是类型logical(Matlab的布尔数据类型),也不是sparse.相反,它是一个full类型的矩阵double.

  • @rayryeng我正是在读那个!当然,从Matlab看起来很容易.但我想在这一刻我没有理由付出努力...... Matlab满足了我的所有需求.这包括一个程序,可以随机将文件复制到我的MP3播放器,或者为我的硬盘驱动器进行增量备份:-)我肯定希望在Android和Java上做得更好 (2认同)