2

我想加入专栏

┌─┬─┬─┐
│1│1│2│
│2│4│4│
│3│9│6│
└─┴─┴─┘

我想把它a=.1 2 3作为第四行,然后b=.1 1 1 1作为第一列放到新的盒装数据中。我怎样才能轻松做到这一点?我是否必须解开整个事物并自己计算尺寸才能再次装箱?

另外,如果我希望数据i.8为 2 行,是否必须计算另一个维度 4(=8/2) 才能形成矩阵2 4$i.8?然后装箱呢;/2 4$i.8?我可以只指定一个维度,行数或列数并要求自动装箱或形成矩阵吗?

4

2 回答 2

3

您的问题的答案将涉及了解 &。, 'Under' 连词,在 J.

   m
┌─┬─┬─┐
│1│1│2│
│2│2│4│
│3│9│6│
└─┴─┴─┘
   a=. 1 2 3
   b=. 1 1 1 1

所以我们想将 a 的每个项目添加到 m 的每个盒装列中。如果我们可以使用 unbox(>) 将列拆箱,使用 append (,) 将 a 的项目附加到列,然后使用 box (<) 重新装箱,那将是完美的。这个撤销、操作、重做循环正是 Under (&.) 所做的。它使用右侧的动词撤消其左右参数( m 和 a ),然后将动词应用到其左侧,然后在结果上使用右侧的动词的反向。在实践中,

   m , &. > a
┌─┬─┬─┐
│1│1│2│
│2│2│4│
│3│9│6│
│1│2│3│
└─┴─┴─┘

当 a 从未被装箱时,它被拆箱的事实意味着它没有被改变,而 m 在 (,) 应用于每个 a 之前被拆箱。事实上,这在 J that & 中经常使用。> 被命名为“每个”。

   m , each a
┌─┬─┬─┐
│1│1│2│
│2│2│4│
│3│9│6│
│1│2│3│
└─┴─┴─┘

在 b 的盒装版本之前需要先给它一个额外的维度,用层压板 (,:) 然后转置 (|:) b 最后装箱 (<) 结果。添加额外维度的步骤是必需的,因为转置交换了索引,并且 b 从一维列表开始。

  (<@|:@,:b) 
┌─┐
│1│
│1│
│1│
│1│
└─┘ 

剩下的很简单,因为我们只需使用 append (,) 将盒装 b 与 (m, each a) 连接起来

  (<@|:@,: b) , m , each a
┌─┬─┬─┬─┐
│1│1│1│2│
│1│2│2│4│
│1│3│9│6│
│1│1│2│3│
└─┴─┴─┴─┘

(<@|:@,: b) 周围的括号是强制执行正确顺序所必需的。

对于第二个问题,您可以使用 i。nm 创建一个 X m 数组,这可能会有所帮助。

   i. 4 2
0 1
2 3
4 5
6 7
   i. 2 4
0 1 2 3
4 5 6 7

但也许我在这里误解了你的意图。

希望这会有所帮助,鲍勃

于 2013-07-20T23:59:04.780 回答
1

附加一个(带等级):,"x a

您可以简单地将 ( ,)附加a到未装箱的 ( >) 输入中,但您必须小心附加等级。您想附加 的每个“项目” a,因此您的排名正确为“0”。您想附加到一个2 单元格,因此您的左秩为“2”。因此,,你需要有 rank "2 0。追加后,您将数据重新装箱为 2 单元格<"2

<"2(>in)(,"2 0) a
┌─┬─┬─┐
│1│1│2│
│2│4│4│
│3│9│6│
│1│2│3│
└─┴─┴─┘

前置 b:b,

如果你b的形状正确,你可以在它前面加上b,. 您似乎使用的形状是(盒装)4 1

b =: < 4 1$ 1
┌─┐
│1│
│1│
│1│
│1│
└─┘
b,in
┌─┬─┬─┬─┐
│1│1│1│2│
│1│2│4│4│
│1│3│9│6│
│1│1│2│3│
└─┴─┴─┴─┘
于 2013-07-21T00:48:40.070 回答