如何在KDB中将坐标函数求值为矩阵?
解决J语言中生成函数求值方阵的问题
看起来你已经找对了方向,但可能混淆了J语言中操作符的用法——/:\:是二元扫描(dyadic scan),用来对序列做累积式的两两运算,而不是生成笛卡尔积矩阵的工具。我来一步步帮你搞定:
1. 先明确函数定义
首先把你的函数y + 2*x用J语言正确定义出来(注意J中二元函数的左参数是x,右参数是y):
f =: 3 : 'y + 2*x' NB. 对于行索引i(x)和列索引j(y),计算j + 2*i
2. 生成5x5方阵的正确写法
要对所有i ∈ til 5和j ∈ til 5计算f(i,j),你需要用叉积操作符/,它会把二元函数应用到两个列表的所有元素对,生成对应的矩阵:
result =: (til 5) f/ til 5
运行这段代码后,result就是你要的方阵:
0 1 2 3 4 2 3 4 5 6 4 5 6 7 8 6 7 8 9 10 8 9 10 11 12
解释一下:每一行对应x = 0,1,2,3,4(行索引),每一列对应y = 0,1,2,3,4(列索引),比如第二行第一列的2就是y=0 + 2*x=1的结果。
3. 更简洁的匿名函数写法
如果不想单独命名函数,也可以直接用匿名函数完成:
(til 5) (3 : 'y + 2*x')/ til 5
4. 关于你用的/:\:的说明
顺便纠正一下,/:\:的作用是扫描,比如+/:\: 1 2 3会返回1 3 6(依次计算1、1+2、3+3),它和生成矩阵的需求不匹配,这就是你之前遇到困难的原因啦。
内容的提问来源于stack exchange,提问作者cjm2671
相关产品推荐
相关产品推荐

