用 J 中的几个子数组组成矩阵
Compose matrix out of several subarrays in J
我想从 4 个给定的较小子矩阵中组成一个名为 F 的 12x12 矩阵,这些子矩阵应该位于不同的位置:
- 形状为 3x6 的数组 A 应从 (0;0) 到 (2;5)
- 形状为 4x9 的数组 B 应该是从 (3;3) 到 (6;11)
- 形状为 3x3 的数组 C 应该是从 (7;0) 到 (9;2)
- 形状为 2x3 的数组 D 应该是从 (10;6) 到 (11;8)
所有其他原子都是零。我开始设置 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
我想从 4 个给定的较小子矩阵中组成一个名为 F 的 12x12 矩阵,这些子矩阵应该位于不同的位置:
- 形状为 3x6 的数组 A 应从 (0;0) 到 (2;5)
- 形状为 4x9 的数组 B 应该是从 (3;3) 到 (6;11)
- 形状为 3x3 的数组 C 应该是从 (7;0) 到 (9;2)
- 形状为 2x3 的数组 D 应该是从 (10;6) 到 (11;8)
所有其他原子都是零。我开始设置 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