APL编程 - 为向量分配值

时间:2014-09-23 00:49:01

标签: for-loop vector apl

最近,我一直试图进入APL。但是,我经常遇到的一个问题是为向量赋值。

对于我打算获得多个结果的某些程序(例如,将字符或字符串转换为8位二进制向量的程序),我尝试过制作临时转换,然后分配i我的范围向量的一部分具有正确的值。例如,使用char-> bin矢量程序:

r = 8[rho]' ' (creates a vector of length 8 with only blank spaces)
i = 8
e = [the numerical value of character c]
a1: r[8-i] <- 1
r[8-i] <- 0(if)(0=2|e)
e <- (floor value of e/2)
i = i - 1
->a1(if)i != 1

但是,每次我尝试这个时,我都会在r [x]被赋值的行上得到一个长度错误。我的程序有什么问题,我该如何解决?

2 个答案:

答案 0 :(得分:2)

  1. 您正在使用哪种APL实现?大多数APL-Venoders(我知道)现在支持Unicode直接以Unicode复制和粘贴,或提供将APL转换为unicode的方法......然后你可以粘贴到这里,而不是转录它......
  2. 你说你还在进入APL。关于APL的关键方面是“阵列思维”。使用AT,您不需要循环遍历向量的元素,但可以直接使用向量。
  3. 您可能能够改进的另一个方面是控制结构。现在大多数APL提供了一些cs的味道 - 这就是我问1的原因。
  4. 您的作业问题是if - 您未展示的功能。但通常情况下,如果条件为真,则if - 函数将返回其右参数,否则返回空向量。因此,在您的情况下,当条件不满足时,您尝试将空向量插入到数组的位置 - 但只有标量可以在那里接受(除非您使用嵌套数组,这对于此问题总是过度杀伤)
  5. 所以,这是一个与你的版本相当接近的版本,但使用控制结构并将给定的数值转换为二进制文件:

     r←foo c;i;⎕IO;res
     ⍝ Converts integer value c to binary (loopy-version)
     ⎕IO←0
     i←7
     r←8⍴0
     :if (i>255)∨(i≠⌊i)∨i<0 ⋄ r←¯1 ⋄ :endif  ⍝ some cases we do not want to handle and return ¯1 to indicate error
     :While i≥0
         res←1=⌊c÷2*i
         r[7-i]←res
         c←c-res×2*i
         i-←1
     :EndWhile
    

    但是,此解决方案仅用于说明在APL中实现某些一般方面的一些方法(并在学习APL时为您提供一些内容)。对于给定的问题,“真正的”APL解决方案将是(8⍴2)⊤number

    最后,如果您不仅想要“进入”APL,而且想要掌握APL,那么可以从http://dyalog.com/mastering-dyalog-apl.htm获得一本精确标题的书籍;-)(免费下载!)还可以找到其他有用的链接和免费的学生版...

答案 1 :(得分:1)

除了一些清理之外,让原始示例工作所需要的只是简化&#34; if&#34;言。

     ∇ r←foo1 c;i;e;⎕IO
[1]    ⎕IO←0
[2]    r←8⍴0 ⍝ creates a vector of length 8 with only blank spaces
[3]    i←8
[4]    e←⎕AV⍳c ⍝ arbitrary choice of numeric value of a char
[5]   a1:r[8-i]←2|e ⍝ simplified this here, no "if" needed
[6]    e←⌊e÷2
[7]    i←i-1
[8]    →(i≠1)/a1
     ∇

问题在于,索引分配的参数显然不匹配。给定r [x]←y,x和y必须在等级和形状(或者如果向量的长度)中匹配。一个重要的例外是标量扩展,其中y可以是标量。最适合实验。

尽管如此,更多APL式的方法来解决这个问题的方法是使用编码(⊤)函数,它为你做分割循环。那个解决方案就是

     ∇ r←foo2 c;⎕IO
[1]    ⎕IO←0
[2]    r←⌽(8⍴2)⊤⎕av⍳c
     ∇