【转】mathnet 使用方法介绍
转载自:http://blog.csdn.net/c914620529/article/details/50393223
在C#中使用mathnet,需要利用using引入相关类
矩阵运算的相关类:
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Generic;(v3.4.0中没有)
- 矩阵定义和初始化
常用矩阵初始化函数:
var matrix2 = new DenseMatrix(3); //3维方阵
var matrix3 = new DenseMatrix(2, 3); //2×3矩阵
var matrix4 = new DenseMatrix(2, 3, 3.0); //2×3矩阵,所有值为3.0
var matrixI = DenseMatrix.Identity(5); //5维单位矩阵
矩阵操作和C#中的数组操作一致,matrix2[m,n]取其m行n列上的值或对其赋值
MathNet中重载了.ToString()函数,可以直接用matrix.ToString()输出整个数组,大大方便了调试和保存数据。
也可以利用C#中的double[,]直接创建
double[,] d_matrix = new double[2,3];
var matrix2 = new DenseMatrix(d_matrix); //2×3矩阵
小记:我曾做过测试,将double[,]先转成Math矩阵,然后进行矩阵运算,再利用matrix2.ToArray()将Math矩阵转换成double[,],其运算时间和直接利用C#编写的矩阵运算相差很小。
但如果是利用for循环将double数组的数值赋值给Math矩阵进行矩阵运算,然后再利用for循环将Math矩阵赋值给某个double[,]数组,其运算时间可以减少1/3。在开发效率和运算效率上,使用的时候可以根据需要进行取舍。
2.矩阵操作
矩阵操作最常用的莫过于从一个矩阵中取值
var submatrix = matrix.SubMatrix(2, 2, 3, 3); //取从第二行开始的2行,第三列开始的三列 子矩阵
var row = matrix.Row(5, 3, 4); //取从第5行第3列开始的4个行元素
var column = matrix.Column(2, 6, 3); //取从第2列第6行开始的3个列元素
matrix.ColumnEnumerator(2, 4) //取从第2列开始的4列
matrix.RowEnumerator(4, 3)//取从第4行开始的3行
matrix.ToRowWiseArray()/matrix.ToColumnWiseArray() //矩阵变为行向量或者列向量
matrix.Diagonal()//取矩阵的对角线元素向量
向矩阵中插值
var result = matrix.InsertColumn(3, vector)/matrix.InsertRow(3, vector);//将向量vector插入到指定的行/列,原有的行列顺延
matrix.SetColumn(2, (Vector)vector);/matrix.SetRow(3, (double[])vector); //用vector替换指定的行/列
matrix.SetSubMatrix(1, 3, 1, 3, DenseMatrix.Identity(3)); //用矩阵替换指定位置的块矩阵
matrix.SetDiagonal(new[] { 5.0, 4.0, 3.0, 2.0, 1.0 }); //替换矩阵的对角线元素
matrixA.Append(matrixB,result)/matrixA.Stack(matrixB,result) //将matrixB扩展到matrixA的右方/上方,将结果保存在result中
矩阵转换:
var permutations = new Permutation(new[] { 0, 1, 3, 2, 4 });
matrix.PermuteRows(permutations); //互换矩阵的3,4行
permutations = new Permutation(new[] { 1, 0, 4, 3, 2 });
matrix.PermuteColumns(permutations); //互换矩阵的1,2列,3,5列。
可以看出,互换是由Permutation中的数字序号决定的。
1.矩阵运算
matrixA = 3.0 * matrixB //数乘
matrixA = vector * matrixB /matrixA = matrixB * vector //向量乘
matrixC = matrixA + / - / * matrixB //矩阵加、减、乘
resultM = (DenseMatrix)matrixA.PointwiseDivide(matrixB); //点乘
上述所有运算符都有对应的函数,也可是利用函数进行运算,如“+”可以写成 matrixC = (DenseMatrix)matrixA.Add(matrixB);或者matrixA.Add(matrixB, matrixC);
matrixB = matrixA.Inverse()/Transpose() //求逆和转置
2.求解线性方程组
对于一阶线性方程组
5*x + 2*y - 4*z = -7
3*x - 7*y + 6*z = 38
4*x + 1*y + 5*z = 43
可以如下求解:
var matrixA = new DenseMatrix(new[,] { { 5.00, 2.00, -4.00 }, { 3.00, -7.00, 6.00 }, { 4.00, 1.00, 5.00 } });
需要改为下面的写法才行:
var matrixA = DenseMatrix.OfArray(new double[,] { { 5.00, 2.00, -4.00 }, { 3.00, -7.00, 6.00 }, { 4.00, 1.00, 5.00 } });
var vectorB = new DenseVector(new[] { -7.0, 38.0, 43.0 });
var resultX = matrixA.LU().Solve(vectorB);
或者
resultX = matrixA.QR().Solve(vectorB);
或者
matrixA.Svd(true).Solve(vectorB, resultX);
或者
matrixA.GramSchmidt().Solve(vectorB, resultX);
3.矩阵秩、行列式、trace和范数
matrix.Determinant()/Rank()/ConditionNumber()/Trace() //行列式/秩/条件数/trace
matrix.L1Norm()/L2Norm()/FrobeniusNorm()/InfinityNorm() //范数
【转】mathnet 使用方法介绍的更多相关文章
- [转载]C#读写txt文件的两种方法介绍
C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...
- fstream的使用方法介绍
转载自: fstream的使用方法介绍 - saga's blog - C++博客 http://www.cppblog.com/saga/archive/2007/06/19/26652.html ...
- Windows下获取本机IP地址方法介绍
Windows下获取本机IP地址方法介绍 if((hostinfo = gethostbyname(name)) != NULL) { #if 1 ; printf("IP COUNT: % ...
- WebService服务调用方法介绍
1 背景概述 由于在项目中需要多次调用webservice服务,本文主要总结了一下java调用WebService常见的6种方式,即:四种框架的五种调用方法以及使用AEAI ESB进行调用的方法. 2 ...
- C#读写txt文件的两种方法介绍
C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...
- jquery的ajax()函数传值中文乱码解决方法介绍
jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...
- UploadifyAPI-上传插件属性和方法介绍
上一篇文章简单的介绍了Uploadify上传插件的使用.但是对于常用的属性和方法并没有说明.授人以鱼不如授人以渔,我决定将常用的属性列举出来,供大伙参考参考. Uploadify属 ...
- js保留小数点后N位的方法介绍
js保留小数点后N位的方法介绍 利用toFixed函数 代码如下 复制代码 <script language="javascript"> document.write( ...
- Thinkphp里import的几个使用方法介绍
以下附上import的几个使用方法介绍 1.使用方法一 import('@.Test.Translate'); @,表示项目根文件夹.假定根文件夹是:App/ 导入类库的路径是:App/Lib/Tes ...
随机推荐
- UVA1635-唯一分解定理的基本应用2
原题:https://vjudge.net/problem/UVA-1635 这是一个极其典型的“从素因子角度出发”的题目,下面是我的代码: #include<iostream> #inc ...
- vue自定义插件
1.新建js文件 utils.js,自定义方法 let local = { say() { console.log('我是插件里面自定义的方法') } } export default { insta ...
- Exec msdb.dbo.sp_send_dbmail 参数详解(SQL Server 存储过程发邮件)
转载oriency755 发布于2012-12-04 11:34:45 阅读数 6870 收藏 sp_send_dbmail [ [ @profile_name = ] 'profile_name ...
- Beego的参数配置
参数配置 beego 目前支持 INI.XML.JSON.YAML 格式的配置文件解析,但是默认采用了 INI 格式解析,用户可以通过简单的配置就可以获得很大的灵活性.默认配置解析 beego 默认会 ...
- 工控安全-PLC指纹提取的几种方法
前言:PLC为可编程逻辑控制器,采用S7协议.其硬件本身存在许多漏洞,可以利用kali里面的漏洞模块或者modbus工具对其进行攻击,甚至直接可以进行未授权访问,只要其开启对外网的端口服务,那么我们就 ...
- mysql 视图、触发器、事务、存储过程、函数
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- paramiko 基于密钥文件登陆
首先密钥登陆远程的原理 client 端 将公钥放在远程机器authorized_keys: 使用 ssh-copy-id app@ip 接着在client机器生成密钥 使用ssh-keygen - ...
- c++ md5算法实现(转)
原文链接:C++计算文件的MD5值 其他:c++输入文件流ifstream用法详解
- Java参数传递是值传递还是引用传递?
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...
- 第一章 - HTTP概述
1.1 HTTP——因特网的多媒体信使 可靠的数据传输协议 1.2 Web客户端和服务器 Web内容都是存储在Web服务器上的,使用HTTP协议,因此也称为HTTP服务器 HTTP客户端发出请求,提供 ...