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

How can I take the outer product of string vectors in 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 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 中做类似的事情。我发现这个 post 我认为已经足够相似了,但我似乎无法翻译它从一个数字数组到一个字符串数组。

在其中改编 Dan Bron 的答案并将其应用于更简单的示例

6 6 $ , > { 2 # < 'abc'

给予

aaabac
babbbc
cacbcc
aaabac
babbbc
cacbcc

这几乎是我想要的,但我不知道如何将其概括为以类似的方式使用 2 个字母(或更多)的字符串而不是单个字符串。我也不知道如何用像 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|
+----+----+----+----+----+----+----+----+----+

如果您想去掉方框并插入空格,那么您实际上不会单独使用字符项,您将得到包含空格的长字符串作为结果的一部分。

这是一个非常好的问题,因为它要求你理解J中的字符串是向量这一事实。我想从技术上讲,您正在寻找的是 9 9 4 形状的结果,但它看起来不像您期望的那样。

   ,"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

我想说最接近 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│
└────┴────┴────┴────┴────┴────┴────┴────┴────┘