C++矩陣庫-newmat10d簡單使用

        之前寫過關於投影原理的文章,就想着要自己實現一個簡單的GIS座標系模塊,基礎框架式搭建起來了,現在涉及具體的算法了,我決定先寫地理座標轉換(七參數轉換),裏面涉及了矩陣的運算,也不知道能不能用一些簡單的方法避免,大學學那麼一點線性代數也早就還給老師了,就去找個開源的矩陣運算庫算了,於是就看到有網友推薦newmat10d這個庫。

         newmat10d官網地址:http://www.robertnz.net/

        下載的是源碼,反正本人是沒有找到dll和lib的下載,雖然我不懂makefile那一套東西,不過沒關係,反正源碼文件也就那麼幾個索性就用VS新建了一個空的dll工程,加載了源碼編譯了一個dll和源碼,編譯倒是很順利,直接把一些測試代碼去掉就可以編譯成功了。。。

有了dll、lib和頭文件,就可以直接使用了,由於本人也是第一次使用,沒有深入去研究(主要參考官方文檔來學習http://www.robertnz.net/nm10.htm#refer),本人水平所限,難免有一些問題和疏漏,也希望大家指正。

 

一、支持的矩陣類型

Matrix 矩陣
nricMatrix  
UpperTriangularMatrix 上三角矩陣
LowerTriangularMatrix 下三角矩陣
DiagonalMatrix 對角矩陣
SymmetricMatrix 對稱矩陣
BandMatrix 帶狀矩陣(我也不懂這個叫什麼)
UpperBandMatrix  
LowerBandMatrix  
SymmetricBandMatrix  
RowVector 行矩陣
ColumnVector 列矩陣
IdentityMatrix 具有相同值的對角矩陣

二、構造矩陣

       (1)構造方m*n的矩陣:Matrix A(m,n);

       (2)構造方陣:

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

    

        (3)構造帶狀矩陣,需要傳入帶寬信息

     BandMatrix BM(n, lower, upper);
    UpperBandMatrix UB(n, upper);
    LowerBandMatrix LB(n, lower);
    SymmetricBandMatrix SB(n, lower);

 

       (4)構造行矩陣和列矩陣

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

 

       (5)矩陣的初始化

    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 << 11 << 12
      << 21 << 22
      << 31 << 32;

    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 notes

六、矩陣的一些最大值最小值統計

    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()方法。

再次申明,本人菜鳥,今天晚上才接觸這個庫,主要也是爲了先從整體上對newmat10d庫有一個瞭解,誤人子弟了先說抱歉。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章