转载自:http://blog.csdn.net/c914620529/article/details/50393223

在C#中使用mathnet,需要利用using引入相关类

矩阵运算的相关类:

using MathNet.Numerics.LinearAlgebra.Double;

using MathNet.Numerics.LinearAlgebra.Generic;(v3.4.0中没有)

  1. 矩阵定义和初始化

常用矩阵初始化函数:

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 使用方法介绍的更多相关文章

  1. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  2. fstream的使用方法介绍

    转载自:  fstream的使用方法介绍 - saga's blog - C++博客 http://www.cppblog.com/saga/archive/2007/06/19/26652.html ...

  3. Windows下获取本机IP地址方法介绍

    Windows下获取本机IP地址方法介绍 if((hostinfo = gethostbyname(name)) != NULL) { #if 1 ; printf("IP COUNT: % ...

  4. WebService服务调用方法介绍

    1 背景概述 由于在项目中需要多次调用webservice服务,本文主要总结了一下java调用WebService常见的6种方式,即:四种框架的五种调用方法以及使用AEAI ESB进行调用的方法. 2 ...

  5. C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

  6. jquery的ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...

  7. UploadifyAPI-上传插件属性和方法介绍

    上一篇文章简单的介绍了Uploadify上传插件的使用.但是对于常用的属性和方法并没有说明.授人以鱼不如授人以渔,我决定将常用的属性列举出来,供大伙参考参考.           Uploadify属 ...

  8. js保留小数点后N位的方法介绍

    js保留小数点后N位的方法介绍 利用toFixed函数 代码如下 复制代码 <script language="javascript"> document.write( ...

  9. Thinkphp里import的几个使用方法介绍

    以下附上import的几个使用方法介绍 1.使用方法一 import('@.Test.Translate'); @,表示项目根文件夹.假定根文件夹是:App/ 导入类库的路径是:App/Lib/Tes ...

随机推荐

  1. [Python] 前程无忧招聘网爬取软件工程职位 网络爬虫 https://www.51job.com

    首先进入该网站的https://www.51job.com/robots.txt页面 给出提示: 找不到该页 File not found 您要查看的页已删除,或已改名,或暂时不可用. 请尝试以下操作 ...

  2. 微信小程序--骰子游戏

    寒假老师让制作一个小程序,于是开始学习如何制作微信小程序. 第一步,拥有一个小程序帐号, 在这个小程序管理平台,你可以管理你的小程序的权限,查看数据报表,发布小程序等操作. 我用的是微信web开发工具 ...

  3. JavaDay10(下)

    生产者消费者问题 问题描述 有两个进程:一组生产者进程和一组消费者进程共享一个初始为空.固定大小为n的缓存(缓冲区).生产者的工作是制造一段数据,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必 ...

  4. linux c++调试日志函数

    #ifndef MYLOG_H #define MYLOG_H #include <stdio.h> #define __DEBUG__ #ifdef __DEBUG__ #define ...

  5. Oracle 12c 多租户家族(12c 18c 19c)如何在 PDB 中添加 HR 模式

    Oracle 12c 多租户家族(12c [12.2.0.1].18c [12.2.0.2].19c [12.2.0.3])如何在 PDB 中添加模式:19c (19.3) 手工添加示例 HR 用户 ...

  6. 【LInux01】学习Linux课程体系

    知识 =>技能   需要大量的练习  相当于复盘 要有成就感 在一个领域深挖,再迁移到其他领域 1.两周以后的知识留存率: 主动学习: 动手实践:40% 讲给别人听:70% 写博客:是写教程,便 ...

  7. C#在运行时自动引入正确的Dlls

    设置程序Dlls的搜索路径 1.导入Native函数 /// <summary> /// 设置Dlls的搜索路径 /// </summary> /// <param na ...

  8. cssflex兼容(横向顶边对齐)

    display: flex; display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; ...

  9. 【巨杉数据库SequoiaDB】企业级和开源领域“两开花”,巨杉引领国产数据库创新

    2019年12月15日,OSC 源创会·年终盛典在深圳圆满举行.巨杉数据库作为业界领先的金融级分布式数据库厂商, 获得 “2019年开源数据库先锋企业” 及 “2019 GVP-Gitee最有价值开源 ...

  10. 关于整合ssh中的细节03

    关于spring中提供的一些工具类和监听介绍 一.spring提供了一个HibernateTemplate类 ①HibernateTemplate类: 用于操作PO对象,类似Hibernate Ses ...