用 J 中的几个子数组组成矩阵

Compose matrix out of several subarrays in J

我想从 4 个给定的较小子矩阵中组成一个名为 F 的 12x12 矩阵,这些子矩阵应该位于不同的位置:

所有其他原子都是零。我开始设置 F =: 12 12 $ 0 但尝试 amend 动词失败。这方面的最佳做法是什么?

我的子数组是: A =: 3 6 $ _1 1 0 0 0 0 0 0 _1 0 0 1 0 0 0.99 0 _1 0 B =: 4 9 $ 1 0 0 1 0 0 _1 0 0 0 1 0 0 0 0 0 _1 0 0 1 0 0 _1 0 0 0 0 1 0 1 1 0 1 1 0 1 C =: 3 3 $ 1 0 0 0 1 0 0 0 1 D =: 2 3 $ 1 0 0 0 0 1

根据每个数组的形状制作坐标列表。

 c_D =: {@(;&i.)/ $ D
┌───┬───┬───┐
│0 0│0 1│0 2│
├───┼───┼───┤
│1 0│1 1│1 2│
└───┴───┴───┘

在上述坐标上加上偏移量

c_D =: (<10 6) + &.> c_D

现在使用修正:

D c_D } F

你可以组成一个动名词来简化这个过程,大致如下:

g =: 3 : '({.y) +&.> {@(;&i.)/$ >{:y'
m =: ((>@{:@[)`(g@[)`])

((0 0);A) m} F
((3 3);B) m} F
etc.

如果组件具有一致的形状,则可以使用一种略有不同的方法,即填充组件阵列,然后组装 12X12 阵列。

  12{."1. A     NB. Pad 0's to the right
_1 1    0 0  0 0 0 0 0 0 0 0
 0 0   _1 0  0 1 0 0 0 0 0 0
 0 0 0.99 0 _1 0 0 0 0 0 0 0
   _12{."1 B    NB. Pad 0's to the left
0 0 0 1 0 0 1  0 0 _1  0 0
0 0 0 0 1 0 0  0 0  0 _1 0
0 0 0 0 1 0 0 _1 0  0  0 0
0 0 0 1 0 1 1  0 1  1  0 1
   12{."1. C
1 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
   _12{."1 [ 6 {."1 D   NB. extra {. required to pad both ends
0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0

然后assemble最后的数组

   (12{."1. A) , (_12 {."1 B),(12 {."1 C),_12{."1[ 6 {."1 D
_1 1    0 0  0 0 0  0 0  0  0 0
 0 0   _1 0  0 1 0  0 0  0  0 0
 0 0 0.99 0 _1 0 0  0 0  0  0 0
 0 0    0 1  0 0 1  0 0 _1  0 0
 0 0    0 0  1 0 0  0 0  0 _1 0
 0 0    0 0  1 0 0 _1 0  0  0 0
 0 0    0 1  0 1 1  0 1  1  0 1
 1 0    0 0  0 0 0  0 0  0  0 0
 0 1    0 0  0 0 0  0 0  0  0 0
 0 0    1 0  0 0 0  0 0  0  0 0
 0 0    0 0  0 0 1  0 0  0  0 0
 0 0    0 0  0 0 0  0 1  0  0 0