J语言中如何实现支持任意选择器的片段互换操作?
问题背景
假设我们有如下向量和矩阵:
r =: 100 + 5 5 $ i.25 r 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 v =: 100 + 5 $ i.5 v 100 101 102 103 104
已知可以通过C.动词实现基础交换:
(<0 _1) &C. v 104 101 102 103 100
上述代码实现了向量下标0和下标-1的元素互换;作用在矩阵上时,该操作会交换对应行:
(<0 _1) &C. r 120 121 122 123 124 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 100 101 102 103 104
现在需要实现支持两个任意选择器的互换操作,互换两个选择器选中的片段,效果如下:
向量场景示例
sel1 =: (< (<0 1)) sel1 { v 100 101 sel2 =: (< (<2 3)) sel2 { v 102 103 sel1 sel2 INTERCHANGE v 102 103 100 101 104
矩阵场景示例
sel1 =: (< (<0 1),(<0 1)) sel1 { r 100 101 105 106 sel2 =: (< (<3 4),(<1 2)) sel2 { r 116 117 121 122 sel1 sel2 INTERCHANGE r 116 117 102 103 104 121 122 107 108 109 110 111 112 113 114 115 100 101 118 119 120 105 106 123 124
实现方案
可以通过J的索引取值({)和索引赋值(})直接实现该操作,核心逻辑是先暂存两个选择器选中的值,再交叉赋值回原数组即可:
INTERCHANGE =: 4 : 0 NB. 左参数x为两个选择器组成的列表:sel1 sel2 NB. 右参数y为待操作的数组 'sel1 sel2' =. x val1 =. sel1 { y val2 =. sel2 { y y =. val2 sel1 } y val1 sel2 } y )
使用说明
- 调用方式和示例完全一致:
sel1 sel2 INTERCHANGE 待操作数组 - 要求两个选择器选中的片段形状完全一致,否则赋值时会抛出形状不匹配错误,符合互换操作的逻辑要求
- 支持任意维度的数组,以及J语言标准支持的所有合法索引选择器写法
内容的提问来源于stack exchange,提问作者paweljakubas
相关产品推荐
相关产品推荐

