C++——Newmat-指北

背景

该软件包适用于需要使用标准矩阵运算来处理各种类型矩阵的科学家和工程师。重点在于统计计算所需的运算类型,例如最小二乘法,线性方程求解和特征值。

本人在做GNSS开发过程中,使用的三方矩阵库为Newmat和Eigen,其中Newmat因为使用的人较少,比较小众,网络上能找到的简单介绍更是基本上没有。因此在这里对Newmat矩阵库做一个简单的介绍。

更多用法还是要看官方文档:

官方文档

支持的矩阵类型

Matrix 矩阵
Matrix 矩形矩阵
UpperTriangularMatrix 上三角矩阵
LowerTriangularMatrix 下三角矩阵
DiagonalMatrix 对角矩阵
SymmetricMatrix 对称矩阵
BandMatrix 带矩阵
UpperBandMatrix 上三角带矩阵
LowerBandMatrix 下三角带矩阵
SymmetricBandMatrix 对称带矩阵
RowVector 行矩阵
ColumnVector 列矩阵
IdentityMatrix 具有相同值的对角矩阵

仅支持一种元素类型(浮点型或双精度型)。

该软件包包括以下运算符*+-,Kronecker乘积,Schur乘积,级联,逆,转置,类型之间的转换,子矩阵,行列式,Cholesky分解,QR分解,奇异值分解,对称矩阵的特征值,排序,快速傅里叶变换,矩阵打印接口。

它适用于矩阵范围为10 x 10到您的机器将在单个阵列中容纳的最大尺寸的矩阵。数组中的元素数量不能超过int的最大大小。该软件包适用于很小的矩阵,但效率很低。某些分解函数尚未(尚未)针对分页内存进行优化,因此在与非常大的矩阵一起使用时效率低下。

构造矩阵

构造方m*n的矩阵

Matrix A(m,n);

构造方阵:

UpperTriangularMatrix UT(n);
LowerTriangularMatrix LT(n);
SymmetricMatrix S(n);
DiagonalMatrix D(n);

构造行矩阵和列矩阵

RowVector RV(n);
ColumnVector CV(n);

矩阵的初始化

 Matrix A(m, n); A = 0.0;

获取矩阵的值

A(i,j);
A.element(i,j);

矩阵的赋值和拷贝("=“或者”<<")

方法一:

A = B;  A = L;  A = L * U;

方法二:

SymmetricMatrix S; Matrix A;
......
S << A.t() * A;

注意:不能在构造矩阵的同时使用"<<"操作符来给矩阵赋值,如:

SymmetricMatrix S << A.t() * A;           // error

方法三:

拷贝矩阵到一个新的矩阵

A.Inject(D);

方法四:

将矩阵中所有值都设成同一个值可以使用如下方法:

Real r; int m,n;
......
Matrix A(m,n); A = r;

方法五:

还可以用如下方式给矩阵赋值

Matrix A(3,2);
Real a[] = { 11,12,21,22,31,33 };
A << a;
Matrix A(3,2);
A.Row(1) << 11 << 12;
A.Row(2) << 21 << 22;
A.Row(3) << 31 << 32;
SymmetricMatrix S(2);
S.Row(1) << 11;
S.Row(2) << 21 << 22;

矩阵的一元运算符

X = -A;           // change sign of elements
X = A.t();        // transpose
X = A.i();        // inverse (of square matrix A)
X = A.Reverse();  // reverse order of elements of vector
                  // or matrix (not band matrix)

矩阵的二元运算符

X = A + B;       // matrix addition
X = A - B;       // matrix subtraction
X = A * B;       // matrix multiplication
X = A.i() * B;   // equation solve (square matrix A)
X = A | B;       // concatenate horizontally (concatenate the rows)
X = A & B;       // concatenate vertically (concatenate the columns)
X = SP(A, B);    // elementwise product of A and B (Schur product)
X = KP(A, B);    // Kronecker product of A and B
bool b = A == B; // test whether A and B are equal
bool b = A != B; // ! (A == B)
A += B;          // A = A + B;
A -= B;          // A = A - B;
A *= B;          // A = A * B;
A |= B;          // A = A | B;
A &= B;          // A = A & B;
<, >, <=, >=     // included for compatibility with STL - see note

矩阵的一些最大值最小值统计

int i, j;
Real mv = A.MaximumAbsoluteValue();    // maximum of absolute values
Real mv = A.MinimumAbsoluteValue();    // minimum of absolute values
Real mv = A.Maximum();                 // maximum value
Real mv = A.Minimum();                 // minimum value
Real mv = A.MaximumAbsoluteValue1(i);  // maximum of absolute values
Real mv = A.MinimumAbsoluteValue1(i);  // minimum of absolute values
Real mv = A.Maximum1(i);               // maximum value
Real mv = A.Minimum1(i);               // minimum value
Real mv = A.MaximumAbsoluteValue2(i,j);// maximum of absolute values
Real mv = A.MinimumAbsoluteValue2(i,j);// minimum of absolute values
Real mv = A.Maximum2(i,j);             // maximum value
Real mv = A.Minimum2(i,j);             // minimum value

矩阵的一些标量数值计算

Real r = A.AsScalar();                 // value of 1x1 matrix
Real ssq = A.SumSquare();              // sum of squares of elements
Real sav = A.SumAbsoluteValue();       // sum of absolute values
Real s = A.Sum();                      // sum of values
Real norm = A.Norm1();                 // maximum of sum of absolute
                                          values of elements of a column
Real norm = A.NormInfinity();          // maximum of sum of absolute
                                          values of elements of a row
Real norm = A.NormFrobenius();         // square root of sum of squares
                                       // of the elements
Real t = A.Trace();                    // trace
Real d = A.Determinant();              // determinant
LogAndSign ld = A.LogDeterminant();    // log of determinant
bool z = A.IsZero();                   // test all elements zero
bool s = A.IsSingular();               // A is a CroutMatrix or
                                          BandLUMatrix
Real s = DotProduct(A, B);             // dot product of A and B
                                           // interpreted as vectors

改变矩阵的维数和矩阵的类型

A.ReSize(nrows,ncols);        // for type Matrix or nricMatrix
A.ReSize(n);                  // for all other types, except Band
A.ReSize(n,lower,upper);      // for BandMatrix
A.ReSize(n,lower);            // for LowerBandMatrix
A.ReSize(n,upper);            // for UpperBandMatrix
A.ReSize(n,lower);            // for SymmetricBandMatrix
A.ReSize(B);                  // set dims to those of B 

A.AsRow()
A.AsColumn()
A.AsDiagonal()
A.AsMatrix(nrows,ncols)
A.AsScalar()

内存管理

以下两种方式可以释放矩阵内存,对于结构体请使用A.Release()方法,对于指针请使用m_ReleaseAndDelete()方法。

上一篇:协整关系(cointegration)和配对交易


下一篇:Linux更改文件名