给定(矩形)邻接矩阵m,如何在q语言中构造邻接表?
在QIdioms wiki中,我找到了k一种语言解决方案,当通过qconsole with k)command 运行时会给出'vs错误:
m:(1 0 1;1 0 1)
k) (^m)_vs &,/m
'vs
Run Code Online (Sandbox Code Playgroud)
结果应该是:
0 0 1 1
0 2 0 2
Run Code Online (Sandbox Code Playgroud)
这是我能够复制的q:
k) &,/m
0 2 3 5
q) where raze m
0 2 3 5
Run Code Online (Sandbox Code Playgroud)
k的^又名shape动词用的是失踪q,所以我只是做:
k) (^m)
000b
000b
q) 2 3#0b
000b
000b
Run Code Online (Sandbox Code Playgroud)
现在,因为:
q) parse "vs"
k) {x\:y}
Run Code Online (Sandbox Code Playgroud)
我试过两次都失败了:
q) (2 …Run Code Online (Sandbox Code Playgroud) 昨晚我在我的系统上安装了q和kdb 32位.我一直在工作中使用它,每当我在工作时按下向上箭头键它就会回忆起上一个命令.这似乎不适用于我的家庭安装.当我点击它时它打印^ [[A. 我怎样才能解决这个问题?
我正在学习kdb +/q.我有一张数据表.我想获取2列数据(只是数字),比较它们并创建一个新的布尔列,该列将显示第1列中的值是否大于或等于第2列中的值.
我很乐意使用update命令创建一个新列,但我不知道如何确保它是布尔值,如何比较值以及显示"大于或等于"的方法" - 有可能为此做一个简单的Y/N输出吗?
谢谢.
如果我只在过滤器中放入一个符号,如何选择特定记录?
Eg:
tab:([]a:1 2 3;b:(`abc`bde;`efg`rte;`dqw`gds))
1 (`abc`bde)
2 (`efg`rte)
3 (`dqw`gds)
Run Code Online (Sandbox Code Playgroud)
我想过滤,abc所以只返回:
1 (`abc`bde)
Run Code Online (Sandbox Code Playgroud)
select from tab where b=`abc 不管用.
我有一个名为"t"的表,列为"x".它看起来如下:
x
------
1.Fred
2.Joe
3.Hank
.
.
.
500.Mary
Run Code Online (Sandbox Code Playgroud)
我需要取列并删除名称前的所有内容,例如"1".弗雷德之前
我已经尝试过更新,$2_'string x from t但这只适用于数字1-9而不是一次我得到更大的数字.有没有办法删除"." 以及之前的一切?
我正在寻找有效的功能来获得Q的第一天.喜欢2017.05.10 -> 2017.01.01或者2016.08.19 -> 2016.01.01.
下一个片段有效,但效率不高
{"D"$(string `year$x),".01.01"} .z.d
Run Code Online (Sandbox Code Playgroud) 在此链接中,有一个关于如何包含动态参数的示例.d,在KDB选择查询中:
h: hopen`:myhost01:8012 // open connection
d: 2016.02.15 // define date var
symList: `GBPUSD`EURUSD
h raze "select from MarketDepth where date=", string d, ", sym in `GBPUSD`EURUSD" // run query with parameter d
Run Code Online (Sandbox Code Playgroud)
这d是类型date,并且易于字符串连接以生成动态查询.
如果我想symList通过转换为字符串添加为动态参数:
raze "select from MarketDepth where date=", string d, ", sym in ", string symList
Run Code Online (Sandbox Code Playgroud)
连接的字符串变为:select from MarketDepth where date=2016.02.15, sym in GBPUSDEURUSD,换句话说,字符串连接会丢失反引号,因此查询不会运行.我怎么解决这个问题?
pS:我知道功能查询但是在失败2小时后,我已经放弃了.
我有一个大约20K项目的排序列表v.我想在第一个v [i]> K的点处将其拆分为2个列表
N:20000;
v:asc N?100000; / N random numbers sorted
K:200; / threshold
v1:v[where v<=K]; / "v<=K" has O(N) complexity, "where" has O(N) too
v2:(count v1) _ v; / list is sorted, this holds.
Run Code Online (Sandbox Code Playgroud)
问题:如何避免v <= 200,所以它不计算长度为N的整个中间布尔向量,换句话说,在第一次匹配后找不到值?我实际上需要一个索引来执行拆分.假设K靠近列表的开头.
这是与绩效相关的问题.(注意忽略在"asc"上花费的时间.)
这可能是一个简单的问题,但我无法让它发挥作用。我想创建一个列varNew,等于一列的一半Price,如果只有一个列var1,并var2具有1的值,var1并且var2只需要0或1。如果两个数值var1和var2是1,那么varNew = Price。所以想要的数据看起来像这样
var1 var2 Price varNew
0 0 10 10
0 1 14 7
1 0 12 6
1 1 20 20
Run Code Online (Sandbox Code Playgroud)
我试过:
update varNew:?[((var1+var2)>0);Price%2;Price] from table 和
varNew:?[(var1=1 and var2=0)|(var1=0 and var2=1);Price%2;Price] from table 和
varNew:?[var1=1 or var2=1;Price%2;Price] from table
但它们没有按预期工作。特别是,它返回 12 而不是 6。这是怎么回事?为什么这些条件不起作用?我该怎么做?
首先,我无法理解exec和selectin之间的区别kdb。exec的参考并没有多大帮助!
其次,我正在尝试编写一个程序来解决欧拉问题 5。我通过使用modand解决了它each,但它很慢并且需要大量空间。我相信我可以通过将 20 的素数分解的值相加来做到这一点。那是对的吗?如果是这样,任何人都可以帮助我这样做吗?我写了以下内容来获得素数分解。它还不能接收列表。
f1:{(x mod y) = 0}
f2:{if[f1[a;y]&(not max f1[y;x],0);x:x,y];x}
f3:{x+:1;y:f2[y;x];if[x<a;y:.z.s[x;y]];y}
f3[1;()
Run Code Online (Sandbox Code Playgroud) 我如何加入两个不同的表,例如
all_order_ask:([]ask:();ask_qty:();exchange_name_ask:())
all_order_bid:([]bid:();bid_qty:();exchange_name_bid:())
Run Code Online (Sandbox Code Playgroud)
并得到 =====>
final_order:ask:();ask_qty:();exchange_name_ask:();bid:();bid_qty:();exchange_name_bid:()
Run Code Online (Sandbox Code Playgroud)
两个表的行数相同