C# MathNet.Numerics 学习记录 矩阵

今天学习了一下C# 里的 MathNet.Numerics库,和Python比较起来有点逊色,但是也不错了。

学习前查了一些资料,有些老的语法和函数已经用不了啦。总结了一些新的函数,记录一下。

 

//定义一个全局变量

public Matrix<double> 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<Vector<double>> { vector1, vector2, vector3 };

            //方程等号左侧的已知数矩阵
            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<double> 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<Vector<double>> { vector1, vector2, vector3 };
            //方程等号左侧的已知数矩阵
            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)));

        }
    }
}

 

 

 

 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值