第2章 IT++基本库

2.1 IT++数据类型

Itbase库是IT++的核心,它包含标量、矢量、矩阵的相关类和数学函数。程序在使用这些数据类型时,需在程序中添加头文件“#include <itpp/itbase.h>”。

2.1.1 预定义标量类型

IT++除具有标准C++的数据类型(如符号型、整型、浮点型等)外,还增加了下面两种数据类型。

(1)complex<double> 。complex<double>是实部和虚部都为double类型的complex类型(复数类型)。

(2)bin。bin可以定义二进制数据类型。例如

bin  b;
b=randb();

2.1.2 预定义矢量类型

1.矢量数据类

原则上,一个矢量(向量)可以是任意类型的(支持加、减、乘、除)。虽然普通矢量类vec<TYPE>是模板化的,但经常使用的一些矢量类还是可以预先定义的。预定义的矢量类有以下几种形式。

(1)vec:基本的矢量类,定义一个双精度矢量对象。例如

vec  a = "0 0.7 5 9.3";  //定义基本矢量对象a及其初始化值为a = [0 0.7 5 9.3]

(2)cvec:复数矢量类,定义一个double类型的complex类(复数类)矢量对象。

(3)ivec:整型矢量类,定义一个整型矢量对象。例如

ivec b = "0:5";  // 定义整型矢量对象b及其初始化值为 b = [0 1 2 3 4 5]

(4)bvec:二进制矢量类,定义一个二进制矢量对象。例如

bvec bin_list="1 0 1 1 1 0 0 0 0"; //定义二进制矢量对象bin_list并将其初始化

(5)svec:短整型矢量类,定义一个短整型的矢量对象,即初始化对象数据的范围为-32768~32767。

通过普通矢量类可以预定义上面各矢量类。而类vec就表示vec< double >。当定义一个矢量对象时,建议用预定义的矢量类代替vec<TYPE>。

2.矢量对象的定义

前面已经提到,IT++中可以将已预定义了的矢量类直接调用来定义一个对象。例如

vec my_vector;                       //定义基本矢量对象my_vector
ivec b;                              //定义整型矢量对象 b
vec my_vector(10);                   //定义包含10个元素的整型对象数组

或者

my_vector.set_size(10,false); //false表示原先的数据并未被复制到新的对象中

3.矢量对象的操作

(1)调用成员函数clear()或zeros()可以清空一个矢量对象。例如

my_vector.clear();
my_vector.zeros();      //两条语句都是清空矢量对象my_vector中的数据

(2)调用成员函数ones()可把矢量对象中的数据全部置1。例如

my_vector.ones();       //矢量对象my_vector的数据全部置1

(3)矢量对象的长度,可以用三条同等功能的语句表示。例如

//调用成员函数length()获取my_vector的长度并赋值
length_of_vector = my_vector.length();
//调用成员函数size()获取my_vector的长度并赋值
length_of_vector = my_vector.size();
//直接用length()函数获取my_vector的长度并赋值
length_of_vector = length(my_vector);

矢量对象的赋值,下面列出了几种常用矢量对象赋值的方法。

vec  a = "1 0.02 4.46 5.26";             //基本矢量对象 a = [1  0.02  4.46   5.26]
vec  b; b= "3:2.5:13";                 //基本矢量对象b= [3  5.5  8  10.5   13]
vec  c=("1.2,3.4,5.6");                //基本矢量对象 c = [1.2   3.4  5.6]
vec d;d.set("1.0  2.0   3.0  4.0");     //基本矢量对象d = [1.0        2.0  3.0  4.0]
vec e;e= d;                             //基本矢量对象d的值赋给e
ivec  f = "1:6";                        //整数矢量对象f = [1   2  3  4  5  6]

(4)矢量对象中元素的引用。矢量对象中的各元素之间用逗号或者空格隔开。与C语言中的数组类型一样,矢量对象中的元素也是从下标0开始,如a(0)表示矢量对象a的第一个元素。矢量对象中单个元素的引用方式为

a(i) = 3.14;
double p = a(i);

由于在矢量类中的公共部分定义了left()、right()和mid()等成员函数,这样就可以直接调用这些成员函数来对矢量对象某部分元素进行操作。例如

a.left(4);                 //取矢量对象a中的前4个元素
a.right(3);                //取矢量对象a中的后3个元素
a.mid(1,3);                //取矢量对象a中从a(1)开始的连续3个元素
a(2,7);                    //取矢量对象a中a(2) 到a(7)的所有元素
a(2,-1);                    //从a(2)到结束的所有元素。

当然,也可以运用get()函数来代替()操作。例如

a.get(4);
a.get(2, -1);

4.例子

源代码:

#include <itpp/itbase.h>
using namespace itpp;
//These lines are needed for use of cout and endl
using std::cout;
using std::endl;
int main()
{
  //Declare vectors and matricies:
  vec a, b, c;
  mat A, B;
  //Use the function linspace to define a vector:
  a = linspace(1.0, 2.0, 10);
  //Use a string of values to define a vector:
  b = "0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0";
  //Add two vectors:
  c = a + b;
  //Print results:
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  cout << "c = " << c << endl;
  //Use a string to define a matrix:
  A = "1.0 2.0;3.0 4.0";
  //Print results:
  cout << "A = " << A << endl;
  //Exit program:
  return 0;
}

2.1.3 预定义矩阵类型

通常矩阵类型的定义为mat<TYPE>。IT++中预定义的矩阵类有以下几种形式。

● mat:基本矩阵类,定义一个双精度矩阵对象。

● cmat:复数矩阵类,定义一个复数矩阵对象。

● imat:整型矩阵类,定义一个整型的矩阵对象。

● bmat:二进制矩阵类,定义一个二进制矩阵对象。

● smat:短整型矩阵类,定义一个短整型矩阵对象。