Blitz++与MTL两大数值计算程序库(C++)的简介

Blitz++ 与 MTL 都是基于 C++ template 高效数值计算程序库,不过他们专注于不同的方向。

Blitz++ 提供了一个 N 维( 1—10 )的 Array 类 , 这个 Array 类以 reference counting 技术实现,支持任意的存储序 (row-major 的 C-style 数组, column-major的 Fortran-style 数组 ) ,数组的切割 (slicing), 子数组的提取 (subarray), 灵活的 Array 相关表达式处理。另外提供了可以产生不同分布的随机数 (F,Beta,Chi-Square ,正态,均匀分布等 ) 的类也是很有特色的。

MTL 专注于线性代数相关的计算任务,如各种形式矩阵的生成 ( 对角,共轭,稀疏,对称等 ) ,相关的计算,变换,以及与一维向量的运算。

两个程序库对于从 Matlab 导入导出数据都有不错的支持。

本文主要介绍如何在 Visual C++7.1 编译器下运用这两个程序库。

以前的 VC6 编译器由于对 ISO C++98 标准的支持不够,特别是在 template 方面,以至于很难编译这种完全用 template 技术构造起来的程序库。 Blitz++ 是完全不支持 VC6 的。

到了 VC7.1 ,由于对于 ISO 标准的支持达到了 98% ,使得我们可以很轻松的编译使用这两个程序库。

不过这两个程序库的文档不是那么友好,特别是 MTL ,仅仅提供了类似于 reference 的文档,对于具体的使用方法则不作介绍。 Blitz++ 相对来说好一些,还提供一份介绍性的入门文档 。所以使用这两个程序库阅读其源代码往往是必要的。当然了,两个程序库都是 template 代码,源代码必定是全开放的。

先来介绍一下配置吧 。

1,  Blitz++, 目前最高版本是 0.7 , Blitz++ 已经成为 SourceForge 的项目了,所以可以在 SourceForge.net 下载到。下载后解压缩,你会看到 \Blitz++-0.7\blitz和 \Blitz++-0.7\random 两个文件夹,这是 blitz 的源代码所在处。 \Blitz++-0.7\manual 是文档所在文件夹。\Blitz++-0.7\benchmarks,\Blitz++-0.7\examples 和 \Blitz++-0.7\testsuite 中都有很多好的使用实例可供参考。

现在将 VC++ 的 IDE 的 Include 设置为 \Blitz++-0.7 ,因为 blitz 源码中都有这样形式的 #include ,#include 。或者就干脆把两个源码文件夹整个得 copy 到include 文件夹内。然后将 blitz 文件夹下的 config.h 改为其它名字,而将 config-VS.NET2003.h 的名字改为 config.h 。 OK, 现在你就可以编译所有的 testsuite和 benchmarks 了。

1,  MTL 的配置相对来说麻烦一点,现在 http://www.osl.iu.edu/research/mtl/ 这里下载一个 VC++7 的,不过还不能马上用。由于 VC++7.1 对标准的支持更近了一步,同时对于某些语法细节的检查更为严格 ( 主要是对于 typename 和 template partial specialization ),我们要对代码做一些小小地修改,特别是mtl/mtl_config.h 这个文件。有一些地方要加入 typename 。另外有两个模板偏特化的情况需要修改,加上 template <> 。在这里http://newsuppy.go.nease.net/mtl.zip 我提供了一个修改完成的版本,不过我不保证我的修改可能引入的新的 bugs ,所以请谨慎使用。 MTL 的内部使用一定数量的 STL 组件和算法。 MTL 的源代码都在 mtl 文件夹内,由于 mtl 内部的 include 都是 #include “…” 的形式,使用时把 mtl 文件夹复制到当前 project 下就可以。如果要设 VC++ 的 Include 目录,则应该先把所有的 #include “…” 改为 #include  <…> 这样的形式。

不过刚开始使用 MTL 还是有一些不太容易让人接受的地方。比如 mtl::matrix 这个模板类并不能够产生实际的矩阵对象,而要通过它的 type 成员产生一个对应模板参数的类型,再通过这个类型来实例化对象。

比如 typedef mtl::matrix< SPAN>, rectangle<>, dense<>, row_major >::type Matrix; Matrix A;

这里的 A 才是真正的矩阵对象,而 Matrix 则是一个元素为 float ,矩形,密集,行主 (C-style) 的矩阵类。

       下面我提供三个简单的入门例子解释 MTL 的使用。分别有矩阵的加法,乘法,转置,求逆以及一个线性方程组求解的例子。

       另外 mtl 的 test 和 contrib 文件夹下也有很多不错的示例代码可以查阅。

MTL 使用示例 1 ,矩阵的加法,乘法和转置。


 

#include

#include

#include "mtl/mtl.h"                                                                                       

#include

using namespace std;

using namespace mtl;

                                                                                                                          

template < class Matrix>

void print_matrix(Matrix& mat,const string& description)

{

       std::cout << description;

 

       std::cout <<'[';

       for (Matrix::iterator i = mat.begin(); i!=mat.end();++i)

       {

         for (Matrix::OneD::iterator j =(*i).begin(); j!=(*i).end();++j)

         {

                std::cout <<'\t'<<*j;

         }

 

         std::cout <<((i+1== mat.end())?"\t]\n":  "\n");

       }

}

 

int main(int argc,char* argv[])

{

  typedef matrix<float, rectangle<>, dense<>, row_major>::type Matrix;

 

  const Matrix::size_type MAX_ROW =3, MAX_COL =3;

 

  Matrix  A(MAX_ROW,MAX_COL),B(MAX_ROW,MAX_COL),C(MAX_ROW,MAX_COL);

 

  // fill Matrix A with the index syntax

  for (Matrix::size_type i=0; i<MAX_ROW;++i)

  {

         for (Matrix::size_type j=0; j<MAX_COL;++j)

         {

                A(i, j)= Matrix::value_type(rand()%50);

         }

  }

 

  // fill Matrix B with the iterator syntax

  for (Matrix::iterator i=B.begin(); i!=B.end();++i)

  {

         for (Matrix::OneD::iterator j=(*i).begin(); j!=(*i).end();++j)

         {

                *j = Matrix::value_type(rand()%50);

         }

  }

 

  print_matrix(A,"A=\n");

  print_matrix(B,"B=\n");

 

  // Matrix C = A + B

  add(A, C);

  add(B,C);

  print_matrix(C,"C = A + B  \n");

 

  // Matrix C = A * B^T,  B^T: transpose of B

  transpose(B);

  print_matrix(B,"B^T=\n");

  zero_matrix(C);        // because mult(A, B, C): C += A*B
  mult(A,B,C);

  print_matrix(C,"C = A * B^T\n");

  return 0 ;

}

 

2 ,下面是一个线性方程组的解法


#include

#include

#include

#include "mtl/mtl.h"

#include "mtl/lu.h"

#include

using namespace std;

using namespace mtl;

 

int main(int argc,char* argv[])

{

  typedef matrix<float, rectangle<>, dense<external>, row_major>::type Matrix;

  // dense : data copy from a float array,not generate them with yourself

 

  const Matrix::size_type MAX_ROW =3, MAX_COL =3;

 

  // solve the equation Ax=b

  // { 4x - y + z = 7

  //    4x - 8y + z= -21

  //   -2x + y + 5z = 15 }

  // A = [ 4 -1 1

  //          4 -8 1

  //          -2 1 5 ]

  // b = [7 - 21 15]^T

  float a[]={4.0f,-1.0f,1.0f,4.0f,-8.0f,1.0f,-2.0f,1.0f,5.0f};

  Matrix A(a, MAX_ROW, MAX_COL);

   

  typedef matrix<float, rectangle<>, dense<>, row_major>::type LUMatrix;

  LUMatrix LU(A.nrows(), A.ncols());

  mtl::copy(A, LU);

 

  typedef dense1D<float> Vector;

  Vector pvector(A.nrows());

  lu_factor(LU, pvector);

 

  Vector b(A.nrows()), x(A.nrows());

  b[0]=7.0f, b[1]=-21.0f, b[2]=15.0f;

  lu_solve(LU, pvector, b, x);

 

  for (Vector::iterator i=x.begin(); i!=x.end();++i)

         cout <<*i <<'\t';

 

  system("pause");

  return 0 ;

}

 

3 ,矩阵求逆


#include

#include

#include

#include "mtl/mtl.h"

#include "mtl/lu.h"

#include

using namespace std;

using namespace mtl;

 

template < class Matrix>

void print_matrix(Matrix& mat,const string& description)

{                                                                                            

       std::cout << description;

 

       std::cout <<'[';

       for (Matrix::iterator i = mat.begin(); i!=mat.end();++i)

       {

         for (Matrix::OneD::iterator j =(*i).begin(); j!=(*i).end();++j)

         {

                std::cout <<'\t'<<*j;

         }

 

         std::cout <<((i+1== mat.end())?"\t]\n":  "\n");

       }

}

 

int main(int argc,char* argv[])

{

  typedef matrix<float, rectangle<>, dense<external>, row_major>::type Matrix;

  // dense : data copy from a float array,not generate them with yourself

 

  const Matrix::size_type MAX_ROW =3, MAX_COL =3;

 

  // inverse matrix A

  // A = [ 4 -1 1

  //          4 -8 1

  //          -2 1 5 ]

  float a[]={4.0f,-1.0f,1.0f,4.0f,-8.0f,1.0f,-2.0f,1.0f,5.0f};

  Matrix A(a, MAX_ROW, MAX_COL);

   

  typedef matrix<float, rectangle<>, dense<>, row_major>::type CMatrix;

  CMatrix LU(A.nrows(), A.ncols());

  mtl::copy(A, LU);

 

  typedef dense1D<float> Vector;

  Vector pvector(A.nrows());

  lu_factor(LU, pvector);

 

  CMatrix InvA(A.nrows(), A.ncols());

  lu_inverse(LU, pvector, InvA);

 

  print_matrix(A,"A = \n");

  print_matrix(InvA,"A^(-1) = \n");

  system("pause");

  return 0 ;

}

 

时间: 2024-10-26 22:06:34

Blitz++与MTL两大数值计算程序库(C++)的简介的相关文章

Google+运营社交游戏的前两大开发商近日纷纷宣布,将撤出Google+

据国外媒体报道,人气惨淡的谷歌社交网络Google+日前再次遭遇重创,在Google+运营社交游戏的前两大开发商近日纷纷宣布,将撤出Google+. 这两家开发商分别是来自德国的PopCap和艺电下属的Wooga.去年八月,Google+发布游戏平台,这两家游戏开发商堪称加盟的知名度最大的企业.当时,PopCap的Blitz系列游戏,在Facebook获得1300万月活跃用户,Wooga的全部游戏用户则高达4010万. Wooga计划在Google+撤出全部游戏,包括<Monster World

两大步骤教您开启MySQL 数据库远程登陆帐号

在工作实践和学习中,如何开启 MySQL 数据库的远程登陆帐号算是一个难点的问题,以下内容便是在工作和实践中总结出来的两大步骤,能帮助DBA们顺利的完成开启 MySQL 数据库的远程登陆帐号. 1.确定服务器上的防火墙没有阻止 3306 端口 MySQL 默认的端口是 3306 ,需要确定防火墙没有阻止 3306 端口,否则远程是无法通过 3306 端口连接到 MySQL 的. 如果您在安装 MySQL 时指定了其他端口,请在防火墙中开启您指定的 MySQL 使用的端口号. 如果不知道怎样设置您

朱则荣:SEO市场成熟的两大标志

笔者日前与卓学研究院院长朱则荣先生就SEO市场未来发展面临的机遇与挑战问题进行了长达两个多小时的交流.朱院长认为SEO应该掀起一场革命,声势要浩大,参与的人要多,特别是在通过SEO帮助小型企业取得网上业务成功的问题上,要到达一种新的颠峰,有助于遍布世界各地的小型企业获得网上业务的勃勃生机. 他认为:SEO业还没有进入有序成熟的市场化环境,SEO市场的成熟有两大标志,一是小型企业对SEO业务的需求空前增长,给SEO从业者创造规模空前的机遇;二是在各小型企业经营发展领域的专业级市场上,SEO大有可为

浅析企业网站成功运营的两大核心:SEO优化和推广

现在很多企业网站,已经意识到,网站不是简单的用来向自己的用户展示,更多的是要发挥网站的功效,给自己企业带来更多的订单,这样企业网站的运营就要从被动转变成主动,要主动的把自己的网站营销出去,提升自己企业的品牌形象!从而获得更多客户的认可,于是就会给自己企业带来不错的订单! 这种想法算是比较进步的,但是在操作的过程中,往往走到了另一个误区,从原先只要搞个网站,在自己的名片上,能够印上网址就可以了,不管别人看不看,数年如一日的网站内容,开始转变成,在网站页面的美化上,无所不用其极.很多企业网站,竟然全

占用Windows 7系统内存的两大因素

Windows7系统用户在使用时会发现系统内存消耗很多,下面就让我们看看占用Windows7系统的两大因 素. 一.安装了腾讯QQ软件后删除来自 QQExternal.exe 这个文件.方法:任务管理器------进程- -----找到 QQExternal.exe 的进程-----右击打开文件位置-----回到任务管理器-----结束该进程---- 删除QQExternal.exe文件.禁止Windows7系统自动更新:禁用search功能:等等...... 二.关闭 缩略图显示 在Windo

H5两大门派七种玩法

  作为去年独领风骚的当红炸子鸡,H5经过一年的摸(ge)爬(zhong)滚(de)打(se),不仅没有过气,反而新招百出,玩出逆天新高度.TOP君一路追踪,拎出最酷炫的两大派别七种玩法,给您嘚啵嘚啵. 一.手机场景模拟派 首先登场的是手机场景模拟派.因为H5主要在移动端打开,所以涌现出了一大波"虚拟"手机功能的案例,企图以假乱真.具体玩法如下: 高逼格之手机场景模拟一:未接来电 早在两个月前,一个挑衅味十足的"这个陌生来电你敢接吗?"H5就曾让无数小伙伴大跌眼镜.

Win7系统“设备和打印机”两大功能作用

笔者趁着这次电器大促销的活动新买了一台SONY的数码相机,为此高兴了很久,才入手的时候拍得是乐此不疲.但是现在想将其与电脑链接后进行操作该怎么办呢?其实Win7系统中新增加的"设备和打印机"与"Device Stage"功能将彻底解决上面的问题,接下来就为您分别介绍一下Win7系统的"设备和打印机"两大功能作用. 首先讲一下"设备和打印机".在您单击打开Win7"开始"菜单后就可以看见"设备和打印

Windows 7系统下占用空间的两大因素

  Windows7系统用户在使用时会发现系统内存消耗很多,下面就让我们看看占用Windows7系统的两大因素. 一.关闭缩略图显示 在Windows7中有个动态图标的功能,可以把文件以图标的形式显示出来,如word文件就以文档的第一页为图标,视频文件就以第一帧画面为文件图标,很好看,也可以方便我们查找,但是也有缺点,因为系统为了文件的图标,要花费很多时间来生成每个文件的缩略图,而且还要自动保存它们,这样就会占用很多的硬盘空间和系统资源.如果你的电脑配置不是很好的话,那完全可以来关闭这个花俏的功

搜狗浏览器两大新功能体验

  随着WiFi的极速普及,以及4G网络的正式开启,手机上网已悄然迈进了一个崭新的时代.由于不再受到网络的束缚,人们可以随时随地畅享网络,游戏娱乐.新闻浏览.分享等.近日更新的搜狗浏览器加入了独有的"飞传"和"视频/小说嗅探"两大功能,并且支持多款主流浏览器跨屏使用.可以说在PC到移动端的分享方面令人眼前一亮,不妨让我们来抢先体验一下这两大新功能. ▲搜狗浏览器 一.视频/小说嗅探,精彩尽在掌握 除了不再局限于上网速度,智能手机目前正朝着大屏化发展,大屏旗舰手机屡见