`
ajinn
  • 浏览: 38157 次
文章分类
社区版块
存档分类
最新评论

使用ILNumerics在.Net执行计算

 
阅读更多

 

一.下载安装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.dllmkl_custom32.dllOpenTK.dll文件以内容文件添加到工程根目录,如果是Linux平台,自然应该添加的是*.so文件,如图3所示 。

           

图3 将ILNumerics添加到工程

二.利用ILNumerics做个小例子

下面就利用ILNumerics简单求解线性方程组,该示例来自官方网页。要注意的是,先引用ILNumerics命名空间。另外主类Program继承了ILNumerics.ILMath类,以方便使用它的静态函数,但实际中可能不太会这么用。

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using ILNumerics;   
  6.    
  7. namespace ConsoleApplication1 {  
  8.    
  9.     // it is recommended to derive from ILMath  
  10.     class Program : ILNumerics.ILMath {  
  11.    
  12.         static void Main(string[] args) {  
  13.             // create a matrix A, give values explicitely  
  14.             ILArray<double> A = array<double>(  
  15.                     new double[]{1,1,1,1,1,2,3,4,1,3,6,10,1,4,10,20},4,4);  
  16.             // use a creation function for B  
  17.             ILArray<double> B = counter(4,2);   
  18.               
  19.             // use a function of the base class: ILMath.linsolve   
  20.             ILArray<double> Result = linsolve(A,B);  
  21.    
  22.             // A.ToString() gives formated output  
  23.             Console.Out.WriteLine("A: " + Environment.NewLine + A.ToString());  
  24.             Console.Out.WriteLine("B: " + Environment.NewLine + B.ToString());  
  25.             Console.Out.WriteLine("A * [Result] = B: " + Environment.NewLine   
  26.                                                        + Result.ToString());   
  27.    
  28.             // check result:  
  29.             // uses norm, multiply, eps and binary operators   
  30.             if (norm(multiply(A, Result) - B) <= eps) {  
  31.                 Console.Out.WriteLine("Result ok");  
  32.             } else {  
  33.                 Console.Out.WriteLine("Result false");  
  34.             }  
  35.             Console.ReadKey();   
  36.         }  
  37.     }  
  38. }  
输出结果:

 

 

  1. A:  
  2. <Double> [4,4]  
  3.          1          1          1          1  
  4.          1          2          3          4  
  5.          1          3          6         10  
  6.          1          4         10         20  
  7.            
  8. B:  
  9. <Double> [4,2]  
  10.          1          5  
  11.          2          6  
  12.          3          7  
  13.          4          8  
  14.            
  15. A * [Result] = B:  
  16. <Double> [4,2]  
  17.          0          4  
  18.          1          1  
  19.          0          0  
  20.          0          0  
  21. 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块包裹:

 

  1. using(ILScope.Enter(in1,in2,...)) {  
  2. // function body...  
  3.    
  4. }  
该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其他重载版本作更多检查,如:

 

  1. B = check(inB, (b) => {    // checks on column vector also  
  2.         if (!b.IsVector)   
  3.             throw new ILArgumentException("inB must be a vector!");   
  4.         return (b.IsRowVector) ? b.C : b.T;    
  5.     });   
         前面已经提到ILNumerics的优化中,函数参数使用了值类型,所以它的函数输入参数都是不可变的。所以,对每个输入参数,必须创建对应的局部变量,如图5中所示。

 

最后是一个函数定义及使用的示例,在ILNumerics没有对矩阵直接求逆的方法,所以该方法对输入矩阵求逆。

 

  1. public static ILRetArray<double> Inverse(ILInArray<double> inA)  
  2.         {  
  3.             using (ILScope.Enter(inA))  
  4.             {  
  5.                 ILArray<double> A = ILMath.check(inA, (b) =>  
  6.                 {  
  7.                     if ((b.S.NumberOfDimensions != 2) || (b.S[0] != b.S[1]))  
  8.                         throw new ILNumerics.Exceptions.ILArgumentException("inA must be a  square matrix!");  
  9.                     return b;  
  10.                 });  
  11.                 int size = A.S.Longest;  
  12.                 return ILMath.linsolve(A, ILMath.eye(size, size));  
  13.             }  
  14.         }  
调用方式如下:

 

 

  1. ILArray<double> m = ILMath.rand(2,2);  
  2. ILArray<double> i=Inverse(m);  
四. 使用手册

 

参阅在线帮助文档http://ilnumerics.net/Support_Documentation$Arrays.html

 

分享到:
评论

相关推荐

    ILnumerics资料

    3. **编译文件**:这些文件包含了ILnumerics库的编译版本,用户可以直接在自己的项目中引用,以便在.NET环境中使用ILnumerics的功能。 4. **文档**:详细的API文档会解释ILnumerics的各个类、方法和属性,是深入...

    Python-PythonNetPython与NET公共语言运行库CLR的几乎无缝集成

    2. **数据分析和科学计算**:Python有许多优秀的科学计算库,如NumPy和Pandas,结合.NET的高性能计算库,如ILNumerics,可以实现更强大的计算能力。 3. **GUI开发**:PythonNet可以与.NET的Windows Forms或WPF框架...

    C#数值计算算法编程

    在IT领域,C#是一种广泛使用的面向对象的编程语言,尤其在开发Windows应用程序、游戏以及Web服务方面表现突出。在“C#数值计算算法编程...通过深入学习和实践,你将能够在C#的世界中游刃有余地执行复杂的数值计算任务。

    FFTtimespectrum_CSharp2015_net4.6_FFT计算时域和频率转换查看_曲线频率_

    在C#中,我们可以利用Math.NET Numerics、Accord.NET或ILNumerics等库来实现FFT。不过,这个项目可能是自定义实现,这需要理解FFT的基本原理,包括DFT(离散傅里叶变换)和其对偶IDFT,以及如何优化计算以达到“快速...

    C#开发典型模块大全--决策分析模块

    决策树是一种直观的决策工具,C#可以使用ILNumerics库创建决策树模型。同时,规则引擎如NRules,允许程序员定义一系列业务规则,然后自动执行这些规则进行决策。 8. 实时数据分析: 在大数据场景下,实时决策分析...

    C# 实现快速傅里叶变换代码.zip

    - **ILNumerics**:专门针对高性能数值计算,支持FFT操作。 6. **性能优化** 在实现FFT时,需要注意内存管理,避免不必要的复制操作,使用缓冲区和Span等技术提高效率。对于大型数据集,考虑多线程处理或GPU加速...

    CSharpAlgorithm.zip

    此外,C#库如Math.NET Numerics或ILNumerics等提供了更高级的接口,能够更高效地处理大型线性方程组。 非线性方程求解是数值计算中的难点。C#中常见的方法有牛顿迭代法、二分法和拟牛顿法等。这些算法通过迭代逐步...

    BU3D-开源

    2. **ILNumerics.Net.dll.config** 和 **ILNumerics.Net.dll**:ILNumerics是一个高性能的.NET数学计算库,支持多维数组操作和矩阵计算,这对于处理3D扫描产生的大量数据和执行复杂的几何运算至关重要。 3. **mkl_...

    GM(1,1) 模型预测单井产量

    3. **模型建立与求解**:利用线性代数库(如Math.NET Numerics或ILNumerics)实现最小二乘法求解微分方程参数。 4. **模型检验**:编写函数计算关联度和残差平方和,评估模型的适用性。 5. **预测**:根据求得的参数...

    C#矩阵类(实现相加,相乘,转置,求逆)

    同时,为了提高效率和减少内存消耗,可以考虑使用现有的数学库,如NumSharp、Math.NET Numerics或ILNumerics等。 用户界面方面,你可以创建一个简单的控制台程序,让用户输入矩阵元素,选择操作类型,然后输出结果...

    自动化平台

    2. DataFrame库:例如,可以使用ILNumerics或Accord.NET库来处理和分析数据,它们提供了类似Python Pandas的数据框功能,便于进行统计计算和数据可视化。 六、接口集成 1. RESTful API:自动化平台常常需要与其他...

    C# 数据采集系统 智能采集 数据分析 整套源码

    C#中可以使用` LINQ (Language Integrated Query)`进行数据查询,或者`DataFrame`类库如`Accord.NET`或`ILNumerics`进行复杂的数据操作和分析。 5. **SmartSpiderConfig**: 这部分可能是系统的配置文件,用于设置...

Global site tag (gtag.js) - Google Analytics