本人写了一个airPLS的算法,用到大量的数组运算,由于以前是用for循环来解决数组计算,如果你的数组很大,那么整个算法跑下来非常消耗时间。解决办法是利用MathNet.Numerics,他的安装方法见博客,或者可以直接下载MathNet.Numerics.dll。
使用前先添加命名空间
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Generic;
var matrix1 = new DenseMatrix(4); //4维方阵
var matrix2 = new DenseMatrix(3, 4); //3×4矩阵
var matrix3 = new DenseMatrix(3, 4, 2); //3×4矩阵,所有值为3
var matrixI = DenseMatrix.Identity(90); //90维单位矩阵
double[,] matrix4 = new double[5,3];
var matrix5 = new DenseMatrix(matrix4); //5×3矩阵
matrix2.ToArray()//将Math矩阵转换成double[,]
var matrixw =new DenseVector(900);//定义一个900*1的列向量
1.矩阵运算
matrix.Diagonal()//取矩阵的对角线元素向量
matrix.SetDiagonal(new[] { 1,2,3,4,5,6 }); //替换矩阵的对角线元素
matrixB = matrixA.Inverse() //求逆
matrixB = matrixA.Transpose() //矩阵转置
matrixC = matrixA + matrixB //矩阵加
matrixC = matrixA - matrixB
matrixC = matrixA * matrixB
2.求解线性方程组
1xa + 5xb + 8xc = -3
-3xa - 7xb + 2xc = 4
2xa - 4xb - 1xc = 5
var matrixA = DenseMatrix.OfArray(new double[,] { { 1,5,8 }, { 3,-7,2 }, { 2,-4,-1 } });
var vectorB = new DenseVector(new[] { -3,4,5 });
var resultX = matrixA.LU().Solve(vectorB);//或者 resultX = matrixA.QR().Solve(vectorB);
更多矩阵的知识可以查看protear的博客。