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