You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:57:02