C++——Newmat-指北

1 篇文章 0 订阅

背景

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

本人在做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()方法。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值