Flying Fish

Thursday, February 17, 2005

Matlab 的 C 语言接口

Matlab 提供了 C 语言的外部接口,对于一些处于速度瓶颈的函数,用户可以选择用 C 语言来编译实现,可以大大降低运算时间。

根据 Matlab 的文档,用 C 语言来实现的函数需要有统一的函数入口:

void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])

用户可以修改此函数来实现 Matlab 和 C 代码的输入输出转换,还可以调用其他 C 函数来实现运算。如此编写 C 程序一个缺点是 C 语言的功能有限,比如不能使用面向对象的编程结构,变量必须在函数最前端申明等等,如果能用 C++ 编程则会更加方便。但是整个 Matlab 网站上的文档都只讨论的 C 语言的情况,只字不提 C++ 。

原来 Matlab 自带的 LCC C 编译器只提供对 C 语言的支持,但是你可以选择机器上安装的其他 C++ 编译器来完成编译任务,比如 Visual Studio .Net 2003,用 "mex -setup" 可以选择使用不同的编译器。当使用支持 C++ 的编译器后,可以把代码后缀名改成 .cpp ,然后就可以用 C++ 编写代码了,入口函数仍然是 mexFunction(...),这个相当于一般 C++ 程序中的 main(...) 函数,其他的就和写别的 C++ 程序一模一样,可以用 class 定义,template,用 STL 等等。

如果你的机器上没有安装 Visual Studio,现在微软免费提供的全套的命令行的 VC 编译工具,可以在这里找到:
http://msdn.microsoft.com/visualc/vctoolkit2003/
再配上一个免费的文本编辑工具就可以了。

Wednesday, February 09, 2005

Matlab 稀疏矩阵操作

Matlab 有很好的稀疏矩阵 (sparse matrix) 支持,稀疏矩阵可以同完全矩阵在任何运算中同时出现。稀疏矩阵的用处不用多说,很多雅克比矩阵需要用它来表示,否则内存完全不可能装得下。但是稀疏矩阵的使用同 Matlab 的其他功能一样,也有一些窍门,不同的代码可能会有完全不同的运行时间差别。

  1. 用 spalloc 预留空间

    同完全矩阵一样,稀疏矩阵也可以预先分配空间,以加快随后的访问速度。

  2. 用 cell2mat 分段创建大的稀疏矩阵

    在给大的稀疏矩阵赋值时,你会发现越到后面赋值得速度越慢,原因是稀疏矩阵的数据结构变得越来越复杂了,需要很长的访问时间。在这种情况下,可以将整个矩阵分块构建,分别存在 cell 数组,最后用 cell2mat 命令把这些矩阵合并成一个矩阵,这样的操作可以大大减少运算时间。

  3. 访问超大型数组

    Matlab 可以构建行列唯数非常大的稀疏矩阵,但是在这时候需要注意,如果单单用一唯数来索引矩阵中的元素的话,如 M(ai) 而不是 M(i, j),ai = i + (j-1) * i_dim 有可能超过 32 位整数所能表示的范围, Matlab 会提示出错信息,此时必须使用二唯索引。



Navigation: Go to [My Homepage] [My Research Blog] [My Courses Blog]