本文将介绍一些目前可在 Linux 环境中使用的开放源代码 C/C++ 矩阵库。在这里具
体讨论的库有三个:Meschach 库为 C 代码编写的项目提供例程,用于矩阵和向量的
运算;Cooperware Matrix(CwMtx)库可用于 C++ 代码编写;Blitz 库为 C++ 提供
可用整数、浮点数、复数和规范的用户定义的类型的 n 维数组类。Andrew Blais 是
Gnosis,Inc. 的研究员和作家,他在 developerWorks 已投稿多次,从事神经网络
方面的工作。
本文假设读者对 C/C++ 有一定的了解并非常关注 C/C++ 本身没有矩阵功能。您可能
在分析计量经济学的数据或模拟雨林。对于我来说,我正从事神经网络的研究而一两
个矩阵可以大大简化神经网络的实现。虽然 C/C++ 包括可被看作矩阵(例如数组和
标准库中的向量、列表和图)的容器,但是,真正是矩阵的容器将使手中的任务变得
很容易。所以我们将介绍三个开放源代码库供您选择,它们不要求您从头开始构建矩
阵,但的确让您使用矩阵库。如果您期望用从未见过的方法来使用它,那就太好了。
Meschach:用 C 的选择
对于用 C 编写代码的项目,Meschach(读作 me-shark)提供了例程,用于矩阵和向
量的运算。它的优点是能在 Linux 和多数其它操作系统下编译,并且在版权保护下
可公开获得,只要您作出例行的承认并报告错误。Meschach 可以解稠密或稀疏线性
方程组、计算特征值和特征向量和解最小平方问题,另外还有其它功能。它为双精度
数和复数提供了近 400 个函数。它提供的教程以说明性的小案例研究的形式介绍了
这些函数。David Stewart 和 Zbigniew Leyk 通过一些主题的讨论来介绍 Meschach
,这些主题包括超定方程组的广义的最小平方方程解答器(generalized least square
equation solver for over-determined equations)和涉及稀疏矩阵的问题。他们
的教程还包括三维矩阵和错误报告等稍稍高级的主题。
对象和类函数往往与代码关联,C 结构可能看起来有点神秘,所以 C 库往往不被作
为可行的解决方案。但是作为对此的反击,这个库的组织很合理,所以不应不加思索
地就舍弃它。在下载 Meschach 后过了一刻钟,我就可以制造、填充和显示矩阵了(
在概念上等同于创建 Hello World! 程序)。您可以参考一本名为“Meschach: Matrix
Computations in C”的便宜的印刷品手册(请参阅本文末尾的参考资料)。特别是
测试程序“torture”,其中包括不少有益的线索。
CwMtx 中的矩阵包括向量和方阵,其中向量包括空间向量和四元数。一个矩阵可被映
射到另一个矩阵、用某个元素来填充、转置和进行常见的数学运算。Kuiper 原先用
CwMtx 来模拟用离散的交互式状态机器构建的系统。除了必须的矩阵类,还有四元
数类。对于明显问题的回答是,仅当 q = r + xi + yi + zi 时 q 才是四元数,其
中 r 是实数,i 是 -1 的平方根,x、y 和 z 是复数。四元数可能把三维旋转的概
念推广到四维(请参阅参考资料,其中有四元数的参考资料的链接)。
CwMtx 没有内置的随机数生成器,也没有用随机元素填充矩阵的类函数。但是,它是
免费的且它的发布受 GNU LGPL 许可证的保护,所以如果您愿意的话,您有创建这些
(生成器和类函数)的自由。如果仅仅是用随机元素填充矩阵,那么以下代码是不错
的和容易的选择。
清单 3. 用随机元素填充矩阵
#include <stdlib.h>
...
void random_fill( CWMatrix &M )
{
int SIZE = M.GetRows() ;
for ( int r=0; r<SIZE; r++ ) for ( int c=0; c<SIZE; c++ ) { M[r][c]= drand48
(); }
}
表 1. 在不同平台上的 Blitz 性能
平台 编译器 高速缓存外 高速缓存内
HPC-160 KAI C++ 100.2% 97.5%
Pentium II egcs 98.4% 79.6%
Cray T3E KAI C++ 95.7% 98.1%
Origin 2000 KAI C++ 88.1% 79.8%
Blitz 带有一本手册,格式是 HTML 和 Postscript,但不幸的是没有教程。然而,
有不少说明性的代码,从中可以了解 Blitz 语法的细微差别。类的参考资料提供通
常的信息。还有几个有用的邮件列表,已被归档,可供搜索(请参阅参考资料)。
清单 6. 第 1 个任务
For ( d=2; d<7; d++)
Construct 3 dxd matrices: A, B, C
Start Clock: Do the following one million times:
Fill A and B with 1.0s
Let C = A + B
Stop clock: Report elapsed time in seconds.
清单 7. 第 2 个任务
For ( d=2; d<7; d++)
Construct 3 dxd matrices: A, B, C
Start Clock: Do the following one million times:
Fill A and B with random doubles (using library RNG, if any)
Let C = A + B
Stop clock: Report elapsed time in seconds.
清单 8. 第 3 个任务
For ( d=2; d<7; d++)
Construct 3 dxd matrices: A, B, C
Start Clock: Do the following one million times:
Fill A and B with random doubles (using shared RNG)
Let C = A + B
Stop clock: Report elapsed time in seconds.
在 Red Hat Linux 7.1 上安装和编译
为了您的方便,以下列出的是安装和编译这三个库的注解。下载的链接可在参考资料
中找到。
清单 9. Blitz
tar zxf blitz-0.5beta3.tar.gz
cd blitz-0.5beta3
./configure --with-cxx=gcc
make all
cp -a blitz/ /usr/local/include/ ( or whatever you wish )
cp -a lib/ /usr/local/include/blitz/
Compile with: g++ -O2 pgm.cpp -o pgm
清单 10. Meschach
unzip -q mesch12b.zip -d mesch12b
cd mesch12b
./configure
make basic
mkdir /usr/local/include/meschach ( or whatever you wish )
cp *.h meschach.a /usr/local/include/meschach/
Compile with: gcc -O2 pgm.c /usr/local/include/meschach/meschach.a -o pgm
清单 11. CwMtx
tar zxf cwmtx-0.3.0.tar.gz
cd cwmtx-0.3.0
Open Makefile, and set INSTALL_DIR to /usr/local/include/cwmtx ( or whatever
you wish )
Execute: make install
Compile with: g++ -O2 pgm.cpp -o pgm