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
含义,如中所述使用类型类形态简化语义.
前一篇文章描述了功能线性图的数据类型。正如安迪·吉尔(Andy Gill)指出的那样,我们花了很多时间试图取得好的表现。此便笺。。。