我想同时压缩⌿
多个向量/矩阵。
这是我的数据:
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黑客可以帮助我吗? 没有显式循环,还有另一种方法吗?内/外产品?
答案 0 :(得分:3)
在APL2中失败的原因是⌿
纯粹是APL2中的一个运算符,而在Dyalog APL中,它是一个混合函数/运算符,如果它的左边有一个数组,它的作用就像一个函数,但如果是运算符,则它的左侧具有功能。
在Dyalog APL中,由于⌿
充当常规功能,b
和txt
的项将按照您的期望与¨
配对。
在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共同实施)没有说明如何解决这种歧义。括号强制¨以⌿为函数。