使用ILNumerics在.Net执行计算
2012-10-13 12:07
232 查看
一.下载安装ILNumerics函数库
在http://ilnumerics.net/$Editions.html下载ILNumerics社区版压缩包,现在版本为v2.13,约27.3MB。解压缩后目录结构如图1所示。
图1 ILNumerics源码包解压内容
现在需要编译ILNumerics函数库,用VisualStudio打开工程文件ILNumerics.csproj,编译一遍,在生成目录下Debug/Release下就有生成的ILNumerics.dill库了,如图2所示。
图2 编译结果
下面要做的就是将ILNumerics函数库添加到你的工程中去了。
首先,在项目引用中添加对ILNumerics.dll的引用,并且将图1中bin32(如果你的计算机是64位则对应bin64)目录下的libiomp5md.dll,mkl_custom32.dll,OpenTK.dll文件以内容文件添加到工程根目录,如果是Linux平台,自然应该添加的是*.so文件,如图3所示
。
图3 将ILNumerics添加到工程
二.利用ILNumerics做个小例子
下面就利用ILNumerics简单求解线性方程组,该示例来自官方网页。要注意的是,先引用ILNumerics命名空间。另外主类Program继承了ILNumerics.ILMath类,以方便使用它的静态函数,但实际中可能不太会这么用。
为了得到ILNumerics在.net上的高性能,它优化了这几方面:1.函数参数使用了值类型;2.一旦退出函数,马上开始垃圾回收;3.循环利用内存来分配数组;4.数组延迟复制——只写地使用内存;5.无论何时对数组的操作都在原地完成。
得到这些优化也不是无偿的,因此在使用ILNumerics时也比使用普通数学库有更多的限制。比如在C#中,不允许对任何ILNumerics中定义的类型使用var关键字。不允许对任何ILNumerics中定义的类型使用符合操作符,如+=,-=,/=,*=等。严格地讲,是不允许对ILNumerics数组索引使用这些操作符,如A[0]+=1是错误的,而A+=1是支持的。官方建议是:为了避免错误,对ILNumerics所有的类型都不使用符合操作符。
另外,若想要获得更多的性能提升,那么在定义函数时就需要遵守更多的规则。图4很好地说明了该规则。
图4 ILNumerics定义函数的的规则(图片链接:http://ilnumerics.net/img/NiceCodeExample_FreqPeaksOverview2.png)
A. ILNumerics中最常用的数组类型有ILArray<T>,ILCell和ILLogical,但是在函数定义参数列表中使用了专门的输入,输出和返回数组类型,如ILInArray<double>,ILOutArray<int>,ILRetArray<double>等。它们遵守统一的命名规则:
IL[|In|Out|Ret][Array<T>|Cell|Logical]
再次强调的是,这些In|Out|Ret数组仅用于函数参数声明中。还有,C#中的ref,out关键字不再被使用。
B. 函数体的规则。函数体需要被这样的using块包裹:
图5 函数定义示例(图片网址:http://ilnumerics.net/img/NiceCodeExample_FreqPeaksHeadBody.png)
注意,图5中为frequencies数组赋值使用的语句,使用了.a Setter器不是用等号直接赋值。另外,using块中的check函数是对输入参数作检查,这里主要检查是否为null,而且check函数应该是唯一引用输入参数的地方。当然也可以使用check其他重载版本作更多检查,如:
最后是一个函数定义及使用的示例,在ILNumerics没有对矩阵直接求逆的方法,所以该方法对输入矩阵求逆。
参阅在线帮助文档http://ilnumerics.net/Support_Documentation$Arrays.html。
在http://ilnumerics.net/$Editions.html下载ILNumerics社区版压缩包,现在版本为v2.13,约27.3MB。解压缩后目录结构如图1所示。
图1 ILNumerics源码包解压内容
现在需要编译ILNumerics函数库,用VisualStudio打开工程文件ILNumerics.csproj,编译一遍,在生成目录下Debug/Release下就有生成的ILNumerics.dill库了,如图2所示。
图2 编译结果
下面要做的就是将ILNumerics函数库添加到你的工程中去了。
首先,在项目引用中添加对ILNumerics.dll的引用,并且将图1中bin32(如果你的计算机是64位则对应bin64)目录下的libiomp5md.dll,mkl_custom32.dll,OpenTK.dll文件以内容文件添加到工程根目录,如果是Linux平台,自然应该添加的是*.so文件,如图3所示
。
图3 将ILNumerics添加到工程
二.利用ILNumerics做个小例子
下面就利用ILNumerics简单求解线性方程组,该示例来自官方网页。要注意的是,先引用ILNumerics命名空间。另外主类Program继承了ILNumerics.ILMath类,以方便使用它的静态函数,但实际中可能不太会这么用。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ILNumerics; namespace ConsoleApplication1 { // it is recommended to derive from ILMath class Program : ILNumerics.ILMath { static void Main(string[] args) { // create a matrix A, give values explicitely ILArray<double> A = array<double>( new double[]{1,1,1,1,1,2,3,4,1,3,6,10,1,4,10,20},4,4); // use a creation function for B ILArray<double> B = counter(4,2); // use a function of the base class: ILMath.linsolve ILArray<double> Result = linsolve(A,B); // A.ToString() gives formated output Console.Out.WriteLine("A: " + Environment.NewLine + A.ToString()); Console.Out.WriteLine("B: " + Environment.NewLine + B.ToString()); Console.Out.WriteLine("A * [Result] = B: " + Environment.NewLine + Result.ToString()); // check result: // uses norm, multiply, eps and binary operators if (norm(multiply(A, Result) - B) <= eps) { Console.Out.WriteLine("Result ok"); } else { Console.Out.WriteLine("Result false"); } Console.ReadKey(); } } }输出结果:
A: <Double> [4,4] 1 1 1 1 1 2 3 4 1 3 6 10 1 4 10 20 B: <Double> [4,2] 1 5 2 6 3 7 4 8 A * [Result] = B: <Double> [4,2] 0 4 1 1 0 0 0 0 Result ok三.注意事项
为了得到ILNumerics在.net上的高性能,它优化了这几方面:1.函数参数使用了值类型;2.一旦退出函数,马上开始垃圾回收;3.循环利用内存来分配数组;4.数组延迟复制——只写地使用内存;5.无论何时对数组的操作都在原地完成。
得到这些优化也不是无偿的,因此在使用ILNumerics时也比使用普通数学库有更多的限制。比如在C#中,不允许对任何ILNumerics中定义的类型使用var关键字。不允许对任何ILNumerics中定义的类型使用符合操作符,如+=,-=,/=,*=等。严格地讲,是不允许对ILNumerics数组索引使用这些操作符,如A[0]+=1是错误的,而A+=1是支持的。官方建议是:为了避免错误,对ILNumerics所有的类型都不使用符合操作符。
另外,若想要获得更多的性能提升,那么在定义函数时就需要遵守更多的规则。图4很好地说明了该规则。
图4 ILNumerics定义函数的的规则(图片链接:http://ilnumerics.net/img/NiceCodeExample_FreqPeaksOverview2.png)
A. ILNumerics中最常用的数组类型有ILArray<T>,ILCell和ILLogical,但是在函数定义参数列表中使用了专门的输入,输出和返回数组类型,如ILInArray<double>,ILOutArray<int>,ILRetArray<double>等。它们遵守统一的命名规则:
IL[|In|Out|Ret][Array<T>|Cell|Logical]
再次强调的是,这些In|Out|Ret数组仅用于函数参数声明中。还有,C#中的ref,out关键字不再被使用。
B. 函数体的规则。函数体需要被这样的using块包裹:
using(ILScope.Enter(in1,in2,...)) { // function body... }该using块显示地创建了一个作用范围,在该using块中创建的所有数组在推出块后会立即被清理,而且输入参数也同样被清理,因此,ILScope.Enter()需要接收所有函数中声明的输入参数(即ILInArray或ILInCell或ILInLogical参数,不包含C#普通值变量)。图5是函数定义的示例。
图5 函数定义示例(图片网址:http://ilnumerics.net/img/NiceCodeExample_FreqPeaksHeadBody.png)
注意,图5中为frequencies数组赋值使用的语句,使用了.a Setter器不是用等号直接赋值。另外,using块中的check函数是对输入参数作检查,这里主要检查是否为null,而且check函数应该是唯一引用输入参数的地方。当然也可以使用check其他重载版本作更多检查,如:
B = check(inB, (b) => { // checks on column vector also if (!b.IsVector) throw new ILArgumentException("inB must be a vector!"); return (b.IsRowVector) ? b.C : b.T; });前面已经提到ILNumerics的优化中,函数参数使用了值类型,所以它的函数输入参数都是不可变的。所以,对每个输入参数,必须创建对应的局部变量,如图5中所示。
最后是一个函数定义及使用的示例,在ILNumerics没有对矩阵直接求逆的方法,所以该方法对输入矩阵求逆。
public static ILRetArray<double> Inverse(ILInArray<double> inA) { using (ILScope.Enter(inA)) { ILArray<double> A = ILMath.check(inA, (b) => { if ((b.S.NumberOfDimensions != 2) || (b.S[0] != b.S[1])) throw new ILNumerics.Exceptions.ILArgumentException("inA must be a square matrix!"); return b; }); int size = A.S.Longest; return ILMath.linsolve(A, ILMath.eye(size, size)); } }调用方式如下:
ILArray<double> m = ILMath.rand(2,2); ILArray<double> i=Inverse(m);四. 使用手册
参阅在线帮助文档http://ilnumerics.net/Support_Documentation$Arrays.html。
相关文章推荐
- .NET使用并行计算 提高执行效率
- .Net高性能数值计算库—ILNumerics.Net
- .Net上真正的计算利器ILNumerics
- php使用microtime(true)计算php程序代码执行消耗时间
- 一个简单的使用Quartz和Oozie调度作业给大数据计算平台执行
- C# TimeSpan计算代码执行时间差的简易使用
- Linux系统使用time计算命令执行的时间
- 【原创】.NET开源表达式计算组件介绍与使用
- .net使用foreach时发生错误:集合已修改;可能无法执行枚举操作
- .Net平台 C# 程序, 使用DILE(Dotnet IL Editor) 进行动态调试
- 使用Dottrace跟踪.net代码执行时间
- 使用Spring自带的CronSequenceGenerator来计算cron表达式下次执行日期
- .net 评分计算--使用配置公式进行计算
- .NET使用Task动态创建多任务多线程并行程序计算Redis集群keys计算
- .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
- 利用.Net中Process类调用netstat命令来判断计算端口的使用情况
- CLR_via_C#.3rd 翻译[25.7 使用专用线程执行异步的计算限制操作]
- C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
- 通过IL了解.Net中表达式计算过程