使用 ILNumerics 进行矩阵运算

ILNumerics 可用于在 .NET 程序中进行矩阵运算,就像 MATLAB 一样便捷。

可以使用 VS 的 NuGet 程序包管理器 来安装此库。

下面使用一个简单的控制台应用程序来介绍其用法。

用法初探

这里的ILArray<>就是一个普通的矩阵类了。由此可见,ILNumerics 的操作和 MATLAB 有一定的相似性。

ILArray<>实现了IDispose接口,所以一定要保证所有的ILArray<>在使用完毕后都会被调用Dispose函数。

当然,更好的办法是使用using语句,其可以在离开using块的时候自动调用Dispose函数:

还有一点,在局部类型推理如此常见的今天,我们还需要手动指定变量A的类型?也许你想这样写: var A = ILMath.array(new[] ... ,这固然没错。

我们来看看ILMath.array的定义

很明显,这个函数的返回类型是ILRetArray<>。是的,在 ILArray<double> A = ILMath.array(new[] ... 一行中发生了隐式数据类型转换。在转换的过程中,ILRetArray<>对应的表达式被计算,并存入A中。希望大家能够注意到这个细节。

在 ILNumerics 的一般“使用规则”中,有明确提到,不要使用局部变量的类型自动推理,也就是说,不要显式(使用ILRetArray<>)或者隐式(使用var推理)定义ILRetArray<>类型的局部变量。否则在使用过程中,可能会出现NullReferenceException异常。

实际上,建议大家在使用此库之前,仔细阅读General Rules – ILNumerics – Numerical Math Library for C# and .NET一页的全部内容。大体而言,使用规则可以归纳为

    • 在使用矩阵变量时不要使用局部类型自动推理。(当然,这并不妨碍你定义诸如 var i = 10; /* i is int */ 这样的局部变量,因为他们和 ILNumerics 没有任何关系。)
    • 不要对矩阵使用复合赋值运算符(诸如 +=、-=、*=、/=)
    • 如果当前正在编写的函数的输入/输出参数有矩阵,那么需要遵循以下规则

      Essential Function Rules of ILNumerics: The first rule declares specific array types for input parameters and return values in function declarations. The second rule creates artificial scopes around the function body and the third rule handles assignments to output parameters.

内存管理

与MATLAB不同,C#不是一门动态语言,因此所有的变量都必须显式声明出来。此外,由于,ILArray<>实现了IDispose,因此在计算结束后必须调用其Dispose函数。

这仅仅是一个简单的线性方程求解程序。如果我们需要使用大量的中间矩阵变量,那么势必会造成Dispose()(或者using)满天飞的情况。好在 ILNumerics 提供了 ILScope 机制,可以解决这一问题。

在离开using块时,using块中定义的所有的矩阵变量均会被Dispose。注意,这是ILScope的行为,而不是using块的行为。

关于ILScope的详细信息,请参阅 Optimizing Performance – ILNumerics – Numerical Math Library for .NET and C#

用法示例

下面的代码简要介绍了矩阵的常用功能。大部分的操作可以和MATLAB相类比。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*