今天学习了一下C# 里的 MathNet.Numerics库,和Python比较起来有点逊色,但是也不错了。
学习前查了一些资料,有些老的语法和函数已经用不了啦。总结了一些新的函数,记录一下。
//定义一个全局变量
public Matrix
1、创建一个25行3列的矩阵。
var rnd = new Random();
//随机生成75个浮点数,均值是50,方差是1,这75个数据成正态分布。
var list = Normal.Samples(rnd, 50, 1).Take(75).ToList();
//保留3位小数,保存为数组
var array = list.Select(p => Math.Floor(p * 1000) / 1000).ToArray();
//将数组生成25组,每组3个数的矩阵
Matrix = CreateMatrix.Dense(25, 3, array);
//保存为二维数组的形式 double[][]
var matrix = Matrix.ToRowArrays();
2、打印出来
foreach (var rows in Matrix.EnumerateRows())
{
Console.WriteLine(string.Join(" , ", rows));
}
//结果如下
51.378 , 49.966 , 49.076
49.207 , 50.864 , 49.327
49.454 , 51.334 , 49.625
48.867 , 49.083 , 51.684
50.918 , 49.701 , 49.567
50.966 , 51.372 , 49.47
50.411 , 49.927 , 51.741
50.624 , 48.45 , 48.892
50.497 , 49.052 , 50.378
50.336 , 51.526 , 50.869
49.312 , 50.682 , 50.463
51.975 , 47.645 , 50.113
50.089 , 49.771 , 48.91
48.797 , 49.804 , 50.15
50.289 , 51.954 , 50.81
51.518 , 50.941 , 50.346
49.75 , 52.096 , 48.241
49.83 , 50.231 , 50.523
49.814 , 49.547 , 50.385
51.101 , 49.767 , 48.812
48.802 , 50.274 , 48.784
49.923 , 48.508 , 52.117
51.794 , 50.133 , 50.286
47.848 , 50.273 , 50.637
50.241 , 50.569 , 49.449
3、将子矩阵subMat扩展到Matrix的下方
var subMat = Matrix.SubMatrix(15, Matrix.RowCount - 15, 0, 3);
var stackMat = Matrix.Stack(subMat);
4、一阶线性方程组求解
//5 * x + 2 * y - 4 * z = -7
//3 * x - 7 * y + 6 * z = 38
//4 * x + 1 * y + 5 * z = 43
//创建方程向量的集合
var vector1 = CreateVector.Dense(new double[] { 5.00, 2.00, -4.00 });
var vector2 = CreateVector.Dense(new double[] { 3.00, -7.00, 6.00 });
var vector3 = CreateVector.Dense(new double[] { 4.00, 1.00, 5.00 });
var vectors = new List
//方程等号左侧的已知数矩阵
var matrixA = CreateMatrix.DenseOfRowVectors(vectors);
foreach (var rows in matrixA.EnumerateRows())
{
Console.WriteLine(string.Join(" , ", rows));
}
//方程等号右侧的已知数向量
var vectorB = CreateVector.Dense(new[] { -7.0, 38.0, 43.0 });
//求解
var resultX = matrixA.Solve(vectorB);
Console.WriteLine("结果:");
resultX.ToList().ForEach(p => Console.WriteLine(Math.Round(p, 2)));
//结果
5 , 2 , -4
3 , -7 , 6
4 , 1 , 5
结果:
3
1
6
//完整代码
//开发环境:windows10,VS2019,.Net 5.0
//安装包如下图
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.Distributions;
using MathNet.Numerics.LinearAlgebra;
using NUnit.Framework;
namespace UnitTest
{
public class Tests
{
public Matrix
[SetUp]
public void Setup()
{
var rnd = new Random();
//随机生成75个浮点数,均值是50,方差是1,这75个数据成正态分布。
var list = Normal.Samples(rnd, 50, 1).Take(75).ToList();
//保留3位小数,保存为数组
var array = list.Select(p => Math.Floor(p * 1000) / 1000).ToArray();
//将数组生成25组,每组3个数的矩阵
Matrix = CreateMatrix.Dense(25, 3, array);
//保存为二维数组的形式 double[][]
var matrix = Matrix.ToRowArrays();
}
[Test]
public void Test1()
{
Assert.AreNotEqual(null, Matrix);
foreach (var rows in Matrix.EnumerateRows())
{
Console.WriteLine(string.Join(" , ", rows));
}
}
[Test]
public void Test2()
{
Assert.AreNotEqual(null, Matrix);
//子矩阵
var subMat = Matrix.SubMatrix(15, Matrix.RowCount - 15, 0, 3);
foreach (var rows in subMat.EnumerateRows())
{
Console.WriteLine(string.Join(" , ", rows));
}
Console.WriteLine("-----------------");
//将subMat扩展到Matrix的下方
var stackMat = Matrix.Stack(subMat);
foreach (var rows in stackMat.EnumerateRows())
{
Console.WriteLine(string.Join(" , ", rows));
}
}
[Test]
public void Test3()
{
//对于一阶线性方程组
//5 * x + 2 * y - 4 * z = -7
//3 * x - 7 * y + 6 * z = 38
//4 * x + 1 * y + 5 * z = 43
//创建方程向量的集合
var vector1 = CreateVector.Dense(new double[] { 5.00, 2.00, -4.00 });
var vector2 = CreateVector.Dense(new double[] { 3.00, -7.00, 6.00 });
var vector3 = CreateVector.Dense(new double[] { 4.00, 1.00, 5.00 });
var vectors = new List
//方程等号左侧的已知数矩阵
var matrixA = CreateMatrix.DenseOfRowVectors(vectors);
foreach (var rows in matrixA.EnumerateRows())
{
Console.WriteLine(string.Join(" , ", rows));
}
//方程等号右侧的已知数向量
var vectorB = CreateVector.Dense(new[] { -7.0, 38.0, 43.0 });
//求解
var resultX =matrixA.Solve(vectorB);
Console.WriteLine("结果:");
resultX.ToList().ForEach(p => Console.WriteLine(Math.Round(p, 2)));
}
}
}