【轉】mathnet 使用方法介紹

來源:互聯網
上載者:User

標籤:poi   strong   article   個數   point   .net   matrix   線性   test   

轉載自:http://blog.csdn.net/c914620529/article/details/50393223

在C#中使用mathnet,需要利用using引入相關類

矩陣運算的相關類:

using MathNet.Numerics.LinearAlgebra.Double;

using MathNet.Numerics.LinearAlgebra.Generic;(v3.4.0中沒有)

  1. 矩陣定義和初始化

       常用矩陣初始化函數:

        var matrix2 = new DenseMatrix(3);  //3維方陣

        var matrix3 = new DenseMatrix(2, 3); //2×3矩陣

         var matrix4 = new DenseMatrix(2, 3, 3.0); //2×3矩陣,所有值為3.0

         var matrixI = DenseMatrix.Identity(5); //5維單位矩陣

       矩陣操作和C#中的數組操作一致,matrix2[m,n]取其m行n列上的值或對其賦值

 

         MathNet中重載了.ToString()函數,可以直接用matrix.ToString()輸出整個數組,大大方便了調試和儲存資料。

      也可以利用C#中的double[,]直接建立

         double[,] d_matrix = new double[2,3];

 var matrix2 = new DenseMatrix(d_matrix); //2×3矩陣

        小記:我曾做過測試,將double[,]先轉成Math矩陣,然後進行矩陣運算,再利用matrix2.ToArray()將Math矩陣轉換成double[,],其運算時間和直接利用C#編寫的矩陣運算相差很小。

 但如果是利用for迴圈將double數組的數值賦值給Math矩陣進行矩陣運算,然後再利用for迴圈將Math矩陣賦值給某個double[,]數組,其運算時間可以減少1/3。在開發效率和運算效率上,使用的時候可以根據需要進行取捨。

 

2.矩陣操作

     矩陣操作最常用的莫過於從一個矩陣中取值

            var submatrix = matrix.SubMatrix(2, 2, 3, 3); //取從第二行開始的2行,第三列開始的三列 子矩陣

            var row = matrix.Row(5, 3, 4); //取從第5行第3列開始的4個行元素

            var column = matrix.Column(2, 6, 3); //取從第2列第6行開始的3個列元素

             matrix.ColumnEnumerator(2, 4) //取從第2列開始的4列

             matrix.RowEnumerator(4, 3)//取從第4行開始的3行

            matrix.ToRowWiseArray()/matrix.ToColumnWiseArray() //矩陣變為行向量或者列向量

           matrix.Diagonal()//取矩陣的對角線元素向量

     向矩陣中插值

          var result = matrix.InsertColumn(3, vector)/matrix.InsertRow(3, vector);//將向量vector插入到指定的行/列,原有的行列順延

           matrix.SetColumn(2, (Vector)vector);/matrix.SetRow(3, (double[])vector);  //用vector替換指定的行/列

     matrix.SetSubMatrix(1, 3, 1, 3, DenseMatrix.Identity(3)); //用矩陣替換指定位置的塊矩陣

          matrix.SetDiagonal(new[] { 5.0, 4.0, 3.0, 2.0, 1.0 });  //替換矩陣的對角線元素

          matrixA.Append(matrixB,result)/matrixA.Stack(matrixB,result) //將matrixB擴充到matrixA的右方/上方,將結果儲存在result中

    矩陣轉換:   

           var permutations = new Permutation(new[] { 0, 1, 3, 2, 4 });

    matrix.PermuteRows(permutations);   //互換矩陣的3,4行

 

            permutations = new Permutation(new[] { 1, 0, 4, 3, 2 });

            matrix.PermuteColumns(permutations);  //互換矩陣的1,2列,3,5列。

            可以看出,互換是由Permutation中的數字序號決定的。

 

 

 

 

1.矩陣運算

            matrixA = 3.0 * matrixB    //數乘

            matrixA = vector * matrixB  /matrixA =  matrixB * vector  //向量乘

            matrixC = matrixA + / - / * matrixB   //矩陣加、減、乘

            resultM = (DenseMatrix)matrixA.PointwiseDivide(matrixB); //點乘

           上述所有運算子都有對應的函數,也可是利用函數進行運算,如“+”可以寫成   matrixC = (DenseMatrix)matrixA.Add(matrixB);或者matrixA.Add(matrixB, matrixC);

            matrixB = matrixA.Inverse()/Transpose()  //求逆和轉置

2.求解線性方程組

            對於一階線性方程組

     5*x + 2*y - 4*z = -7

             3*x - 7*y + 6*z = 38

             4*x + 1*y + 5*z = 43

             可以如下求解:

              var matrixA = new DenseMatrix(new[,] { { 5.00, 2.00, -4.00 }, { 3.00, -7.00, 6.00 }, { 4.00, 1.00, 5.00 } });

              需要改為下面的寫法才行:

              var matrixA = DenseMatrix.OfArray(new double[,] { { 5.00, 2.00, -4.00 }, { 3.00, -7.00, 6.00 }, { 4.00, 1.00, 5.00 } });

              var vectorB = new DenseVector(new[] { -7.0, 38.0, 43.0 });

 

               var resultX = matrixA.LU().Solve(vectorB);

或者

              resultX = matrixA.QR().Solve(vectorB);

或者

              matrixA.Svd(true).Solve(vectorB, resultX);

或者

              matrixA.GramSchmidt().Solve(vectorB, resultX);

3.矩陣秩、行列式、trace和範數

         matrix.Determinant()/Rank()/ConditionNumber()/Trace()   //行列式/秩/條件數/trace

        matrix.L1Norm()/L2Norm()/FrobeniusNorm()/InfinityNorm()   //範數

【轉】mathnet 使用方法介紹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.