J中的对角矩阵

时间:2015-04-13 22:22:42

标签: matrix linear-algebra j

我使用特征值做了很多工作,因此构建/取消构建对角矩阵是我做了很多事情。在J的精神中,我提出了一些简单的定义,但想知道我是否错过了一种更简单的方法?我在短语中找不到任何东西,但可能一直在找错了地方。

从对角线条目列表中创建对角线矩阵:

diag =: * =@i.@#

从矩阵中提取对角线条目:

extract =: +/@(* =@i.@#)

3 个答案:

答案 0 :(得分:4)

矩阵的对角线条目在J:

中具有标准定义
extract =: (<0 1)&|:

不幸的是,这隐藏在词汇表的某个地方。 (你可以看到它传入transpose

我通常使用diag作为

diag =: 3 :'(2##y) $ ,_1 (((#y)#0),~])\y'

但我不再记得原因。你的版本更好。

答案 1 :(得分:1)

   (* =) 2 3 4
2 0 0
0 3 0
0 0 4

如果您正在处理独特元素。

diag=: * = NB. a hook defined tacitly

   diag 89 3 56.6
89 0    0
 0 3    0
 0 0 56.6

如果元素不是唯一的,因为矩阵不再是正方形

=会分解
   diag 3 4 4
|length error: diag
|       diag 3 4 4

答案 2 :(得分:1)

另一种解决方案涉及使用&#34; copy-fill&#34;。

set work_mem = '500MB';
update page_densities set density = round(density - 0.001, 2)

这比OP的原始配方更长,但它适用于数字和字符(只要你想让空格扮演零的角色)。

简短解释(主要针对&#34;未来我&#34;,因为我对J来说相当新):

考虑以下示例(diag =: (2 ##) $ (#~ 1 j. #) 表示对角线条目):

y =: 1 2 5 7

4 4 $ 1j4 # y NB. the required diagonal matrix 左侧的复数参数1j4#的每个复制项后插入4个零。将其重新整形为4×4矩阵,得到对角矩阵。

上面的y只是y中的项目数量:4。所以我们可以概括为#y。相当于此的默认值在顶部给出。