@author:armylau
@date:2004-8-12
一.起因
安装和使用
blitz++
时经常遇到问
,
查看了
ccboy
写的《
VC++ _NET 2003
–安装和使用
Boost 1_30
和
Blitz++0_6
》,但他写的不详细
, Blitz
的官方文档也不清楚
,
只好自己来
,
花了不少时间才初步弄清楚。
二.
Blitz
简介
大家知道
Fortran
是公认的科学计算编程语言
,
大量数值计算库都是基于
fortran
的
,
如
lapack.
而
blitz++
则为科学计算人员提供了面向对象的
C++
的数值计算程序库
,
速度能与
fortran77/90
匹配
.
用过
matlab
的人知道
, matlab
是一种基于矩阵的第四代语言
,
它将每个变量都视作矩阵
,
赋值起来比起
c/c++/java
等主流语言起来非常方便
,
而
blitz++
也提供了这种矩阵的强大操作
,
而且性能比起
matlab
要快很多
,
这是因为两种的语言特性所决定的
.
Blitz++
最新的版本中提供了数组和向量
(
即矩阵
),
随机数产生器
,
小向量和矩阵
.
值得注意的是
,
与其它数值计算包相比较
, blitz
是非常有个性的
,
它不求高大全
,
如它并没有提供所有的矩阵操作功能
,
如求特征向量
,FFT
分析
等
.
它的特点在于面向对象、数组操作语法和模板操作(
But the main focus of blitz is on array syntax
and stencil operations
)
[4]
。矩阵操作功能,想起
STL
中的
VALARRY
了吗?
VALARRAY
中的功能这里都实现和加强了。这个在测试项目
MT1
中可以初步显示
.
三.安装与测试
1)
安装
Blitz++-0.7
通用代码
首先要安装最原始的代码包
,
源代码是跨平台的
,
只要
blitz
支持
.
在
http://www.oonumerics.org/blitz/
下只有
0.6
版本的
,
最新的版本是
0.7,
在
http://sourceforge.net/project/showfiles.php?group_id=63961 .
解压缩
,
如到
C:\vc\Blitz++-0.7\
2)
安装
Blitz-VS.NET1.5 -FOR vs.net2003
项目
如果想
blitz
能在
VS.net
下使用
,
就要定义相应的宏
,
使用相应的头文件
, lib
和
blitz++
提供的类就行
.
而宏定义
,Lib
的编译项目文件
,
这些工作
Julian Cummings
已经为我们做好
.
在
blitz++
的主页上查看
supported platforms,
看到
blitz for vs.net,
循提示去到
blitz
在
sourceforge
的
cvs
下查找
,
在
cvs
目录下
http://cvs.sourceforge.net/viewcvs.py/blitz/blitz ,
下载两个文件
:
Blitz-VS.NET.zip
和
README-VS.NET.txt,
我下载时的这两个文件的最新版本分别是
1.6
和
1.1
将
blitz-VS.NET zip
解压缩
,
它的主目录与
C:\vc\Blitz++-0.7
的相同
,
我们假设它为
C:\vc\Blitz-VS.NET1.6
,
目录结构如下
:
Blitz\
Blitz-Testsuite\
Blitz-Library.ncb
Blitz-Library.sln
Blitz-Library.suo
blitz\
里面是
config.h,
它定义了
blitz
相关的宏变量
,
如
BZ_HAVE_COMPLEX, BZ_HAVE_STL
等等
,
这是每个项目必须用到的
.
blitz
目录里面还有一个
VC
项目文件
,
这个项目是用来生成
blitz.lib
文件的, 稍后我们将提到如何设置生成。
3)
生成
blitz.lib
启动
vs.net2003,
设置
:
工具
->
选项
->
项目
->VC++
目录
,
在
”
包含文件
”
中添加
blitz-0.7
的路径
(
即
cl
中的
/I
参数
)
,如
C:\vc\blitz
。
下图为我的配置
使用
vs.net2003
打开为
C:\vc\Blitz-VS.NET1.6\blitz\
blitz.vcproj,
如上所述
,
我们正是用这个项目来产生
blitz.lib
的
.
它所使用的源文件就是
Blitz++-0.7\src\globals.cpp,
因为代码原作者为了保持代码的唯一份
,
所以没有包括到这个
for vs.net
的压缩包中
,
你要将原
Blitz++
目录下的
src
目录拷贝到这里
.
如将
C:\vc\Blitz++-0.7\src
拷贝到
C:\vc\Blitz-VS.NET1.6\src
编译生成
blitz.lib.
编译时会出现错误提示
,
如
error PRJ0019:
工具从
”copying blitz_d.lib..”
不必理会
,
这是
blitz
的
BUG,
在
DEBUG
或
release
目录下已经生成了我们所需的文件
,debug
版本的为
blitz_d.lib, release
版本的为
blitz.lib.
此时
,
为了以后的版本都能使用此
lib
文件
,
我们可以配置一下全局选项
:
首先在
\Blitz-VS.NET1.6\
下新建一
lib
目录
,
将
blitz.lib
和
blitz_d.lib
拷贝进去
.
在工具
->
选项
->
项目
->VC++
目录
->
库文件下添加我们
lib
的路径
4)
编译和测试
blitz-testsuit
用
vs.net2003
打开
Blitz-Library.sln,
里面包括了
54
个测试用例
.
将
Blitz++-0.7
下的
testsuite
目录拷贝到
Blitz-VS.NET1.6,
原因也是为了保持代码的唯一性
,
据作者所说
[4]
.
要确认这点
,
可以打开项目配置文件
vsproj,
用文本编辑器如
notepad
打开
,
查看
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
<File
RelativePath="..\..\testsuite\ctors.cpp">
</File>
</Filter>
</Files>
确定项目选项输入库为
blitz_d.lib
或
blitz.lib
编译
,
执行
.
1)
如测试
ABA1,
这是求数组的最大值的测试
源代码为
:
#include
BZ_USING_NAMESPACE(blitz)
int
main()
{
Array<double,1> psiElem(3);
psiElem =
-0.121990517304243,-0.099118834514638,-0.164750336116265;
double psi_max = blitz::max(psiElem);
cout << "psiElem = " << psiElem << endl;
cout << "psi_max = " << psi_max << endl;
}
结果为
:
psiElem = 3
[ -0.121991 -0.0991188 -0.16475 ]
psi_max = -0.0991188
2)
测试
MT1 –
主要测试矩阵赋值与操作语法
,index
的使用等等
.
源码
:
#include
BZ_USING_NAMESPACE(blitz)
#if
0
BZ_DECLARE_STENCIL2(kinEnergy,A,B)
B=Laplacian3D(A);
BZ_END_STENCIL_WITH_SHAPE(shape(-1,-1,-1),shape(1,1,1))
typedef
complex<double> T_num;
typedef
Array array3d;
int
main()
{
const
int N=5;
array3d A(N,N,N);
array3d B(N,N,N);
// Fill a three-dimensional array with a Gaussian function
firstIndex i;
secondIndex j;
thirdIndex k;
float midpoint = 15/2.;
float c = - 1/3.0;
A = exp(c * (sqr(i-midpoint) + sqr(j-midpoint)
+ sqr(k-midpoint)));
applyStencil(kinEnergy(), A, B);
Array out_view(B.data(),shape(N*N*N));
cout << out_view;
}
#endif
BZ_DECLARE_STENCIL2(footprint,A,B)
B = Laplacian2D4(A);
BZ_END_STENCIL_WITH_SHAPE(shape(-2,-2),shape(+2,+2))
int
main()
{
int N = 9;
Array<double,2> A(N,N), B(N,N);
A = 0;
A(4,4) = 1;
applyStencil(footprint(), A, B);
cout << B(Range(2,6),Range(2,6)) << endl;
}
结果为
:
5 x 5
[ 0 0 -1 0 0
0 0 16 0 0
-1 16 -60 16 -1
0 0 16 0 0
0 0 -1 0 0 ]
五.在自己的项目中使用
一个很简单的例子
,
新建个人项目后
,
注意以下几件事
:
1.
添加了
lib
或正确配置了
lib
的路径
:
将
blitz.lib
拷贝到项目下或在项目属性中配置好引用路径
.
2.
添加了
config.h,
将原来我们编译
blitz.lib
的宏定义文件拷贝过来
.
3.
使用了
using namespace blitz
4.
正确使用
blitz
的库对象
#include
"stdafx.h"
#include
"config.h"
#include
#include
using
namespace blitz;
int
main()
{
complex<int> c(4,8);
cout << c << endl;
Array<int,2> ar(2,2) ;
ar =1,1,
2,2;
cout << ar <
}
在编译时
,
各种配置都要非常小心
,
一不小心就会出错
,
按照以上的步骤一步一步来
,
应该不会有太大的错误
,
有任何问题或建议
,
可与我联系
armylau@163.com
六.参考文献:
1.
[blitz] blitz
官方主页,文档
2.
[IBM]
C
和
C++
的矩阵库-评估和比较
Meschach
、
Cooperware
矩阵和
Blitz.htm
http://www-900.ibm.com/developerWorks/cn/linux/other/matrix/index.shtml
3.
[ccboy] ccboy
写的
VC++ _NET 2003
–安装和使用
Boost 1_30
和
Blitz++0_6
4.
[Julian C.]emails
/File
/DIV>