You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在KDB+/q中获取矩阵对角元素?已尝试点索引未成功

获取KDB+/q矩阵的对角元素

我来帮你搞定这个问题!针对你给出的矩阵A:(1 2 3; 4 5 6; 7 8 9),要提取对角元素1 5 9,这里有几种简洁的实现方式,还会结合你之前的尝试来优化:

方法1:利用点运算符+索引对元组

KDB+的点运算符.可以接受一个包含行索引列表和列索引列表的元组,对应位置的索引会配对取元素。对角元素的行、列索引完全一致,所以我们可以直接生成这样的索引对:

A:(1 2 3; 4 5 6; 7 8 9)
n:count A  / 获取矩阵的行数(假设是方阵)
A . (til n; til n)  / 输出:1 5 9

方法2:用each遍历索引

通过遍历每个索引x,直接取A[x;x]位置的元素,再收集结果:

{A[x;x]} each til count A  / 输出:1 5 9

方法3:基于你尝试的2 #' til 3改造

你之前生成的2 #' til 3得到0 0 1 1 2 2,其实只需要把它转成二维的索引对结构,再传给点运算符就可以了:

A . ((2 #' til count A) flip)  / 输出:1 5 9

这里flip把一维的重复索引列表转换成了(0 1 2; 0 1 2)这样的行、列索引元组,正好匹配点运算符的要求。

补充:非方阵的情况

如果你的矩阵不是方阵(比如3行4列),可以取最小维度的长度来提取对角元素:

B:(1 2 3 4;5 6 7 8;9 10 11 12)
n:min count each (B;flip B)  / 取行数和列数的最小值
B . (til n; til n)  / 输出:1 6 11

内容的提问来源于stack exchange,提问作者Gary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:37:29