J中的笛卡儿积

时间:2016-03-21 20:12:24

标签: cartesian-product j

我试图在J中重现生命游戏功能的APL代码。在APL"中搜索"生命游戏后,可以找到解释此代码的YouTube视频。目前我有一个矩阵R,它是:

0 0 0 0 0 0 0
0 0 0 1 1 0 0
0 0 1 1 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0

我写了J代码,它生成了邻接列表(相邻正方形中的活细胞数),如下所示:

+/ ((#:i.4),-(#:1+i.2),(1 _1),.(_1 1)) |. R

并产生:

0 0 1 2 2 1 0
0 1 3 4 3 1 0
0 1 4 5 3 0 0
0 1 3 2 1 0 0
0 0 1 1 0 0 0

我对此代码的主要问题是它不优雅,因为生成需要((#:i.4),-(#:1+i.2),(1 _1),.(_1 1))

 0  0
 0  1
 1  0
 1  1
 0 _1
_1  0
_1  1
 1 _1

这实际上只是矢量1 0 _1与其自身之间的外部产品或笛卡尔积。我找不到一种简单的方法来制作这种笛卡尔积,所以我的最终问题是如何更优雅地生成所需的矢量?

2 个答案:

答案 0 :(得分:5)

笛卡尔积是单一动词catalog: {

{ ;~(1 0 _1)
┌────┬────┬─────┐
│1 1 │1 0 │1 _1 │
├────┼────┼─────┤
│0 1 │0 0 │0 _1 │
├────┼────┼─────┤
│_1 1│_1 0│_1 _1│
└────┴────┴─────┘

Ravel(,)和unbox(>)获得9,2列表:

>,{ ;~(1 0 _1)
1  1
1  0
1 _1
0  1
0  0
0 _1
_1  1
_1  0
_1 _1

答案 1 :(得分:3)

,"0/ ~ 1 0 _1

会为您提供您要求的笛卡尔积(但您可能希望将其重塑为9乘2)。