gpt4 book ai didi

KDB/Q : how to loop without loops?

转载 作者:行者123 更新时间:2023-12-04 05:13:09 36 4
gpt4 key购买 nike

我正在学习关于kdb数据库的q。我担心q中没有循环。
我需要写一个算法,用像C这样的冗长程序在几个嵌套的for循环中编写。但是在q中,我被无法循环的事实所困扰。

仅举一个具体的例子(很多),我有一个简单的向量(列表):

q)closures
price
-----
18.54
18.53
18.53
18.52
18.57
18.9
18.9
18.77
18.59
18.51
18.37

我需要一个向量,将这些项按3by3分组,并叠加在一起,例如(使用R语法):
闭包[0:2],闭包[1:3],闭包[2:4],闭包[3:5] ...
我能怎么做?

总的来说,我该如何改变自己的心态,以便正确地在q中编程?

非常感谢您的建议
马可

最佳答案

解决您关于“如何改变思维方式以正确编程q的问题”的最后一点:

您需要使用over(/),scan(\)和.z.s,而不是使用循环。

例如,可以通过以下方式解决您的问题:
(请注意,这些实际上并不是解决您特定问题的最佳解决方案-索引是解决问题的更好方法-但是,下面的这些解决方案应有助于理解这一点)

price:18.54 18.53 18.53 18.52 18.57 18.9 18.9 18.77 18.59 18.51 18.37

q)3#'{1_x}\[8;price]
18.54 18.53 18.53
18.53 18.53 18.52
18.53 18.52 18.57
18.52 18.57 18.9
18.57 18.9 18.9
18.9 18.9 18.77
18.9 18.77 18.59
18.77 18.59 18.51
18.59 18.51 18.37

即遍历列表,每次都砍掉一个,每次迭代取前3个

或类似
q)3#'{1 rotate x}\[8;price]
18.54 18.53 18.53
18.53 18.53 18.52
18.53 18.52 18.57
18.52 18.57 18.9
18.57 18.9 18.9
18.9 18.9 18.77
18.9 18.77 18.59
18.77 18.59 18.51
18.59 18.51 18.37

即旋转1次八次,每次旋转前3次

使用.z.s方法
q){$[2<count x;enlist[3#x],.z.s 1_x;()]}[price]
18.54 18.53 18.53
18.53 18.53 18.52
18.53 18.52 18.57
18.52 18.57 18.9
18.57 18.9 18.9
18.9 18.9 18.77
18.9 18.77 18.59
18.77 18.59 18.51
18.59 18.51 18.37

也就是说,如果至少剩下3个元素,请先提取3个元素,然后将第一个元素切掉,然后将相同的功能重新应用到缩短的列表中。

在这个例子中,使用over(/)会很麻烦,但是总的来说over可以代替“while”类型
i:0
a:0;
while[i<10;i+:1;a+:10]

更好地使用
q){x+10}/[10;0]
100

即添加10次,十次,起始(种子)值为零。
b:();  
while[not 18~last b;b,:1?20]

也就是说,请在1到20之间添加随机数,直到您达到18,然后停止。

更好地使用
q){x,1?20}/[{not 18~last x};()]
1 2 16 5 8 18

即在1到20之间添加一个随机数,只要check函数返回true,就进行迭代,以()作为种子值开始

还有很多其他选项可以使用扫描和遍历,具体取决于您要遍历的函数是monadic/diadic等。

作为广义的概括:
使用“对每个i进行函数”可以在q中实现“for i = 1:10”类型的循环,
可以在q中使用“function/[numOfTimes; seed]”实现“do”类型的循环,
可以使用“function/[booleanCheckFunction; seed]”在q中实现“while”类型的循环

关于KDB/Q : how to loop without loops?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16730393/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com