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

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

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

编辑:

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

线性贴图

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

(f)( ⋅ u个) =  ⋅ (f) u个

(f)(u个 + ) = (f) u个 + (f)

通过反复应用这些特性,

(f)(1 ⋅ u个1 + ⋯ + n个 ⋅ u个n个) = 1 ⋅ (f) u个1 + ⋯ + n个 ⋅ (f) u个n个

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

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

类型u个:-*= 依据u个

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

重叠地Ş(矢量空间u、,矢量空间
,标量u个~ 标量v、,HasBasis公司u)
(u)以下为:-*v)(u)v)
重叠lm=λusumV[秒*^勒姆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.

类型u个:-*= 依据u个

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

线性的(矢量空间u、,矢量空间
,HasBasis公司u、,HasTrie公司(依据u) )
(u)v)(u):-*v)
线性f=trie(f∘基本值)

重叠地(矢量空间u、,矢量空间v、,标量u个~ 标量
,HasBasis公司u、,哈斯特里(依据u) )
(u):-*v)(u)v)
重叠lm=linearCombo∘功能性维修计划(第一个(untrie lm))∘分解

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

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

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

帘布层(升力A2 h m n)=提升时间2 h(搭接m)(搭接n)

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

一条评论

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

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

留下评论