2014-09-23 64 views
2

最近,我一直试图进入APL。然而,我遇到过的一个问题是向矢量赋值。APL编程 - 为矢量赋值

对于某些我打算获得多个结果的程序(例如,将一个字符或一串字母转换为8位二进制向量的程序),我试着做一个forhift for循环,然后分配具有正确值的范围向量的第i部分。例如,与煤焦>仓矢量的程序:

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]被分配一个值的线得到的长度误差。我的程序出了什么问题,我该如何解决?

+0

从你问这个网站关于APL的两个问题,很显然,不管你在做什么,采取了类作为学生或自学,你的做法是行不通的。你需要APL入门课程。查找Ray Polivka的“APL2一览”副本或任何APL介绍性文字,阅读并完成练习。否则你只是在浪费你的时间。 – 2014-09-23 12:58:01

+0

我会推荐学习一本好的教科书。我发现了Gilman&Rose(一种名副其实的经典)的APL-An Interactive Approach是有史以来最好的关于如何在APL中编程的书籍之一,即使它不包含诸如D-funs之类的现代功能。在eBay或二手书店很容易找到它。 http://books.google.it/books?id=1ddWAAAAMAAJ – Tobia 2014-09-23 14:30:19

回答

1

所有这些都需要您的原始示例工作,除了一点清理,是为了简化“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 
    ∇ 
2
  1. 你正在使用哪种APL实现?大多数APL-Venoders(我知道)现在支持Unicode或者复制&直接粘贴到Unicode或提供方法将APL转换为unicode ...然后您可以粘贴到此处,而不是转录它...
  2. 你说过你还在进入APL。关于APL的关键方面是“阵列思维”。使用AT时,您不需要遍历矢量的元素,但可以直接处理矢量。
  3. 您可能能够改进的另一方面是控制结构。现在大多数APL都提供了一些cs的味道 - 这就是为什么我问1.
  4. 你的任务的问题是if-功能,你没有显示。但是如果条件为真,则通常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 

然而,这种解决方案仅用于说明一些在APL中实现一些一般方面的方法(并且在学习APL时给你一些东西来看看)。对于给定的问题,“真正的”APL解决方案将是(8⍴2)⊤number

最后,如果你不仅想“进入”APL,但有兴趣掌握APL,有一本书可用的确切标题; - )(免费下载!)从http://dyalog.com/mastering-dyalog-apl.htm,您还可以在其中找到其他有用的链接和免费的学生版...

+0

@ user17103:如果我回答了您的问题,如果您可以将我的答复作为解决方案,那将很酷。这在这里被认为是很好的做法,并有助于获得有关进一步问题的答复。如果它没有回答你的问题,请。让我知道什么是缺少;-) – MBaas 2014-09-24 14:23:26