用户:  密码: 记住我     找回密码 
| 文章 >> 编程通用 >> 算法

DotNetMatrix:NET的简单矩阵库

日期 | 作者保罗Selormey | 浏览86 | 评分100 | 标签算法 评论
简介
本文所提供的类给你一个。NET的基本线性代数包。它提供了用户级C的构造和操作实际,密集矩阵#类。它是用来打包的方式,是自然和可以理解的非专家的日常问题,提供足够的功能。这就是说,它仅仅是一个公共领域的Java矩阵库的港口,被称为JAMA。检查的更多信息。背景
目前,我一个小的地理信息系统公司开发的应用程序开发的GIS组件在日本工作。坐标变换和仿射变换是一个很基本的一部分,我们的发展努力。最近,我被分配。NET框架能够方便地移植到Java和其他框架的设计和实施了一个新的GIS系统的任务。我决定把最大限度地利用基于矩阵的仿射变换,这也是坐标转换规格的要求。
然后,我发现,在。NET提供的GDI部分的Matrix类标准规格不同的方式实现的仿射变换。总之,标准的2D坐标系统的仿射变换矩阵定义为{S0}
由GDI定义的矩阵{S1}
效果是最仿射变换与GDI Matrix类将不符合标准或规格。例如,按标准(和数学)反顺时针(或逆时针)旋转被认为是积极的,但必须使用GDI类时负。
为了解决这个问题,我决定实现一个标准的仿射变换矩阵,并发现了这个小的Java一般矩阵库 - JAMA。本文提出的类被移植从美国医学会期刊NET像超载等运营商的具体改善。
在不同的文章中,我将讨论目前我的仿射变换矩阵,应给予同样的效果(GDI Matrix类相同的属性和方法)。本文的其余部分是从JAMA文档中提取的,我将其称为DotNetMatrix(命名空间)到库。功能
DotNetMatrix是由六个C#类:GeneralMatrix,CholeskyDecomposition,LUDecomposition,QRDecomposition,SingularValueDecomposition和EigenvalueDecomposition。
GeneralMatrix类提供了数值线性代数的基本操作。不同的构造函数创建双精度浮点数来自两个二维数组矩阵。各种获取和设置(属性)提供子矩阵和矩阵元素的访问。基本算术运算包括矩阵加法和乘法,矩阵规范和所选元素的元素的数组操作。一个便捷的矩阵打印方法也包括在内。
五个基本矩阵分解,矩阵,置换向量,像对或三元组的组成,产生五个分解类的结果。这些分解的访问是通过GeneralMatrix类线性方程组,行列式,逆和矩阵函数的计算解决方案。五个分解对称,正定矩阵的Cholesky分解长方矩阵的LU分解(高斯消去)长方矩阵的QR分解 对称和非对称方阵的特征值分解长方矩阵的奇异值分解DotNetMatrix只涉及真正的矩阵,不支持复杂的矩阵。
DotNetMatrix设计代表了纯净和优雅的面向对象的设计和需要,使高性能实现的需要之间的妥协。摘要DotNetMatrix能力对象操作构造函数
设置元素
元素
复制
克隆基本操作


此外减法乘法

标量乘法元素的乘法运算元素师
一元减号
移调
规范分解乔列斯基卢

QR
SVD的
对称特征值
非对称特征值方程的解非奇异系统
最小二乘派生的数量行列式的条件数

排名

伪逆使用代码
以下简单的例子,解决了一个3x3的线性系统Ax = b,并计算剩余的规范。
double[][] array = {{1.,2.,3},{4.,5.,6.},{7.,8.,10.}};

GeneralMatrix A = new GeneralMatrix(array);

GeneralMatrix b = GeneralMatrix.Random(3,1);

GeneralMatrix x = A.Solve(b);

GeneralMatrix Residual = A.Multiply(x).Subtract(b);

double rnorm = Residual.NormInf();
兴趣点
是一个空ISerializable的接口实现所有类。我不知道如果真正需要的是序列化支持,我可以完成的实现,如果需要的话。许可
这是基本的公共域代码的端口,所以结果是在公共领域。历史2004年01月10日, - 初始版本结论
矩阵是有价值的,可以用来解决非常复杂的问题的数学工具,和坐标变换也不例外。这里介绍的类可以帮助你实现自己的仿射变换类得到位,远远超过为您提供的。NET框架。另外,由于完全的C#不像GDI类,这是一个COM实现包装类,有没有互操作的开销。
在我的下一篇文章中,我将介绍基于这个库的仿射变换矩阵类。改进建议表示欢迎。
关于作者:保罗Selormey


中国
我是一名编程爱好者,
谢谢orcode.com为我们提供一个学习和分享的平台。
有什么问题。可以就本内容回复,我看到时。会尽量回复的。
评论会员:little_tiger 时间:2011/11/30
喜保,

伟大的工作。我只是想知道,如果你有一些这些代码的更新版本?有一个C版本?
非常感谢很多
评论会员:游客 时间:2011/11/30
。TharinduNishadPatikirikorala
嗨,

我用这个DLL真正有效地在一个研究项目。我想使我的工作访问,以免费的其他研究人员。但与依赖的DLL,我不知道我是否可以做不做?
有一个复制权的问题,如果我与我的DLL分发您的DLL?
谢谢你

Tharindu
评论会员:保罗Selormey 时间:2011/11/30
您好Tharindu,
正如你可以看到在许可部分,这是一个公共域代码,
这样你就可以在任何你喜欢它。
你不需要有一个DLL,您可以直接在项目中使用的源代码。
的源代码是很老了,你可以清洁并保持您的任何变化,这是
公共领域的东西,只要保持在源代码本身的任何牌照的通知。

最好的问候,保罗。 耶稣基督是爱!请告诉别人。
评论会员:游客 时间:2011/11/30
TharinduNishadPatikirikorala
感谢您的澄清
评论会员:muhaa222 时间:2011/11/30

我用你的图书馆。这是非常好的代码{S2}
但我仍是一个问题
我想DELET DA行或一个山坳?
我没#T已经发现了这个问题soulution
CYA
muhaa
评论会员:andeezlemoyo 时间:2011/11/30
喜保,首先,感谢您分享您的工作

这里我要解决一个样品的线性系统:

49X - 7Y ž = 6
25X - 5年Z = 4
9X - 3Y Z = 2

我怎样才能解决与GeneralMatrix此?我将不胜感激,如果你能给我一些示例代码。


安迪
评论会员:muhaa222 时间:2011/11/30
嗨,我认为在解决是

GeneralMatrix一个

49 -7 1
25 -5 1
9 -3 1 GeneralMatrix B

6
4
2
GeneralMatrix N = A。TRANSPOSE()*一个;GeneralMatrix N = A. TRANSPOSE()* B
GeneralMatrix X = N。逆()* N

x.GetElement(0,0)是你的X
x.GetElement(1,0)是你的Ÿ
x.GetElement(2,0)是您的z
我使用的求解超定方程,但仍是工作你的问题

CYA
muhaa | LachlanGro:
评论会员:游客 时间:2011/11/30
您好,我有一个3x3矩阵,V:V=100101 625251900301在Matlab中,我做了QR和得到:GT,GT[Q,R]=QR(V,0〜)Q=-0.09090.87890.4683-0.56800.3405-0.7493-0.8180-0.33410.4683R=1.0E003*-1.1003-0.0396-0.001500.00730.0009000.0002使用DotNetMatrix然而,当我得到:矩阵Q=-0.09088562141317660.878886544558686-0.468292905790847-0.5680351338323540.3404887339694660.749268649265355-0.817970592718589-0.334104570207539-0.468292905790847而价值观是好的,右栏是一个负的Matlab结果。有什么建议?关于拉克兰
。保罗Selormey
评论会员:游客 时间:2011/11/30
LachlanGro写道:"当值都不错,右栏是所有的Matlab结果负。没错,我已经验证它。我也用在维基百科imgsrc=http://www.orcode.com/upimg/2011_11_30_20_49_53_3.gif例如矩阵]和标志不符合LachlanGro写道:"有什么建议我目前看,我不会有任何问题的根源,立即思想。最好的问候,保罗。耶稣基督是爱!请告诉别人。
LachlanGro
评论会员:游客 时间:2011/11/30
喜保,我贾马讨论列表张贴在一个类似的问题,显然是没有错误,只是解决的办法是"不是唯一的。"虽然我相信是这样的话,我无法找到的会是什么独特的迹象。无论哪种方式,我正是通过相同的数据到其他库(如BlueBit,MATLAB),结果是罚款。的问候,拉克兰
保罗Selormey
评论会员:游客 时间:2011/11/30
LachlanGro写道:我贾马讨论列表上发布了类似的问题,显然是没有错误,只是解决的办法是"不是唯一的"。信息LachlanGro写道:虽然我相信在这种情况下,我无法找到一个什么会是唯一的指示成果的基础上计算是有效的,也Q'Q=我,所以可能出现的情况。LachlanGro写道:无论哪种方式,我正是通过相同的数据到其他库(如BlueBit,MATLAB),结果是罚款目前,我不会有任何数学包,所以我只是寻找书籍和网上的例子来比较。我会考虑见惯了的算法,如果我们能够得到相同的结果如Matlab,以防止任何疑问。最好的问候,保罗。耶稣基督是爱!请告诉别人。
Kuryn
评论会员:游客 时间:2011/11/30
为什么使一个类的虚?这会导致性能问题。你不应该使一个类虚拟
保罗Selormey
评论会员:游客 时间:2011/11/30
Kuryn写道:"你不应该让一个类虚拟。哼哼,我不知道这个镇的新规则。然而,你的源代码,所以请做任何你喜欢它-它是一个公共域许可证最好的问候,保罗。耶稣基督是爱!请告诉别人。
Kuryn
评论会员:游客 时间:2011/11/30
你应该在需要的时候,一类虚拟。但不是数学类,因为没有什么变化。就像在一个Vector,一个dotProduct是一个dotProduct
。FueledByIgnorance
评论会员:游客 时间:2011/11/30
!感谢这个库,它是非常有用的我有一个问题:我在某个时刻到达矩阵是奇异的,我要执行一个逆。{C}逆方法调用解决,这将实例化一个LUDecomposition对象,并调用它的解决方法。它测试的奇点,和我得到的是奇异的"黑客帝国"的例外。我有非常有限的数学知识,所以包涵。在被认为是矩阵的奇异点,不应该由执行一个伪逆在反演方法的意见,它说:"逆(a)如果是方形的,否则伪逆"。有一个从实施缺少的一部分?感谢:保罗Selormey
您好,单一性和伪逆是不同的。要了解伪逆,看到下面的

1。

2。 {A5}

最好的问候,
保罗。
耶稣基督是爱!请告诉别人。
评论会员:ajwo 时间:2011/11/30
您好:

SVD分解有一个错误,从贾马继承。问题是,当n> M. V矩阵这次调整是:


if (wantv)

{

    for (int k = n - 1; k >= 0; k--)

    {

        if ((k < nrt) & (e[k] != 0.0))

	{

	    //for (int j = k + 1; j < nu; j++) error

            for (int j = k + 1; j < n; j++) //correction

            {

	       double t = 0;

		
这里报告错误是:
http://cio.nist.gov/esd/emaildir/lists/jama/msg00430.html
评论会员:保罗Selormey 时间:2011/11/30
谢谢你,我会看一看

最好的问候,
保罗。

耶稣基督是爱!请告诉别人
评论会员:iotha 时间:2011/11/30
谢谢你!

我没有数学的家伙,但我有一个问题后,另一件事(可能是一个"错误"?):{ ​​BR}
SVD的是A [MXN] U = [MXM] ・ S [MXN] * V [NXN] ^ T - 所以应该是一个方阵。但它在这里被定义为:
M = Arg.RowDimension;
N = Arg.ColumnDimension;
NU = System.Math.Min INT(M,N);
新的双U = [M ][];{ BR}为(int i = 0;我LT,M,I)
{
U [I] =新的双[怒江]
难道不应该是这样的:
M = Arg.RowDimension;
N = Arg.ColumnDimension;
NU = System.Math.Min INT(M,N);
S =新的双[System.Math.Min(M 1,N)]
新的双U = [M ][];{ BR}为(int i = 0;我LT,M,I)
{
U [I] =新的双[M]
}

评论会员:celisdelorena 时间:2011/11/30
大家好,

我在C#中使用的矩阵,我想感谢和祝贺的一般矩阵作者。这是一个非常有用的和容易的类工作。

目前我正与SVD的descomposition获得的伪逆...但它不工作。在奇异值计算的代码块。没有任何人有同样的问题吗?

由于事先
评论会员:raz0rblade 时间:2011/11/30
您好,
我遇到的两个问题解决欠定方程组:
第一个问题是一个ArrayIndexOutOfBoundsException异常,当试图获得S矩阵。我认为这个问题是因为A [MXN] U = [MXM] ・ S [MXN] * V [NXN]"的尺寸应该是M - N,但在他们的代码N - S的大小错误, - N: / / /返回的奇异值的对角矩阵/ / /
/ / /
虚拟公共GeneralMatrix S
{
得到
{
GeneralMatrix X =新GeneralMatrix(N,N); / /这应该是(M,N)
双[] [] = X的数组
为(int i = 0;我LT,N,I)/ /这个循环应该去,直到没有N
{
(研究= 0,J LT,N,J)
{
S [I] [J] = 0.0;
}
S [I] [I] = this.s [I]
}
返回X;
}

然后有一个问题:SingularValueDecomposition构造函数的奇异值向量维
S =新的双[System.Math.Min(M 1,N)] 例如,我的方程组有六个方程和8个变量,所以M = 6和n = 8。
则S将七个大小,将会有一个奇异值并不真的存在。
除了这个,我得到不同的结果时,使用Matlab的SVD功能。的奇异值和U型矩阵是完全一样的,但在V -矩阵的最后纳米coloumns有不同的价值观,其他人一样在Matlab相同。但我没有找到一个合适的地方在代码这个问题。

请纠正我,如果我理解数学错误的东西。 {S2}

修改2008年8月29日,上午10:16
评论会员:mbreidt 时间:2011/11/30
不知道这个讨论板仍然活跃,但最近我发现这个库,并发现它非常有用的,所以首先感谢非常它!

不幸的是,我还发现了与奇异值计算的问题,错误的尺寸和所产生的矩阵。

如果你做一个测试的例子{A6​​}],这个库产生错误的结果,至于我可以告诉(FWIW,MATLAB返回相同的维基百科上的给定值)。

在运行的例子(一个4 × 5矩阵的SVD),从S矩阵的SVD对象是一个5 × 5的矩阵,而正确的结果应该是一个4 × 5的矩阵。此外,U和V矩阵中的条目似乎是在错误的顺序和/或有错误的迹象。

此外,SVD的对象返回的奇异值向量在这个例子中有五个要素,但是,根据维基百科
所以应该是最高的4个奇异值,而不是五年。

如果有人仍然是这个棋盘上,我非常喜欢听是否任何人都可以证实我的发现和/或有错误修复!对我的工作,我真的很喜欢用这个库,但只有与非方阵的作品。
谢谢!
马丁
评论会员:Cukaricn 时间:2011/11/30
我与特征值和特征向量之间的关系问题。我的特征向量不符合他们的特征值。相反,它们混合(A1 exaple特征值向量V3,而不是V1)。我所拥有的所有特征值都是负的,所以可以说是问题吗?

感谢

Cukaric | sergiomad:
评论会员:游客 时间:2011/11/30
?是为获得KarhunenLoève向量的方法我想翻译的Java{A7}这段代码,使用JAMA,但我无法找到像方法"时代()"谢谢
保罗Selormey
评论会员:游客 时间:2011/11/30
?sergiomad写道:可用的方法获得KarhunenLoève向量,Karhunen-Loève是没有直接关系矩阵。sergiomad写道:"但我不能找到类似的方法"次()"此端口使用。NET命名的,它应该是"乘(...)"{BR}最好的问候,保罗。耶稣基督是爱!请告诉别人
 文章分类
 桌面
 网页开发
 移动开发
 数据库
 多媒体
 编程语言
 平台,框架和库
 编程通用
 图形/设计
 开发周期
 一般阅读
 第三方产品
 作者资源
 其他
快速解答标签
c x 6850
VC x 7405