【问题标题】:How to use arbitrary selector in interchange in J lang?如何在 J lang 的交换中使用任意选择器?
【发布时间】:2021-10-22 06:52:59
【问题描述】:

假设我们有一个向量和矩阵,如下所示:

   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

现在我想要一种方法来交换选择器指定的片段。 我知道如何交换物品:

   (<0 _1) &C. v
104 101 102 103 100

在这里,我在 index=0 和 index=-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


    【解决方案1】:

    我认为我会首先创建两个选择,然后使用 Amend 交换它们。可能不是最优雅或最通用的,但如果您知道要更改的选择并且它们的形状相同,那么它确实有效。

       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
         [rep=:((<3 4;1 2),(<0 1;0 1)) {  r  NB. rep is the selected replacement values
    116 117
    121 122
    
    100 101
    105 106
       ((<0 1;0 1),(<3 4;1 2)){ r  NB. values that will be replaced (just a check that they are the same shape)
    100 101
    105 106
    
    116 117
    121 122
      rep ((<0 1;0 1),(<3 4;1 2))} r  NB. Select verb ({) changed to Amend adverb (})
    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
    

    【讨论】:

    • 默认:INTERCHANGE=:(|.@{)`[`]}, (sel1, sel2) INTERCHANGE r
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    相关资源
    最近更新 更多