c#Math
在C#中使用mathnet,需要利用using引入相關(guān)類 矩陣運算的相關(guān)類: using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Generic;
矩陣定義和初始化
?????? 常用矩陣初始化函數(shù): 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#中的數(shù)組操作一致,matrix2[m,n]取其m行n列上的值或?qū)ζ滟x值 MathNet中重載了.ToString()函數(shù),可以直接用matrix.ToString()輸出整個數(shù)組,大大方便了調(diào)試和保存數(shù)據(jù)。 也可以利用C#中的double[,]直接創(chuàng)建 double[,] d_matrix = new double[2,3]; var matrix2 = new DenseMatrix(d_matrix); //2×3矩陣 小記:我曾做過測試,將double[,]先轉(zhuǎn)成Math矩陣,然后進行矩陣運算,再利用matrix2.ToArray()將Math矩陣轉(zhuǎn)換成double[,],其運算時間和直接利用C#編寫的矩陣運算相差很小。 但如果是利用for循環(huán)將double數(shù)組的數(shù)值賦值給Math矩陣進行矩陣運算,然后再利用for循環(huán)將Math矩陣賦值給某個double[,]數(shù)組,其運算時間可以減少1/3。在開發(fā)效率和運算效率上,使用的時候可以根據(jù)需要進行取舍。 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() //矩陣變?yōu)樾邢蛄炕蛘吡邢蛄?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的右方/上方,將結(jié)果保存在result中 矩陣轉(zhuǎn)換:?? 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中的數(shù)字序號決定的。 1.矩陣運算 matrixA = 3.0 * matrixB??? //數(shù)乘 matrixA = vector * matrixB? /matrixA =? matrixB * vector? //向量乘 matrixC = matrixA + / - / * matrixB?? //矩陣加、減、乘 resultM = (DenseMatrix)matrixA.PointwiseDivide(matrixB); //點乘 上述所有運算符都有對應(yīng)的函數(shù),也可是利用函數(shù)進行運算,如“+”可以寫成?? matrixC = (DenseMatrix)matrixA.Add(matrixB);或者matrixA.Add(matrixB, matrixC); matrixB = matrixA.Inverse()/Transpose()? //求逆和轉(zhuǎn)置 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 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和范數(shù) matrix.Determinant()/Rank()/ConditionNumber()/Trace()?? //行列式/秩/條件數(shù)/trace matrix.L1Norm()/L2Norm()/FrobeniusNorm()/InfinityNorm()?? //范數(shù)
原文:https://blog.csdn.net/c914620529/article/details/50393223/
矩陣定義和初始化
?????? 常用矩陣初始化函數(shù): 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#中的數(shù)組操作一致,matrix2[m,n]取其m行n列上的值或?qū)ζ滟x值 MathNet中重載了.ToString()函數(shù),可以直接用matrix.ToString()輸出整個數(shù)組,大大方便了調(diào)試和保存數(shù)據(jù)。 也可以利用C#中的double[,]直接創(chuàng)建 double[,] d_matrix = new double[2,3]; var matrix2 = new DenseMatrix(d_matrix); //2×3矩陣 小記:我曾做過測試,將double[,]先轉(zhuǎn)成Math矩陣,然后進行矩陣運算,再利用matrix2.ToArray()將Math矩陣轉(zhuǎn)換成double[,],其運算時間和直接利用C#編寫的矩陣運算相差很小。 但如果是利用for循環(huán)將double數(shù)組的數(shù)值賦值給Math矩陣進行矩陣運算,然后再利用for循環(huán)將Math矩陣賦值給某個double[,]數(shù)組,其運算時間可以減少1/3。在開發(fā)效率和運算效率上,使用的時候可以根據(jù)需要進行取舍。 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() //矩陣變?yōu)樾邢蛄炕蛘吡邢蛄?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的右方/上方,將結(jié)果保存在result中 矩陣轉(zhuǎn)換:?? 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中的數(shù)字序號決定的。 1.矩陣運算 matrixA = 3.0 * matrixB??? //數(shù)乘 matrixA = vector * matrixB? /matrixA =? matrixB * vector? //向量乘 matrixC = matrixA + / - / * matrixB?? //矩陣加、減、乘 resultM = (DenseMatrix)matrixA.PointwiseDivide(matrixB); //點乘 上述所有運算符都有對應(yīng)的函數(shù),也可是利用函數(shù)進行運算,如“+”可以寫成?? matrixC = (DenseMatrix)matrixA.Add(matrixB);或者matrixA.Add(matrixB, matrixC); matrixB = matrixA.Inverse()/Transpose()? //求逆和轉(zhuǎn)置 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 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和范數(shù) matrix.Determinant()/Rank()/ConditionNumber()/Trace()?? //行列式/秩/條件數(shù)/trace matrix.L1Norm()/L2Norm()/FrobeniusNorm()/InfinityNorm()?? //范數(shù)
原文:https://blog.csdn.net/c914620529/article/details/50393223/
轉(zhuǎn)載于:https://www.cnblogs.com/AlenWu/p/11287169.html
總結(jié)
- 上一篇: 利用GBDT模型构造新特征具体方法
- 下一篇: 不要错过路边的的风景