F#与数学 - 数字运算与F# PowerPack
这篇文章是此系列中的第一篇,在这个系列中,我将介绍F#中的一些特性,如对数字运算有帮助的特性以及一些来自F# PowerPack库的一些功能。大部分内容最初都是为位于MSDN上名为“F#中的数字运算”的章节(我之前发布的)所写的,但是后来,我们决定把重点放到使用第三方语言库的F#编程上,这些库提供了更多有效的实现以及更丰富的标准数字运算函数集合,通常在实现机器智能学习和概率算法或者进行统计分析时,这些函数集合会被应用到。如果你对这个话题感兴趣,那么本文的最后部分给出了MSDN中一篇重要文章的链接。
尽管如此 ,F# PowerPack仍然包含了一些有用的功能.它包含两种附加的数字类型以及一个与F#完美整合的矩阵实现.这个系列同时也演示了如何使用F# 语言的一些特性写出优雅的数字运算代码.特别的,我们将使用以下的方面:
- 运算符重载:任意类都可以提供一个标准数字运算符的重载版本,例如+ ,-,*与/以及一些非标准的运算符(如.*)。这样一来,用户自定义的语言库就可以创建自己的、与内置类型非常相似的数字类型,例如int型。
- 数字原型:F#数学库允许在代码中使用新的数字原型。例如,你可以用1N/3N来表示三分之一这样的一个BigRational类型的值。在F#语言中,在这个数值表示符中的后缀N并不是写死的,并且,我们将看看如何定义类似这样的数字类型。
- 静态约束:F#支持对类成员的静态约束(Static修饰),这可以使用在那些对任意数字类型适用的函数上。例如,List.sum函数就使用了这个功能。它可以为list所包含的数字成员求和。
在写数字代码时,上面提到的功能仅仅是所有有用的功能中的小部分,还有其他很多没提到的。常用的F# 开发风格是使用交互工具,类型安全从而避免常见的错误,测试单元以及F#中的表达式使得F#成为编写数字代码的一个很好的工具。更多的信息,请参看MSDN上的文章用F#编写简洁地正确地数字计算代码。
数字计算与F# PowerPack
如果你正在查找一些关于其他PowerPack组件的信息,那么,Daniel Mohl写过这样的一个系列文章——它覆盖了数字类型和模块(第一部分),异步扩展(第二部分),附加集合类(第三部分),以及词法,句法分析和SI单位(第四部分)。
在这个系列中,我们会看到F# PowerPack语言库中提供的大部分数字运算功能。下面的列表展示了即将发布的系列文章:
- F#与数学(I.)-PowerPack中的数字类型
PowerPack库提供了两种附加的数字类型。类型BigRational代表了任意的精确的实数,complex则代表了复数。这篇文章简单的描述了这两种类型。.Net2.0同时也提供了任意大小的整数(在.NET4.0中,位于System.Numerics.dll集合中)。
- F#与数学(II.)-图像算法中矩阵的使用
matrix 类型可以用来存储浮点型数字。此类型支持很多常用的操作,如矩阵相乘,逐点相加以及一些其他运算。同样的,也有一个与此对应的范型,名为Matrix<’T>,当矩阵中包含int或decimal型数据时,我们可以用到此类。这篇文章展示了如何使用matrix类型来描述一个使用adjacency matrix的图像,并且展示如何计算它的可达图。
- F#与数学(III.)- 自定义的数字类型
这篇循序渐进的指南展示了如何定义一个数字类型,可以使用自定义的数字原型来实现以及能使用标准的操作符。这篇指南同样使用了F#PowerPack中的模块GlobalAssociations,从而允许在F# Matrix<’T>类型中使用自定义的类型作为元素。
- F#与数学(IV.)-编写范型代码(目前还不可用)
这篇文章讨论了写范型代码的两种方式,此范型代码用来处理任意一个数字类型(如float和复数)。这第一种方式基于F# “静态成员约束”,第二种则是基于F# PowerPack中的模板GlobalAssociations。在这篇文章中,我们会比较这两种方式,并讨论在什么情况下那种方式更合适。
F# 中的数字计算(MSDN)
如上述提到的一样,F# PowerPack 只提供了矩阵的基本实现,它并不适用于那些高效的矩阵相乘任务。该库并没有实现任何更高级的运算操作,如矩阵分解,也不支持概率分布或统计分析。
如果你对编写高效的F# 数字代码感兴趣,那么建议您使用第三方语言库(例如开源的Math.NET Numerics),这些第三方库提供了更高效的实现,以及更多的功能。MSDN上的一片名为Introduction to Numerical Computing in F#的文章提供了更多的信息,包括一些已经存在的语言库的预览。它同时也包括了用来演示以下三项的示例:
Math.NET Numerics 旨在成为.NET框架下开源数学库的一个标准。它的发布是经过了MIT的许可,因此它可以被使用在商业或者非商业的项目中,也可以修改与重分布它。这篇指南给出了如何使用此库中各种组件的一些介绍。
Microsoft Sho是一个支持线性代数,优化与可视化的数字计算平台。这篇文章介绍了Sho以及展示了如何从F#中调用它的.NET库。
F# PowerPack 为矢量与矩阵提供了相应的类,F# MathProvider在这些类上支持线性代数各种操作。这篇文章给出了这两个库的介绍。
引用&链接
- F# PowerPack(原代码与二进制包)- CodePlex
- 数字计算–MSDN上的Real World Functional Programming
- 初始F# PowerPack(四篇文章系列中的第一篇)Daniel Mohl