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”,其中包括不少有益的线索。
矩阵可被容易地发送到文件或标准输出。Meschach 能计算快速傅立叶变换(Fast Fourier Transform)、提取列和行以及计算对称矩阵的特征值。您可以在矩阵中填充随机整数和复数。信不信由您,该库甚至还有矩阵相加的工具。Meschach 有一个返回在 [0,1) 之间的随机双精度数的函数,它是 Meschach 的一个特色,可用于简化明显的踏脚石程序的编写。虽然 Meschach 有一个用 1.0 填充矩阵的函数,但不幸的是,它没有用一个任意的双精度数填充矩阵的函数,也没有用随机双精度数填充矩阵的函数。不过,添加它们是容易的。
meschach安装
第一步:下载meschach12.b,具体地址见:http://homepage.math.uiowa.edu/~dstewart/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/
第三步:编译命令:
gcc -g m_test.c -I/usr/local/include/meschach/ /usr/local/include/meschach/meschach.a -o m_test
其中m_test.c代码如下。编译成功,用GDB调试,P A->me[1][1]查看矩阵A对应位置的值。
1 #include <stdio.h> 2 #include <math.h> 3 #include "matrix2.h" 4 #include "matlab.h" 5 void main() 6 { 7 8 MAT *A = MNULL, *B = MNULL, *C = MNULL; 9 A = m_get(8,5); 10 B = m_get(3,9); 11 C = m_get(8,5); 12 m_rand(A); 13 m_rand(B); 14 C = m_copy(A,C); 15 }
编译可能出现的问题:
1.解压meschach12.b后,直接运行sudo ./configure 出现如下错误:
/bin/sh^M:损坏的解释器: 没有那个文件或目录
解决方案:
脚本文件保存时使用了DOS格式,用DOS2UNIX转为UNIX格式,也可以用vim打开,用:set ff=unix转换,不要在 Windows下编辑脚本文件,否则经常会遇到这种问题。
sed -i 's/\r$//' server.sh
还可以用 vim 打开文件,然后执行冒号命令:
:wq
configure error no acceptable cc found in $path
解决方案:
sudo env CC=/usr/bin/gcc ./configure
解决方案:
这种情况发生的原因是因为你所处理的文件换行符是dos格式的"\r\n"
可以使用cat -v 文件名 来查看换行符是否是,如果是上述的,则行结尾会是^m
需要转换成linux/unix格式的"\n"
具体转换办法就是转换换行符
可以用sed命令处理一下文件,命令如下:
sed 's/\r//' 原文件 >转换后文件