如何在 KDB 中生成对角矩阵?
How do I generate a diagonal matrix in KDB?
我正在尝试生成这样的矩阵:
- 对角元素为1
- 所有其他元素均为 0.5
我正在尝试修改单位矩阵的示例:
{x=/:x}@til 4
挤进我的特殊功能:
shrinkfn: {$[x=y;1;0.5]}
但我很挣扎。执行此操作的最佳方法是什么?
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
替代方法:
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
解释:
我们可以使用以下符号来创建矩阵:
q)3 3#til 9
0 1 2
3 4 5
6 7 8
当列表中的元素用完时,它会重复:
q)3 2#til 4
0 1
2 3
0 1
对于 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
为了多样化,另一种选择是:
{0.5 1f x=/:x}til 4
这将使用布尔列表(0 或 1b)为我们的双元素数组建立索引,并沿着矩阵相应地分配值。
q){x=/:x}til 4
1000b
0100b
0010b
0001b
q){0.5 1f x=/:x}til 4
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
我正在尝试生成这样的矩阵:
- 对角元素为1
- 所有其他元素均为 0.5
我正在尝试修改单位矩阵的示例:
{x=/:x}@til 4
挤进我的特殊功能:
shrinkfn: {$[x=y;1;0.5]}
但我很挣扎。执行此操作的最佳方法是什么?
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
替代方法:
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
解释:
我们可以使用以下符号来创建矩阵:
q)3 3#til 9
0 1 2
3 4 5
6 7 8
当列表中的元素用完时,它会重复:
q)3 2#til 4
0 1
2 3
0 1
对于 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
为了多样化,另一种选择是:
{0.5 1f x=/:x}til 4
这将使用布尔列表(0 或 1b)为我们的双元素数组建立索引,并沿着矩阵相应地分配值。
q){x=/:x}til 4
1000b
0100b
0010b
0001b
q){0.5 1f x=/:x}til 4
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