OpenCascade Matrix

eryar@163.com

摘要Abstract:本文对矩阵作简要介绍,并结合代码说明OpenCascade矩阵计算类的使用方法。

关键字Key Words:OpenCascade、Matrix、C++

一、引言Introduction

矩阵的研究历史悠久,拉丁方阵和幻方在史前年代已有人研究。作为解决线性方程的工具,矩阵也有不短的历史。1693年,微积分的发现者之一莱布尼茨建立了行列式论(theory of determinants)。1750年,克拉默又定下了克拉默法则。1800年代,高斯和威廉若尔当建立了高斯-若尔当消去法。

从其发展历史可以看出,从行列式论的提出到克拉默法则总共历时50多年之久,而在我们《线性代数》的课本中,也就是一章的内容,学习时间可能只有一个星期。难怪这些概念这么抽象晦涩,也是情有可原的,哈哈。不过,当理解这些概念,也就掌握了一个强大的工具,因为它也使有些计算统一、简单。

矩阵是高等代数中的常见工具,也常见于统计分析等应用数学学科中。在物理学中,矩阵用于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维变换就是使用了矩阵的线性变换。矩阵的运算是数值分析领域的重要问题。

在计算机图形相关的软件中,矩阵是必不可少的重要工具。如:OpenGL、DirectX中的变换都是用矩阵实现的;OpenCascade中就有矩阵计算类(math_Matrix);OpenSceneGraph中也有矩阵的计算类(osg::Matrix)等等。矩阵在计算中主要用来表达线性变换,统一三维空间中物体的位置和方向变换。

本文主要介绍OpenCascade中矩阵类的使用方法。

二、矩阵的运算 Matrix Calculation

矩阵的运算主要有矩阵的加法、数与矩阵相乘、矩阵与矩阵相乘、矩阵的转置、方阵的行列式、共轭矩阵、逆矩阵。还有通过矩阵来求解线性方程组的解问题。

1. 矩阵的加法 Matrix Addition

应该注意,只有当两个矩阵是同型矩阵时,才能进行加法运算。矩阵加法满足下列运算规律:设A、B、C都是m×n矩阵:

2. 数与矩阵相乘 Matrix Multiplication

数乘矩阵满足下列运算规律(设A、B为m×n矩阵,λ、μ为数):

矩阵相加与矩阵相乘合起来,统称为矩阵的线性运算。

3. 矩阵与矩阵相乘 Matrix Multiplication

并把此乘积记作:C = AB

按此定义,一个1×s行矩阵与一个s×1列矩阵的乘积是一个1阶方阵,也就是一个数:

由此表明乘积矩阵AB=C的(i,j)元cij就是A的第i行与B的第j列的乘积。必须注意:只有当每一个矩阵(左矩阵)的列数等于第二个矩阵(右矩阵)的行数时,两个矩阵才能相乘。

矩阵的乘法虽不满足交换律,但仍满足下列结合律和分配律(假设运算都是可行的):

4. 矩阵的转置 Matrix Transpose

矩阵转置也是一种运算,满足下列运算规律(假设运算都是可行的):

5. 方阵的行列式 Determinant of the Square Matrix

应该注意,方阵与行列式是两个不同的概念,n阶方阵是n×n个数按一定方式排列成的数表,而n阶行列式是这些数(也就是数表A)按一定的运算法则所确定的一个数。

由A确定|A|的这个运算满足下述运算规律(设A、B为n阶方阵,λ为数):

6. 逆矩阵 Inverse of Matrix

定义:对于n阶矩阵A,如果一个n阶矩阵B,使AB=BA=E,则说矩阵A是可逆的,并把矩阵B称为A的逆矩阵,简称逆阵。

方阵的逆矩阵满足下列运算规律:

7. 线性方程组的数值解法

在自然科学和工程中有很多问题的解决都归结为求解线性方程组或者非线性方程组的数学问题。例如,电学中的网络问题,用最小二乘法求实验数据的网线拟合问题,三次样条的插值问题,用有限元素法计算结构力学中的一些问题或用差分法解椭圆型偏微分方程的边值问题等等。

求解线性方程组的直接法主要有选主元高斯消去法、平方根法、追赶法等。如果计算过程中没有舍入误差,则此种方法经过有限步算术运算可求得方程组的精确解,但实际计算中由于舍入误差的存在和影响,这种方法也只能求得方程组的近似解。目前这种方法是计算机上解低阶稠密矩阵的有效方法。

高斯消去法是一个古老的求解线性方程组的方法,但由于它改进得到的选主元的高斯消去法则是目前计算机上常用的解低阶稠密矩阵方程组的有效方法。

用高斯消去法解方程组的基本思想是用矩阵行的初等变换将系数矩阵化为具有简单形式的矩阵,即三角形矩阵,再通过回代过程,求出方程组的解。

三、OpenCascade矩阵计算

在OpenCascade中,矩阵的计算类是math_Matrix,它可以有任意的行数和列数,实现了矩阵大部分的运算。以下通过程序实例来说明math_Matrix的使用方法:

/*
* Copyright (c) 2013 eryar All Rights Reserved.
*
* File : Main.cpp
* Author : eryar@163.com
* Date : 2013-07-17 21:46
* Version : 1.0v
*
* Description : Demonstrate how to use math_Matrix class.
* 题目来自《线性代数》同济 第四版
*
*/ #include <math_Matrix.hxx> #pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib") int main(int argc, char* argv[])
{
math_Matrix A(, , , );
math_Matrix B(, , , );
math_Matrix C(, , , ); // 1. Test Matrix Transpose and multiply.
// 题目来自P53习题二 第3题
// Set value of Matrix A
A.Init();
A(, ) = -;
A(, ) = -; // Set value of Matrix B
B(, ) = ; B(, ) = ; B(, ) = ;
B(, ) = -; B(, ) = -; B(, ) = ;
B(, ) = ; B(, ) = ; B(, ) = ; C.TMultiply(A, B); cout<<"Matrix A: "<<endl;
cout<<A<<endl;
cout<<"Matrix B: "<<endl;
cout<<B<<endl;
cout<<"Matrix C: "<<endl;
cout<<C<<endl; // 2. Test the Determinant of the Matrix.
// 题目来自P12 例7
math_Matrix D(, , , );
D(, ) = ; D(, ) = ; D(, ) = -; D(, ) = ;
D(, ) = -; D(, ) = ; D(, ) = ; D(, ) = -;
D(, ) = ; D(, ) = ; D(, ) = ; D(, ) = -;
D(, ) = ; D(, ) = -; D(, ) = ; D(, ) = -; cout<<"Matrix D: "<<endl;
cout<<D<<endl;
cout<<"Determinant of Matrix D: "<<D.Determinant()<<endl; // 3. Calculate Inverse of the Matrix.
// 题目来自P54 11题(3) 和P56 30题(1)
math_Matrix E(, , , ); E(, ) = ; E(, ) = ; E(, ) = -;
E(, ) = ; E(, ) = ; E(, ) = -;
E(, ) = ; E(, ) = -; E(, ) = ; cout<<"Inverse of the Matrix E: "<<endl;
cout<<E.Inverse()<<endl; // P56 30题(1)
math_Matrix F(, , , ); F(, ) = ; F(, ) = ;
F(, ) = ; F(, ) = ;
F(, ) = ; F(, ) = ;
F(, ) = ; F(, ) = ; cout<<"Inverse of the Matrix F: "<<endl;
cout<<F.Inverse()<<endl; return ;
}

计算结果为:

  Matrix A:
math_Matrix of RowNumber = and ColNumber =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) = Matrix B:
math_Matrix of RowNumber = and ColNumber =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = Matrix C:
math_Matrix of RowNumber = and ColNumber =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = Matrix D:
math_Matrix of RowNumber = and ColNumber =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) = - Determinant of Matrix D:
Inverse of the Matrix E:
math_Matrix of RowNumber = and ColNumber =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) = -8.88178e-017
math_Matrix ( , ) = -6.5
math_Matrix ( , ) =
math_Matrix ( , ) = -0.5
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) = - Inverse of the Matrix F:
math_Matrix of RowNumber = and ColNumber =
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) = -
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) =
math_Matrix ( , ) = -
math_Matrix ( , ) = -
math_Matrix ( , ) = -
math_Matrix ( , ) = -
math_Matrix ( , ) = Press any key to continue . . .

线性方程组的计算方法请参考另一篇blog:

使用OpenCASCADE的Math功能解线性方程组

http://www.cppblog.com/eryar/archive/2012/06/21/179629.html

四、结论 Conclusion

OpenCascade的math_Matrix实现了矩阵的大部分运算,也可以作为一个小型的C++矩阵计算库来使用,在没有安装Matlab、Mathematica等软件的情况下,可以使用这个库进行一些计算。

另外,对《计算方法》中算法感兴趣的读者可以参考OpenCascade其中代码的实现,加深对相关算法的理解。

五、参考文献 Bibliography

1. 同济大学应用数学系 线性代数 高等教育出版社 2003

2. 易大义,沈云宝,李有法 计算方法 浙江大学出版社 2002

PDF Version: OpenCascade Matrix

OpenCascade Matrix的更多相关文章

  1. OpenCascade Eigenvalues and Eigenvectors of Square Matrix

    OpenCascade Eigenvalues and Eigenvectors of Square Matrix eryar@163.com Abstract. OpenCascade use th ...

  2. OpenGL Shader in OpenCASCADE

    OpenGL Shader in OpenCASCADE eryar@163.com Abstract. As implementation of one of the strategic steps ...

  3. OpenCASCADE General Transformation

    OpenCASCADE General Transformation eryar@163.com Abstract. OpenCASCADE provides a general transforma ...

  4. OpenCASCADE Coordinate Transforms

    OpenCASCADE Coordinate Transforms eryar@163.com Abstract. The purpose of the OpenGL graphics process ...

  5. OpenCASCADE Camera

    OpenCASCADE Camera eryar@163.com Abstract. OpenCASCADE introduce a new class Graphic3d_Camera for th ...

  6. OpenCASCADE Quaternion

    OpenCASCADE Quaternion eryar@163.com Abstract. The quaternions are members of a noncommutative divis ...

  7. OpenCascade B-Spline Basis Function

    OpenCascade B-Spline Basis Function eryar@163.com Abstract. B-splines are quite a bit more flexible ...

  8. Locations Section of OpenCascade BRep

    Locations Section of OpenCascade BRep eryar@163.com 摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格 ...

  9. Opencascade术语笔记。

    1. chamfer 倒角 vs fillet  圆角: 2.boolean operatiron(布尔操作): common(相加),fuse(相交),cut(相减): 3.depressions( ...

随机推荐

  1. hdu acm 1425 sort(哈希表思想)

    sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. Codeforces #380 div2 B(729B) Spotlights

    B. Spotlights time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  3. Android发展演变与开发环境搭建

    本人也算是一名比较会玩的Android手机用户,常常关注Android发展的最新情况,并且每年都会熬夜看谷歌的I/O大会,总会第一时间刷入最新的Android版本.接下来简单谈一下Android版本的 ...

  4. 润乾报表之制作List列表

    一般情况洗啊,如果sql查到多条数据,使用表格扩展的方式在一张表格里面(横展.纵展):目前的需求是,以报表为单位,做成List.例如,如果查出3条数据,预览的时候,要有3张格式相同内容有异的报表.如图 ...

  5. CSS中继承,特殊性,层叠与重要性

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码: <html><head> ...

  6. spring 3.1 配置 JCR 303 Bean Validation

    A) 导入Hibernate-Validator  要使用JSR303 校验框架, 需要加入框架的具体实现Hibernate-Validator, 在soureforge上下载最新的Hibernate ...

  7. C++之const

    C++中const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助.cons ...

  8. C++混合编程之idlcpp教程Lua篇(7)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与LuaTutorial4工程相似,工程LuaTutorial5中,同样加入了四个文件: ...

  9. Swift-ImageView响应点击事件

    随着Swift语言的不断更新迭代,纯Swift语言编写的代码更加紧凑简单,结合StoryBorad的使用,使开发苹果APP的门槛降低了不少.个人也是比较推荐使用Interface Builder去生成 ...

  10. DirectXMath

    DirectXMath 是Windows平台下的数学库,DirectXMath 库基于 XNA Math C++ SIMD library version 2.04 .   DirectXMath 库 ...