惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
Microsoft Azure Blog
Microsoft Azure Blog
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
Vercel News
Vercel News
H
Help Net Security
Martin Fowler
Martin Fowler
美团技术团队
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
MyScale Blog
MyScale Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
小众软件
小众软件
T
Tailwind CSS Blog
WordPress大学
WordPress大学

博客园 - 林海

JS数组方法汇总 array数组元素的添加和删除 [转]开源Math.NET基础数学类库使用(02)矩阵向量计算 MathNet的学习笔记1 3D C#后台操作JSON数据 Linq to EF 与Linq to Object 使用心得 jQuery 复合选择器应用的几个例子 常用jQuery选择器总结 (二) 常用jQuery选择器总结 MVC @Html 扩展方法 jQuery 自定义函数 css 伪类选择器 css3中的属性选择器 jquery 功能优化 jquery 替换元素函数 jquery ajax应用 jquery 操作对象和集合 jquery 管理包装元素集合 jQuery 过滤选择器
MathNet的学习笔记2
林海 · 2015-04-14 · via 博客园 - 林海

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

矩阵运算的相关类:

using MathNet.Numerics.LinearAlgebra.Double;

using MathNet.Numerics.LinearAlgebra.Generic;

  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中的数字序号决定的。