【问题标题】:How do I generate a diagonal matrix in KDB?如何在 KDB 中生成对角矩阵?
【发布时间】:2021-09-02 15:26:47
【问题描述】:

我正在尝试生成这样的矩阵:

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

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

{x=/:x}@til 4

挤进我的特殊功能:

shrinkfn: {$[x=y;1;0.5]}

但我很挣扎。最好的方法是什么?

【问题讨论】:

    标签: kdb


    【解决方案1】:
    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
    

    【讨论】:

    • 哦,这太棒了,谢谢!在第二个示例(x 阶单位矩阵)中,您能否简要添加注释来解释发生了什么?代码有点神秘……
    【解决方案2】:

    为了多样化,另一种选择是:

    {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
    

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 2012-06-04
      • 2015-01-12
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多