J中的对角矩阵



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

从对角

线条目列表制作对角矩阵:

diag =: * =@i.@#

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

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

的对角线条目在 J 中具有标准定义:

extract =: (<0 1)&|:

不幸的是,这隐藏在词汇表的某个地方。(你可以看到它通过转置)

我通常使用diag作为

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

但我已经不记得为什么了。您的版本更好。

   (* =) 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

另一种解决方案涉及使用"复制填充"。

diag =: (2 ##) $ (#~ 1 j. #)

这比OP的原始公式更长,但它适用于数字和字符(只要您希望空格扮演零的角色)。

简短的解释(主要是"未来的我",因为我对J相当陌生):

请考虑以下示例(y =: 1 2 5 7表示对角线条目):

4 4 $ 1j4 # y NB. the required diagonal matrix

#左侧1j4的复数参数在从y的每个复制项目后插入 4 个零。将其重塑为 4 x 4 矩阵得到对角矩阵。

上面的4只不过是 y: #y 中的项目数。所以我们可以概括为(2 # #y) $ (1 j. #y) # y.在顶部给出了默认的等价物。

相关内容

  • 没有找到相关文章

最新更新