在J中如何求字符串向量的外积?

在J中如何求字符串向量的外积?,j,J,我试图复制APL中的外部产品符号: ∘.,⍨ 'x1' 'y1' 'z1' 'x2' 'y2' 'z2' 'x3' 'y3' 'z3' 产生 x1x1 x1y1 x1z1 x1x2 x1y2 x1z2 x1x3 x1y3 x1z3 y1x1 y1y1 y1z1 y1x2 y1y2 y1z2 y1x3 y1y3 y1z3 z1x1 z1y1 z1z1 z1x2 z1y2 z1z2 z1x3 z1y3 z1z3 x2x1 x2y1 x2z1 x2x2 x2y2 x2z2 x2x3 x

我试图复制APL中的外部产品符号:

∘.,⍨ 'x1' 'y1' 'z1' 'x2' 'y2' 'z2' 'x3' 'y3' 'z3'
产生

 x1x1 x1y1 x1z1 x1x2 x1y2 x1z2 x1x3 x1y3 x1z3 
 y1x1 y1y1 y1z1 y1x2 y1y2 y1z2 y1x3 y1y3 y1z3 
 z1x1 z1y1 z1z1 z1x2 z1y2 z1z2 z1x3 z1y3 z1z3 
 x2x1 x2y1 x2z1 x2x2 x2y2 x2z2 x2x3 x2y3 x2z3 
 y2x1 y2y1 y2z1 y2x2 y2y2 y2z2 y2x3 y2y3 y2z3 
 z2x1 z2y1 z2z1 z2x2 z2y2 z2z2 z2x3 z2y3 z2z3 
 x3x1 x3y1 x3z1 x3x2 x3y2 x3z2 x3x3 x3y3 x3z3 
 y3x1 y3y1 y3z1 y3x2 y3y2 y3z2 y3x3 y3y3 y3z3 
 z3x1 z3y1 z3z1 z3x2 z3y2 z3z2 z3x3 z3y3 z3z3 
但我不知道如何在J中做类似的事情。我发现这篇文章我认为足够相似,但我似乎无法将它从一个数字数组转换成一个字符串数组

改编Dan Bron的答案,并将其应用到一个更简单的例子中

6 6 $ , > { 2 # < 'abc'
这几乎就是我想要的,但我不知道如何将它推广到使用两个字母(或更多)的字符串,而不是以类似的方式使用单个字符串。我也不知道如何用APL输出那样的对之间的空格格式化这些结果,所以它可能也不是正确的路径

类似地,我试着从这条线索改编迈克尔·贝里的答案,以获得

9 36 $ ,,"1/ ~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'

x1x1x1y1x1z1x1x2x1y2x1z2x1x3x1y3x1z3
y1x1y1y1y1z1y1x2y1y2y1z2y1x3y1y3y1z3
z1x1z1y1z1z1z1x2z1y2z1z2z1x3z1y3z1z3
x2x1x2y1x2z1x2x2x2y2x2z2x2x3x2y3x2z3
y2x1y2y1y2z1y2x2y2y2y2z2y2x3y2y3y2z3
z2x1z2y1z2z1z2x2z2y2z2z2z2x3z2y3z2z3
x3x1x3y1x3z1x3x2x3y2x3z2x3x3x3y3x3z3
y3x1y3y1y3z1y3x2y3y2y3z2y3x3y3y3y3z3
z3x1z3y1z3z1z3x2z3y2z3z2z3x3z3y3z3z3
同样,这几乎就是我想要的,这一个处理了多个字符,但是它们之间仍然没有空格,并且命令离APL版本的简单性越来越远

我可以用ravel项目更清晰地获得相同的结果

,. ,"1/ ~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
我一直在阅读《J入门》并探索字典中看起来相关的部分,但我还是个新手,如果这是一个愚蠢的问题,我很抱歉。我觉得秩连接运算符应该可以在这里帮助我,但我在初级读本中很难理解它的解释。我玩了
“:
试图格式化字符串,使其具有尾随空格,但我也不明白这一点。事实上,在APL中这是如此简单,这也让我觉得我在J中做了一些非常错误的事情,遇到了这么多麻烦

在读了更多的初级读物之后,我得到了一些我想要的东西

,. 9 1 $ ' ' ,."2 ,"1/~ [ ;._2 'x1 y1 z1 x2 y2 z2 x3 y3 z3 '

但这仍然比APL版本复杂得多,所以我仍然希望有一种真正优雅简洁的方法来做到这一点。

我认为我唯一可以补充的是,要将字符串分隔成组件,需要将其装箱

   <@,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
+----+----+----+----+----+----+----+----+----+
|x1x1|x1y1|x1z1|x1x2|x1y2|x1z2|x1x3|x1y3|x1z3|
+----+----+----+----+----+----+----+----+----+
|y1x1|y1y1|y1z1|y1x2|y1y2|y1z2|y1x3|y1y3|y1z3|
+----+----+----+----+----+----+----+----+----+
|z1x1|z1y1|z1z1|z1x2|z1y2|z1z2|z1x3|z1y3|z1z3|
+----+----+----+----+----+----+----+----+----+
|x2x1|x2y1|x2z1|x2x2|x2y2|x2z2|x2x3|x2y3|x2z3|
+----+----+----+----+----+----+----+----+----+
|y2x1|y2y1|y2z1|y2x2|y2y2|y2z2|y2x3|y2y3|y2z3|
+----+----+----+----+----+----+----+----+----+
|z2x1|z2y1|z2z1|z2x2|z2y2|z2z2|z2x3|z2y3|z2z3|
+----+----+----+----+----+----+----+----+----+
|x3x1|x3y1|x3z1|x3x2|x3y2|x3z2|x3x3|x3y3|x3z3|
+----+----+----+----+----+----+----+----+----+
|y3x1|y3y1|y3z1|y3x2|y3y2|y3z2|y3x3|y3y3|y3z3|
+----+----+----+----+----+----+----+----+----+
|z3x1|z3y1|z3z1|z3x2|z3y2|z3z2|z3x3|z3y3|z3z3|
+----+----+----+----+----+----+----+----+----+
您还可以将这些框转换为符号,这些符号可能更接近您想要的符号,尽管它们的表示形式中确实包含反勾号指示器。
 s:@<@,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
`x1x1 `x1y1 `x1z1 `x1x2 `x1y2 `x1z2 `x1x3 `x1y3 `x1z3
`y1x1 `y1y1 `y1z1 `y1x2 `y1y2 `y1z2 `y1x3 `y1y3 `y1z3
`z1x1 `z1y1 `z1z1 `z1x2 `z1y2 `z1z2 `z1x3 `z1y3 `z1z3
`x2x1 `x2y1 `x2z1 `x2x2 `x2y2 `x2z2 `x2x3 `x2y3 `x2z3
`y2x1 `y2y1 `y2z1 `y2x2 `y2y2 `y2z2 `y2x3 `y2y3 `y2z3
`z2x1 `z2y1 `z2z1 `z2x2 `z2y2 `z2z2 `z2x3 `z2y3 `z2z3
`x3x1 `x3y1 `x3z1 `x3x2 `x3y2 `x3z2 `x3x3 `x3y3 `x3z3
`y3x1 `y3y1 `y3z1 `y3x2 `y3y2 `y3z2 `y3x3 `y3y3 `y3z3
`z3x1 `z3y1 `z3z1 `z3x2 `z3y2 `z3z2 `z3x3 `z3y3 `z3z3

s:@Ah装箱表示法至少比我以前的ravel items版本好得多,而且也没有把空格缝回去那么复杂。如果有更接近APL的内容,我暂时不接受,但看
这取决于你是否只想按照APL显示结果,或者你想使用结果。正如@bob所建议的,因为J treats表示字符串不同于APL,所以外部产品的默认显示看起来不同。如果你只想复制显示,你可以这样做。
'&joinstring“1我刚刚添加了一个将装箱表示转换为符号的进一步选项,这至少看起来更接近APL的结果。
   ,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
x1x1
x1y1
x1z1
x1x2
x1y2
x1z2
x1x3
x1y3
x1z3

y1x1
y1y1
y1z1
y1x2
y1y2
y1z2
y1x3
y1y3
y1z3

z1x1
z1y1
z1z1
z1x2
z1y2
z1z2
z1x3
z1y3
z1z3

x2x1
x2y1
x2z1
x2x2
x2y2
x2z2
x2x3
x2y3
x2z3

y2x1
y2y1
y2z1
y2x2
y2y2
y2z2
y2x3
y2y3
y2z3

z2x1
z2y1
z2z1
z2x2
z2y2
z2z2
z2x3
z2y3
z2z3

x3x1
x3y1
x3z1
x3x2
x3y2
x3z2
x3x3
x3y3
x3z3

y3x1
y3y1
y3z1
y3x2
y3y2
y3z2
y3x3
y3y3
y3z3

z3x1
z3y1
z3z1
z3x2
z3y2
z3z2
z3x3
z3y3
z3z3
   $ ,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
9 9 4
 s:@<@,"1/~ 9 2 $ 'x1y1z1x2y2z2x3y3z3'
`x1x1 `x1y1 `x1z1 `x1x2 `x1y2 `x1z2 `x1x3 `x1y3 `x1z3
`y1x1 `y1y1 `y1z1 `y1x2 `y1y2 `y1z2 `y1x3 `y1y3 `y1z3
`z1x1 `z1y1 `z1z1 `z1x2 `z1y2 `z1z2 `z1x3 `z1y3 `z1z3
`x2x1 `x2y1 `x2z1 `x2x2 `x2y2 `x2z2 `x2x3 `x2y3 `x2z3
`y2x1 `y2y1 `y2z1 `y2x2 `y2y2 `y2z2 `y2x3 `y2y3 `y2z3
`z2x1 `z2y1 `z2z1 `z2x2 `z2y2 `z2z2 `z2x3 `z2y3 `z2z3
`x3x1 `x3y1 `x3z1 `x3x2 `x3y2 `x3z2 `x3x3 `x3y3 `x3z3
`y3x1 `y3y1 `y3z1 `y3x2 `y3y2 `y3z2 `y3x3 `y3y3 `y3z3
`z3x1 `z3y1 `z3z1 `z3x2 `z3y2 `z3z2 `z3x3 `z3y3 `z3z3