之前寫過關於投影原理的文章,就想着要自己實現一個簡單的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庫有一個瞭解,誤人子弟了先說抱歉。