【C#】MathNet矩阵计算

文章目录

MathNet系列:矩阵生成

安装

MathNet.Numerics中提供了线性代数、微积分、特殊函数、概率论、随机函数、插值、最优化等一系列功能,是.net技术中首选的数值计算包。

其中,线性代数包LinearAlgebra包提供了向量、矩阵等数据结构,这些是数值计算的前提,故而相比于其他包更加基础。

下面用VS新建一个控制台项目,并启用顶级语句。点击工具->NuGet包管理器->管理解决方案的NuGet程序包,进入浏览选项卡,搜索MathNet.Numerics,选中安装。

索引和计算

MathNet并未重载索引运算符,而是通过At方法来索引。但矩阵重载了许多运算符,支持加减法以及矩阵乘法运算。需要注意,*是矩阵乘法,而非对应元素的乘法。

Matrix也封装了常见运算的方法,以加法为例,提供了两种方案,一是直接返回一个矩阵,二是实现一个void方法,通过传地址的方式,更改输入的另一个矩阵。示例如下

cs 复制代码
using MathNet.Numerics.LinearAlgebra;

Matrix<double> m = Matrix<double>.Build.Dense(3, 4, 0.5);
Matrix<double> n = Matrix<double>.Build.Dense(3, 4, 0.8);
Matrix<double> p = Matrix<double>.Build.Dense(3, 4);

Console.WriteLine(m.Add(n));
m.Add(n, p);

其中,m.Add(n)返回m+n;m.Add(n, p)则相当于p=m+n。

Matrix封装了一些乘除法,其调用逻辑与Add相似,列举如下

  • Multiply 矩阵乘法
  • PointwiseMultiply 逐点相乘
  • LeftMultiply 向量左乘,返回一个向量
  • Divide 除以某个数
  • DivideByThis 除某个数
  • PointwiseDivide 逐点相除
  • PointwiseRemainder 逐点求余
  • PointwiseModulus 逐点取模
  • Power 乘方
  • PointwisePower 逐点乘方

逐点计算

Matrix中提供了一大批Pointwise开头的方法,用于点对点的计算

PointwiseAbsoluteMaximum 返回绝较大的对值值
PointwiseAbsoluteMinimum 返回绝较小的对值值
三角函数 PointwiseCos, PointwiseSin, PointwiseTan
反三角函数 PointwiseAcos, PointwiseAsin, PointwiseAtan
双曲函数 PointwiseCosh, PointwiseSinh, PointwiseTanh
取整 PointwiseCeiling, PointwiseFloor, PointwiseRound
指数对数 PointwiseExp, PointwiseLog, PointwiseLog10
比大小 PointwiseMaximum, PointwiseAbsoluteMaximum PointwiseMinimum, PointwiseAbsoluteMinimum
开根号 PointwiseSqrt

静态方法

Matrix类中封装了一些静态方法,除了绝对值Abs,开根号Sqrt之外,还有如下

类别 函数
三角函数 Cos, Sin, Tan
反三角函数 Acos, Asin, Atan
双曲函数 Cosh, Sinh, Tanh
指数对数 Exp, Log, Log10,
取整 Ceiling, Floor, Round

以指数函数示例如下

cs 复制代码
using MathNet.Numerics.LinearAlgebra;
using System.Runtime.InteropServices;

Matrix<double> m = Matrix<double>.Build.Dense(3, 4, 0.5);
Console.WriteLine(m);
Console.WriteLine(Matrix<double>.Exp(m));
/*
DenseMatrix 3x4-Double
0.5  0.5  0.5  0.5
0.5  0.5  0.5  0.5
0.5  0.5  0.5  0.5

DenseMatrix 3x4-Double
1.64872  1.64872  1.64872  1.64872
1.64872  1.64872  1.64872  1.64872
1.64872  1.64872  1.64872  1.64872
*/
相关推荐
恋恋西风2 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx2 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
BizzZ_3 小时前
C++(22)——类型转换和IO流
开发语言·c++
小范同学_3 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu3 小时前
CSharp: 万年历
开发语言·后端·c#·.net
我找到地球的支点啦4 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
予昊4 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
weixin_461408584 小时前
Mybatis-flex小记
java·开发语言·mybatis
AI_yangxi5 小时前
靠谱的短视频矩阵系统
大数据·人工智能·矩阵
浪里镖客5 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵