如何在KDB中生成对角线为1其余元素为0.5的矩阵?
矩阵生成最优实现方案
你原来的自定义函数逻辑本身没问题,问题出在传参方式不符合q语言的迭代规则:shrinkfn需要同时接收行索引、列索引两个入参,你参考的单位矩阵写法{x=/:x}@til 4内部的x是完整的索引列表,没法直接给双参数函数传对应位置的两个索引值。
两种可直接运行的实现方案如下:
- 方案1:逐元素判断(适合小规模矩阵)
直接用双层迭代把行、列索引逐个传入自定义函数判断即可:
shrinkfn: {$[x=y;1;0.5]} shrinkfn'[til 4;]/:til 4
如果不需要复用函数,也可以直接写为一行:{$[x=y;1;0.5]}'[til 4;]/:til 4
- 方案2:批量修改(性能最优,适合所有规模矩阵)
该方案跳过逐元素条件判断,先生成全量0.5矩阵,再批量修改对角线元素,矩阵阶数越大性能优势越明显,是该需求的最优选择:
n:4 / 可替换为任意你需要的矩阵阶数 res:(n,n)#0.5 / 生成n阶全0.5矩阵 @[res; (til n;til n); :; 1f] / 批量将对角线位置赋值为1
内容的提问来源于stack exchange,提问作者cjm2671
相关产品推荐
相关产品推荐

