更简单、更高效、功能性更强的线性映射

A类上一个帖子描述了函数线性映射的数据类型。作为安迪·吉尔 指出,我们花了很多时间试图取得好成绩。本说明描述了一种新的表示法,即非常简单而且效率更高。回想起来,这很明显,但我花了很长时间才发现。

这里描述的Haskell模块是向量空间库(版本0.5或更高版本),并要求ghc版本6.10或更高(对于相关类型)。

编辑:

  • 2008年11月9日:更改版本备注。矢量空间版本0.5取决于ghc 6.10。
  • 2008-10-21:修复了向量空间库引子中的链接。

线性贴图

语义上,a线性地图是一个函数f|a→b这样,对于所有标量值和“矢量”u、 v|a,以下属性保持不变:

(f)( ⋅ 单位) =  ⋅ (f) 单位

(f)(单位 + v(v)) = (f) 单位 + (f) v(v)

通过反复应用这些特性,

(f)(1 ⋅ 单位1 + ⋯ + n个 ⋅ 单位n个)=1 ⋅ (f) 单位1 + ⋯ + n个 ⋅ (f) 单位n个

采取单位作为基向量,这种形式意味着线性函数是由其在任何基础其域类型的。

因此,线性函数可以使用通过类型族的向量空间基.

类型单位:-*v(v)= 依据u→v

语义函数转换自(u:-*v)(u→v)它将源向量分解为其坐标,将基函数应用于基表示,并将结果线性组合。

重叠地(矢量空间u、,矢量空间v(v)
,标量单位~ 标量v、,HasBasis公司u)⇒
(u)以下为:-*v) →(u→v)
重叠lm=λu→总和V[s*^勒姆b|(b,s)←分解u]

重叠lm=linearCombo∘功能性维修计划(第一lm)∘分解

反向功能更容易。转换函数(f)假定为线性,以线性地图表示:

线性的(矢量空间u、,矢量空间v、,HasBasis公司u) ⇒
(u→v)→(u:-*v)

它足以应用(f)基准值:

线性f=f∘基本值

备忘录

线性映射表示的思想是仅用几个样本重建整个(线性)函数。换句话说,我们可以对函数的域进行很小的采样,并重用这些值,以便在全部的域值。然而,正如上面所实现的,这个技巧使函数应用程序更昂贵,而不是更低。如果lm=线性f,然后每次使用重叠lm可以应用(f)到每个基元的值,然后将结果线性组合。

一个简单的技巧可以解决这个效率问题:记忆线性地图。我们可以私下记下来,例如。,

线性f=备忘录(f∘basisValue)

如果lm=线性f,那么无论多少次重叠lm应用时,函数(f)只能应用与域维度相同的次数(f).

然而,还有其他几种制作线性映射的方法,很容易忘记记忆每个组合形式。因此,我确保通过将函数表示为备忘录trie.

类型单位:-*v(v)= 依据u↛v型

转换函数线性的翻领的只需要稍微调整一下。拆分备忘录纳入其定义国家特里,然后移动第二阶段(国家)到重叠地。我们还必须添加哈斯特里约束条件:

线性的(矢量空间u、,矢量空间v(v)
,HasBasis公司u、,哈斯特里(依据u) )⇒
(u→v)→(u:-*v)
线性f=trie(基本值)

重叠地(矢量空间u、,矢量空间v、,标量单位~ 标量v(v)
,HasBasis公司u、,哈斯特里(依据u) )⇒
(u):-*v) →(u→v)
重叠lm=线性组合功能性维修计划(first(untrie lm))∘分解

现在,我们可以使用中所示的memo tries操作,方便高效地构建线性地图编写备忘录尝试次数例如,假设小时是两个参数的线性函数(在二者都,不是它每个)和n个是两个线性映射。然后提升时间12h m n是适用的线性函数小时的结果n个.

搭接(提升2 h m n)a=h(搭接m a)(搭接n a)

利用函数的应用函子实例,我们得到了另一个公式:

搭接(提升2 h m n)=提升时间2 h(搭接m)(搭接n)

换句话说提升A2提升A2含义,如中所述使用类型类形态简化语义.

一条评论

  1. Conal Elliott»博客档案»比较高维、高阶导数的公式:

    […]在高维、高阶导数中描述的实现,在函数和更简单、更有效的函数线性映射中描述。对于Rn的情况,我的公式使用了一个trie,其中包含n个基本元素的条目,而[…]

留下评论