前言
转载至:https://blog.csdn.net/c914620529/article/details/50393223
本人在学习过程中发现,随着MathNet的版本更新,很多代码已经失效了,或者是换了个名字,因此写下笔记供大家分享
注意下面大部分代码已经经过验证,可以运行
可能会更新下去?
一、安装方法
直接输入安装
PS:该安装方法只适用于当前项目,也就是说创建了新的项目,还需再次安装
Install-Package MathNet.Numerics
二、学习笔记
1.矩阵的定义和初始化
//3维方阵
var matrix2 = new DenseMatrix(3);
//2*3矩阵
var matrix3 = new DenseMatrix(2, 3);
//5维单位矩阵
var matrixI = DenseMatrix.CreateIdentity(5);
richTextBox1.AppendText(matrixI.ToMatrixString());//直接输出矩阵
richTextBox1.AppendText(matrixI.ToString());//在矩阵输出之前会有一段描述
//可以利用C#中的double[,]创建=====》对应着下图1
double[,] d_matrix =
{
{11,12,13,14,15,16 },
{21,22,23,24,25,26 },
{31,32,33,34,35,36 },
{41,42,43,44,45,46 },
{51,52,53,54,55,56 },
{61,62,63,64,65,66 }
};
var matrix1 = DenseMatrix.OfArray(d_matrix);
richTextBox1.AppendText(matrix1.ToString());
2.矩阵操作
//取第2行开始的2行,第3列开始的3列子矩阵
var m0 = matrix.SubMatrix(2, 2, 3, 3);
//取从第2行第3列开始的3个行元素
var row = matrix.Row(2, 3, 3);
//取从第2列第3行开始的3个列元素
var col = matrix.Column(2, 3, 3);
//取矩阵的对角线元素向量
var m4 = matrix.Diagonal();
double[] d_vector = { 0, 0, 0, 0, 0, 0};
var vector = new DenseVector(d_vector);
//将向量vector插入到指定的行 / 列,原有的行列顺延
var result = matrix.InsertColumn(3, vector);
var result = matrix.InsertRow(3, vector);
PS:插入的向量长度必须和矩阵的行数或列数一样
//用vector替换指定的行 / 列
matrix.SetColumn(2, (Vector)vector);
matrix.SetRow(3, (double[])vector);
//用矩阵替换指定位置的块矩阵
matrix.SetSubMatrix(1, 3, 1, 3, DenseMatrix.CreateIdentity(3));
//替换矩阵的对角线元素
matrix.SetDiagonal(new[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 });
//将matrixB扩展到matrix的右方 / 上方,将结果保存在result中
matrix.Append(matrixB, result);
matrix.Stack(matrixB, result);
PS:矩阵的大小必须严格设置,matrixB的行数或列数必须和matrix的也一样
//互换矩阵的3,4行
var permutations = new MathNet.Numerics.Permutation(new[] { 0, 1, 3, 2, 4,5 });
matrix.PermuteRows(permutations);
//互换矩阵的1、2列,3、5列
var permutations = new MathNet.Numerics.Permutation(new[] { 1, 0, 4, 3, 2, 5 });
matrix.PermuteColumns(permutations);
3.矩阵的运算
//点乘
var result = mA.PointwiseMultiply(mB);
//求逆
var mB = mA.Inverse();
//求解线性方程组,其中m1对应系数矩阵
var m = m1.LU().Solve(m2);
//PS:以下代码只作记录,还未验证!
//行列式
var m = m1.Determinant()
//秩
var m = m1.Rank();
//条件数
var m = m1.ConditionNumber();
//Trace
var m = m1.Trace();
//范数
var m = m1.L1Norm()/L2Norm()/FrobeniusNorm()/InfinityNorm();