了解 APL 的内积

syn*_*gma 4 matrix apl dyalog matrix-multiplication

以下是Mastering Dyalog APL书中关于内部的章节的摘录:

HMS is a variable which contains duration in Hours, Minutes, and Seconds: HMS ? 3 44 29 Chapter J – Operators 397

We would like to convert it into seconds. We shall see 3 methods just now, and a 4th
 method 
will be given in another chapter. 
    A horrible solution                        (3600×HMS[1]) + (60×HMS[2]) + HMS[3] 
    A good APL solution                        +/ 3600 60 1 × HMS 
    An excellent solution with Inner Product   3600 60 1 +.× HMS 
Run Code Online (Sandbox Code Playgroud)

然后它说第二个和第三个解决方案在键入的字符数和性能方面是等效的。

据我了解,APL 程序员一般应该尽可能多地使用Inner Product,以及Outer Product。那是对的吗?

你能举一个例子,当使用内积会导致性能提升吗?当我使用内积(在较低级别)时到底会发生什么?下面给出的第一个解决方案是否很糟糕,因为它没有以正确的方式使用 APL 语法还是实际上性能更差?

我知道有几个问题,但我想问的是内部/外部产品如何工作的,以及 APL 程序员应该在什么时候使用它们

小智 6

我们\xe2\x80\x99已经完成了优化+/和+.\xc3\x97的工作。

\n\n

MBaas 是正确的,因为在这种情况下 +/ 恰好比 + 稍好。\xc3\x97

\n\n

我们的一般建议是:使用最适合工作的语言结构,最终实现会赶上。

\n\n

“可怕”的解决方案被认为是糟糕的,因为它没有使用数组思维。

\n\n

问候,

\n\n

文斯,Dialog 支持

\n


ngn*_*ngn 5

APL 程序员一般应该尽可能多地使用内积和外积。那是对的吗?

这真的取决于 APL 程序员和手头的任务,但如果有什么能让 APL 代码更简洁和高效,我不明白为什么程序员不会选择它。

在这种特殊情况下60?HMS甚至比内积更简洁和高效。

你能举一个例子,当使用内积会导致性能提升吗?

正如在面向数组的编程中一样,性能提升是通过一次性完成的。大多数 APL 函数都是隐式循环——它们的实现使用一个计数器、一个限制和一个增量步。你的代码越短越好,因为它不仅更容易记住,而且效率也更高,因为解释器必须对数据进行更少的传递。一些实现进行循环融合以试图减少这种开销。有些具有习语识别功能——某些波浪线组合在解释器中是特殊情况。一次性完成还允许解释器进行巧妙的优化,例如使用 SSE 指令集或 GPU。

回到内积,让我们以A f.g BwhereABare 向量为例,看看fg是如何应用的(在 Dyalog 中):

      f?{??(??),' f ',?? ? ?+?}
      g?{??(??),' g ',?? ? ?×?}
      0 1 2 3 4 f.g 5 6 7 8 9
4 g 9
3 g 8
24 f 36
2 g 7
14 f 60
1 g 6
6 f 74
0 g 5
0 f 80
80
Run Code Online (Sandbox Code Playgroud)

从上面可以看出,调用fg是交错的。解释器同时处理f和减少g,一次性完成,避免创建临时数组,就像f/ A g B会做的那样。

另一个例子:http : //archive.vector.org.uk/art10500200

您可以自己测试不同解决方案的性能,看看哪一个最有效:

      )copy dfns.dws cmpx
      ? or: ")copy dfns cmpx" if you are using Windows
      HMS ? 3 44 29
      cmpx '(3600×HMS[1]) + (60×HMS[2]) + HMS[3]' '+/ 3600 60 1 × HMS' '3600 60 1 +.× HMS' '60?HMS'
  (3600×HMS[1]) + (60×HMS[2]) + HMS[3] ? 2.7E¯6 |   0% ????????????????????????????????????????
  +/ 3600 60 1 × HMS                   ? 9.3E¯7 | -66% ??????????????
  3600 60 1 +.× HMS                    ? 8.9E¯7 | -68% ?????????????
  60?HMS                               ? 4.8E¯7 | -83% ???????
Run Code Online (Sandbox Code Playgroud)