如何在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
相关产品推荐
相关产品推荐

