For loop APL编程-为向量赋值

For loop APL编程-为向量赋值,for-loop,vector,apl,For Loop,Vector,Apl,最近,我一直在努力进入APL。然而,我经常遇到的一个问题是给向量赋值 对于某些我想要得到多个结果的程序(例如,将一个字符或一串字母转换为8位二进制向量的程序),我尝试了一个临时的For循环,然后用正确的值分配范围向量的第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] a

最近,我一直在努力进入APL。然而,我经常遇到的一个问题是给向量赋值

对于某些我想要得到多个结果的程序(例如,将一个字符或一串字母转换为8位二进制向量的程序),我尝试了一个临时的For循环,然后用正确的值分配范围向量的第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=8[rho]“”(创建长度为8且只有空格的向量)
i=8
e=[字符c的数值]
a1:r[8-i]
  • 您使用的是哪种APL实现?大多数APL虚拟机(据我所知)现在都支持Unicode,要么直接在Unicode中复制粘贴,要么提供将APL转换为Unicode的方法……然后您可以将其粘贴到这里,而不是转录它
  • 你说你还在进入APL。APL的一个关键方面是“阵列思维”。使用AT,您不需要在向量的元素上循环,而是直接使用向量
  • 您可以改进的另一个方面是控制结构。现在大多数APL都提供了一些cs的味道——这就是为什么我问1
  • 分配的问题在于未显示的
    if
    -函数。但通常情况下,如果条件为true,则
    if
    -函数将返回其正确的参数,否则返回空向量。所以,在您的例子中,当条件不满足时,您尝试将空向量插入数组的位置,但只有标量在那里是可接受的(除非您使用嵌套数组,这对于这个问题来说是完全多余的)
  • 这是一个与您的版本非常接近的版本,但它使用控制结构并将给定的数值转换为二进制:

     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
    
    r←富科;我⎕IO;物件
    ⍝ 将整数值c转换为二进制(循环版本)
    ⎕木卫一←0
    我←7.
    R←8.⍴0
    
    :如果(i>255)∨(一)≠⌊(一)∨我要使您的原始示例发挥作用,除了进行一些清理外,所需要做的就是简化“if”语句

         ∇ 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
         ∇
    

    从您在本网站上提出的关于APL的两个问题中可以清楚地看出,无论您是以学生身份上课还是自学,您的方法都不起作用。您需要一门APL入门课程。请查找Ray Polivka的“APL2概览”,或任何APL介绍性文本,阅读并完成练习。否则,你只是在浪费时间。我建议你也学习一本好的教科书。我发现了Gilman&Rose(名副其实的经典)的APL互动方法成为有史以来关于如何使用APL编程的最佳书籍之一,即使它没有涵盖D-funs等现代功能。在易趣或二手书店中很容易找到。@user17103:如果我回答了你的问题,如果你能检查我的回答作为解决方案,那将是很酷的。这被认为是很好的实践,对ge有帮助如果没有回答你的问题,请告诉我遗漏了什么;-)