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

信息 灵感 创新

III = Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

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

网易考拉推荐

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

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

  下载LOFTER 我的照片书  |
矩阵的运算
1. 与标量的运算
对于矩阵、向量与标量之间的运算,法则是最简单的,就是每个元素与该标量运算,Matrix实现了运算符的重载,同时还提供了基本的方法:
            MatrixBuilder<double> M = Matrix<double>.Build;
            Matrix<double> m1 = M.DenseOfRowArrays(new double[] { 1, 2, 3 }, new double[] { -1, 3, 2},new double[]{2,-3,1});            
            Console.WriteLine((m1+1).ToMatrixString());
            Console.WriteLine(m1.Add(1).ToMatrixString());
这段代码的两次输出,都是一样的:
Math.NET Numerics矩阵和向量的使用(2) - Lemniscate - 信息 灵感 创新
 +和Add方法、-和Subtract方法、*和Multiply方法、/和Divide方法使用起来都是一样的。
2. 矩阵与矢量、矩阵的运算
矩阵和矢量、矩阵之间的运算遵循线性代数的基本要求,关于这一点的基础知识可以参考线性代数的入门书籍,通常,矩阵和矩阵之间只有加、减、乘三种运算,而矩阵和向量之间仅乘法运算另外,在MATLAB中,为了便于计算,还引入了左除和右除的运算,在这个类库中似乎并没有得到实现。
例如,一个矩阵和向量的乘法:
            MatrixBuilder<double> M = Matrix<double>.Build;
            Matrix<double> m1 = M.DenseOfRowArrays(new double[] { 1, 2, 3 }, new double[] { -1, 3, 2},new double[]{2,-3,1});            
            VectorBuilder<double> V = Vector<double>.Build;
            Vector<double> v1 = V.DenseOfArray(new double[] { 2, 5, -3 });
            Console.WriteLine((m1*v1).ToVectorString());
另外还有一个重载版本的方法,可以把运算的结果储存在一个给定的矩阵中:
            Matrix<double> m1 = M.DenseOfRowArrays(new double[] { 2, -1, 0}, new double[] { 2, 1, 2},new double[]{0,1,1});
            m1.Multiply(2, m1);
调用这个方法之后,m1变成原来的两倍。

一个矩阵要能和另一个矩阵(或向量)相乘,则第一个矩阵的列和第二个矩阵(或向量)的行必须相同,如果不同而强行相乘,在数学上是不允许的,那么在程序中会有什么效果呢?我推测应该是有异常的,测试也证实了这一点:
            MatrixBuilder<double> M = Matrix<double>.Build;
            Matrix<double> m1 = M.DenseOfRowArrays(new double[] { 1, 2, 3,  }, new double[] { -1, 3, 2},new double[]{2,-3,1});            
            VectorBuilder<double> V = Vector<double>.Build;
            Vector<double> v1 = V.DenseOfArray(new double[] { 2, 5});
            try
            {
                Console.WriteLine((m1 * v1).ToVectorString());
            }
            catch(Exception exc)
            {
                Console.WriteLine(exc.Message);
            }
结果是抛出异常(当然我们也顺利地捕获了异常):
Math.NET Numerics矩阵和向量的使用(2) - Lemniscate - 信息 灵感 创新
  异常消息将出现问题的地方做出了详细的说明。
此外,考虑到线性代数中经常出现一些转置相乘的操作, 还提供了一个快速的方法TransposeThisAndMultiply。例如计算:(M'M)^(-1),一般的方法是(M.Transpose()*M).Inverse();
如果使用快速方法,则可以简化为X.TransposeThisAndMultiply(X).Inverse();

  评论这张
 
阅读(35)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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