注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

III = Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

Math.NET Numerics矩阵和向量的使用(1)  

2017-05-18 18:41:54|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
基本信息
对于该类库的使用,主要信息来自其官网上的说明,见https://numerics.mathdotnet.com/Matrix.html
本文由Castor本人整理,在学习使用这一类库之前,请具备基本的线性代数和矩阵分析方面的知识。
在项目中使用该类库,首先需要在项目中引用MathNet.Numerics.dll。
使用矩阵和向量最常见的场合是线性代数,这一类库提供的API也适合其他的场景,但是该类库不想MATLAB那样有针对空间问题优化,如几何或地理学。类库对矩阵和向量可使用不同的储存方式,对于矩阵,有稠密的、稀疏和对角线三种,而向量则有稠密和稀疏的两种。
创建矩阵
使用命名空间MathNet.Numerics.LinearAlgebra下的Matrix<T>和Vector<T>创建矩阵和向量,虽然这里的T代表了类型,但是并不能直接构造相应的实例,一种方法就是使用构建器(Builder)。
例子如下:
//创建一个3行4列的矩阵,且所有的元素值均为0。
Matrix<double> m1=Matrix<double>.Build.Dense(3, 4);
//创建一个3行4列的矩阵,所有的元素值均为介于0-1之间的随机数
Matrix<double> m2=Matrix<double>.Build.Random(3, 4);
//创建一个3阶单位矩阵
Matrix<double> m3 = Matrix<double>.Build.DenseIdentity(3);
//创建一个4阶对角矩阵,对角线元素为1,3,5
Matrix<double> m4 = Matrix<double>.Build.Diagonal(new double[] { 1, 3, 5 });
不过很多时候,我们都是针对double类型的矩阵和向量,因此,完全可以建立一个构建器,如下:
MatrixBuilder<double> M = Matrix<double>.Build;
这样在书写的时候会得到简化。
Builder的函数一般都是以Dense、Sparse和Diagonal开头,在使用InteliSence的时候,能方便用户在构建不同类型矩阵时便于找到合适的方法。以Dense方法为例,可以接受一个数组,按给定方式摆放:
Matrix<double> m1 = M.Dense(3, 3, new double[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
注意,该方法按列摆放,上面这个矩阵的形式是
1 4 7
2 5 8
3 6 9
而不是
1 2 3
4 5 6
7 8 9
另外,Dense方法还可以使用一个lambda表达式,在创建矩阵的时候给元素赋值,例如:
//使用lambda表达式初始化矩阵元素
m1=M.Dense(3, 4, (i, j) => i + j);
其中i,j即代表了矩阵中元素的行标和列标(注意是从0开始,这一点可能和大部分线性代数教科书上不一致)。这种方式在创建一些比较特殊的矩阵的时候会很有用,例如大名鼎鼎的希尔伯特矩阵:
m1=M.Dense(4, 4, (i, j) => 1.0/(i + j+1));

有时候,我们已经具备了和矩阵类似结构的其他结构(矩阵本身,或者二维数组等),这时可以采用带“Of”的方法,复制这一数据结构。
            double[,] a = new double[,]
            {
                {1,3,5},
                {2,-1,3},
                {3,3,-1}
            };
            Matrix<double> m1 = M.DenseOfArray(a);
原文使用了Bind这个词,似乎是绑定了数组,但是经过测试,对m1的修改并不会影响到原数组,应该是复制,而不是引用。
如果想按行创建一个矩阵,可以使用DenseOfRowArrays方法
            /*
             * 4×2矩阵
             * 1 2 3 4
             * 4 3 2 1
             */
            Matrix<double> m1 = M.DenseOfRowArrays(new double[] { 1, 2, 3, 4 }, new double[] { 4, 3, 2, 1 });
对于向量,其创建方法类似,这里就不再举例了。总之,创建的方法很多,总有一款适合你。
矩阵的修改
例如已经创建了一个矩阵m,修改其中一个元素,和对二维矩阵赋值的操作是类似的:
            m[2,1]=4;//第三行第二列元素值为4
  评论这张
 
阅读(28)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017