Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix 理解APL';内积_Matrix_Matrix Multiplication_Apl_Dyalog - Fatal编程技术网

Matrix 理解APL';内积

Matrix 理解APL';内积,matrix,matrix-multiplication,apl,dyalog,Matrix,Matrix Multiplication,Apl,Dyalog,以下是《掌握Dyalog APL》一书中关于内部产品一章的摘录: 然后它说,第二个和第三个解决方案在键入的字符数和性能方面是等效的 据我所知,APL程序员通常应该尽可能多地使用内部产品和外部产品。对吗 你能举一个例子,当使用内积会导致性能的提高吗?当我使用内积(在较低的层次上)时,会发生什么?下面介绍的第一个解决方案是因为没有正确地使用APL语法而可怕,还是因为它的性能更差 我知道有几个问题,但我想问的是,一般来说,内部/外部产品是如何工作的,APL程序员应该在什么时候使用它们,但根据经验,我认

以下是《掌握Dyalog APL》一书中关于内部产品一章的摘录:

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

据我所知,APL程序员通常应该尽可能多地使用内部产品和外部产品。对吗

你能举一个例子,当使用内积会导致性能的提高吗?当我使用内积(在较低的层次上)时,会发生什么?下面介绍的第一个解决方案是因为没有正确地使用APL语法而可怕,还是因为它的性能更差


我知道有几个问题,但我想问的是,一般来说,内部/外部产品是如何工作的,APL程序员应该在什么时候使用它们,但根据经验,我认为使用内部和外部产品将有利于可读性和性能;-)

现在,看看实践中的情况:

`]performance.RunTime(3600×HMS[1])+(60×HMS[2])+HMS[3]-重复次数=100000

  • 基准测试“(3600×HMS[1])+(60×HMS[2])+HMS[3]”,重复次数=100000次 费用 CPU(平均值):0.001558503836 已用时间:0.001618446292

    ]performance.RunTime'+/3600 60 1×HMS'-repeat=100000

  • 基准测试“+/3600 60 1×HMS”,重复次数=100000 费用 CPU(平均值):0.0004698496481 已用时间:0.0004698496481 `

这是一个很大的区别——如果你重复足够多的次数来测量;-) 当然,数据集越大,优势就越明显! 让我们再看一看3variant:

`]performance.RunTime“3600 60 1+.×HMS”-重复次数=100000

  • 基准测试“3600 60 1+.×HMS”,重复次数=100000 费用 CPU(平均值):0.0004698496481 已用时间:0.000439859245
    `
这里没有区别,但再次强调——使用“真实数据”(更大的数组),您应该会看到更清晰的区别。我认为一个简单的解释是内积就像解释器的一个“陈述”,而第一个变体有3个单一的乘法,索引和需要考虑优先级(括号),然后总结向量,这听起来像很多汗; 第二条语句只有一个乘法(对于向量),因此它已经省去了几个步骤,内积使解释器可以结合一些内部工作来更快地完成工作

但是现在有一个惊喜: v1←(10000/3600 60 1) ⋄v2← 10000/公顷 ]performance.RunTime'+/v1×v2''v1+.×v2'-repeat=100000-比较

  +/v1 × v2 → 6.0E¯5 |  0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕   
  v1 +.× v2 → 6.3E¯5 | +5% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕ 
我原以为较大的参数将有助于使最后一个表达式的性能优势更加明显,但实际上#2赢了。也许Dyalog优化了案例#2多于#3…-)

APL程序员通常应该尽可能多地使用内部产品和外部产品。对吗

这实际上取决于APL程序员和手头的任务,但如果有什么东西使APL代码更简洁、更高效,我不明白程序员为什么不选择它

在这种特殊情况下
60⊥HMS
比内部产品更加简洁高效

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

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

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

从上面可以看出,对
f
g
的调用是交错的。解释器在一次过程中同时应用
f
和减少
g
,避免像
f/agb
那样创建临时数组

另一个例子:

您可以自己测试不同解决方案的性能,看看哪种解决方案效果最好:

      )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% ⎕⎕⎕⎕⎕⎕⎕

我们已经完成了优化+/和+.×

MBaas是正确的,因为在本例中,+/比+.×

我们的一般建议是:使用最适合该工作的语言构造,最终实现将迎头赶上

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

问候,


Vince,Dyalog支持部门

嗨,Vince-很高兴在这里见到你;-)“可怕”的解决方案很好地理解了要倒退必须做什么,即用C或其他标量语言重写一些APL代码。
      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
      )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% ⎕⎕⎕⎕⎕⎕⎕