J 中的对角矩阵
Diagonal Matrices in J
我做了很多关于特征值的工作,因此构建/取消构建对角矩阵是我经常做的事情。本着 J 的精神,我提出了一些简单的定义,但想知道我是否错过了更简单的方法?我在常用语手册中找不到任何内容,但可能找错了地方。
根据对角元素列表制作对角矩阵:
diag =: * =@i.@#
从矩阵中提取对角线元素:
extract =: +/@(* =@i.@#)
矩阵的对角元素在 J 中有标准定义:
extract =: (<0 1)&|:
不幸的是,这隐藏在词汇表的某个地方。 (可以看到传入transpose)
我通常使用 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
另一种解决方案涉及使用 "copy-fill"。
diag =: (2 ##) $ (#~ 1 j. #)
这比 OP 的原始公式更长,但它适用于数字和字符(只要你想让空格扮演零的角色)。
简短说明(主要针对 "future me",因为我对 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
。顶部给出了默认的等价物。
我做了很多关于特征值的工作,因此构建/取消构建对角矩阵是我经常做的事情。本着 J 的精神,我提出了一些简单的定义,但想知道我是否错过了更简单的方法?我在常用语手册中找不到任何内容,但可能找错了地方。
根据对角元素列表制作对角矩阵:
diag =: * =@i.@#
从矩阵中提取对角线元素:
extract =: +/@(* =@i.@#)
矩阵的对角元素在 J 中有标准定义:
extract =: (<0 1)&|:
不幸的是,这隐藏在词汇表的某个地方。 (可以看到传入transpose)
我通常使用 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
另一种解决方案涉及使用 "copy-fill"。
diag =: (2 ##) $ (#~ 1 j. #)
这比 OP 的原始公式更长,但它适用于数字和字符(只要你想让空格扮演零的角色)。
简短说明(主要针对 "future me",因为我对 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
。顶部给出了默认的等价物。