APL2,每个压缩

时间:2018-12-06 12:43:53

标签: apl

我想同时压缩多个向量/矩阵。

这是我的数据:

txt←(3 3⍴'a')(3 3⍴'b')(3 3⍴'c')(3 3⍴'d')
  b←(0 1 0)(1 1 1)(1 1 0)(0 0 0)

现在,我想通过txt中的相应布尔矢量来压缩b中的每个矩阵:

b⌿¨txt

这是我希望得到的回报:

┌───┬───┬───┬───┐
│aaa│bbb│ccc│   │
│   │bbb│ccc│   │
│   │bbb│   │   │
└───┴───┴───┴───┘

我已经在tryapl.org上进行了尝试,它的行为符合我的预期,但是在APL2中,我得到一个 DOMAIN ERROR (域错误),指向b和每个字形。 / p>

这里有APL2黑客可以帮助我吗? 没有显式循环,还有另一种方法吗?内/外产品?

2 个答案:

答案 0 :(得分:3)

在APL2中失败的原因是纯粹是APL2中的一个运算符,而在Dyalog APL中,它是一个混合函数/运算符,如果它的左边有一个数组,它的作用就像一个函数,但如果是运算符,则它的左侧具有功能。

在Dyalog APL中,由于充当常规功能,btxt的项将按照您的期望与¨配对。

在APL2中,b将绑定到单子运算符作为其唯一操作数,然后将整个派生函数b⌿¨一起应用于每个txt的项目。不用说,整个b(向量的向量)对于的单个应用来说并不是合适的左参数。

您可以通过将包装在一个函数中,然后在该包装函数上使用¨来解决此问题。包装器很简单:

r←x R y
r←x⌿y

答案 1 :(得分:0)

在GNU APL(APL2衍生物)中,您可以在⌿或⌿¨周围加上括号:

      txt←(3 3⍴'a')(3 3⍴'b')(3 3⍴'c')(3 3⍴'d')
        b←(0 1 0)(1 1 1)(1 1 0)(0 0 0)

      b(⌿)¨txt
 aaa  bbb  ccc   
      bbb  ccc   
      bbb     

      b(⌿¨)txt
 aaa  bbb  ccc   
      bbb  ccc   
      bbb        

在原始IBM APL2(PC版)中,这些似乎都不起作用。原因可能是⌿模棱两可(可能意味着“函数压缩”和“运算符缩减”),而ISO标准(由IBM APL2和GNU APL共同实施)没有说明如何解决这种歧义。括号强制¨以⌿为函数。