如何在 KDB 中生成对角矩阵?

cjm*_*671 0 kdb

我正在尝试生成一个矩阵,这样:

  • 对角线元素为 1
  • 所有其他元素均为 0.5

我正在尝试修改单位矩阵的示例:

{x=/:x}@til 4
Run Code Online (Sandbox Code Playgroud)

挤进我的特殊功能:

shrinkfn: {$[x=y;1;0.5]}
Run Code Online (Sandbox Code Playgroud)

但我在挣扎。做到这一点的最佳方法是什么?

C.R*_*oss 7

q)m:{x=/:x}@til 4
q)?'[m;1;0.5]
1   0.5 0.5 0.5
0.5 1   0.5 0.5
0.5 0.5 1   0.5
0.5 0.5 0.5 1
Run Code Online (Sandbox Code Playgroud)

替代方法:

https://code.kx.com/phrases/matrix/#identity-matrix-of-order-x

q)f:{(2#x)#1f,x#.5}
q)f 5
1   0.5 0.5 0.5 0.5
0.5 1   0.5 0.5 0.5
0.5 0.5 1   0.5 0.5
0.5 0.5 0.5 1   0.5
0.5 0.5 0.5 0.5 1
Run Code Online (Sandbox Code Playgroud)

解释:

我们可以使用以下符号来创建矩阵:

q)3 3#til 9
0 1 2
3 4 5
6 7 8
Run Code Online (Sandbox Code Playgroud)

当列表用完元素时,它会重复:

q)3 2#til 4
0 1
2 3
0 1
Run Code Online (Sandbox Code Playgroud)

对于 5 x 5 矩阵,下一个对角线总是 6 位,因此列表长度为 6:

q)5 5#1 .5 .5 .5 .5 .5
1   0.5 0.5 0.5 0.5
0.5 1   0.5 0.5 0.5
0.5 0.5 1   0.5 0.5
0.5 0.5 0.5 1   0.5
0.5 0.5 0.5 0.5 1
Run Code Online (Sandbox Code Playgroud)