求问每一步对矩阵的初等变换法求逆矩阵是怎么来的

文档分类:
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,
下载前请先预览,预览内容跟原文是一样的,在线预览图片经过高度压缩,下载原文更清晰。
您的浏览器不支持进度条
下载文档到电脑,查找使用更方便
还剩?页未读,继续阅读
播放器加载中,请稍候...
该用户其他文档
下载所得到的文件列表大连理工大学矩阵第二章(矩阵变换和计算).doc
文档介绍:
第二章矩阵变换和计算一、内容提要本章以矩阵的各种分解变换为主要内容,介绍数值线性代数中的两个基本问题:线性方程组的求解和特征系统的计算,属于算法中的直接法。基本思想为将计算复杂的一般矩阵分解为较容易计算的三角形矩阵.要求掌握Gauss(列主元)消去法、矩阵的(带列主元的)LU分解、平方根法、追赶法、条件数与误差分析、QR分解、Shur分解、Jordan分解和奇异值分解.(一)矩阵的三角分解及其应用.矩阵的三角分解及其应用考虑一个n阶线性方程组bAx?的求解,当系数矩阵具有如下三种特殊形状:对角矩阵D,下三角矩阵L和上三角矩阵U,这时方程的求解将会变得简单.???????????????ndddD?,???????????????nnnnllllllL????,???????????????nnnnuuuuuuU????.对于bDx?,可得解为iiidbx/?,ni,,,??.对于bLx?,可得解为/lbx?,iiikkikiilxlbx/)(?????,ni,,,??.对于bUx?,可得解为nnnnlbx/?,iinikkikiilxlbx/)(?????,,,,????nni.虽然对角矩阵的计算最为简单,但是过于特殊,任意非奇异矩阵并不都能对角化,因此较为普适的方法是对矩阵进行三角分解.).Gauss消去法只通过一系列的初等行变换将增广矩阵)|(bA化成上三角矩阵)|(cU,然后通过回代求与bAx?同解的上三角方程组cUx?的解.其中第k步消元过程中,在第?k步得到的矩阵)(?kA的主对角元素)(?kkka称为主元.从)(?kA的第j行减去第k行的倍数)()(???kkkkjkjkaal(njk??)称为行乘数(子).).矩阵A的LU分解对于n阶方阵A,如果存在n阶单位下三角矩阵L和n阶上三角矩阵U,使得LUA?,则称其为矩阵A的LU分解,也称为Doolittle分解.Gauss消去法对应的矩阵形式即为LU分解,其中L为所有行乘子组成的单位下三角矩阵,U为Gauss消去法结束后得到的上三角矩阵.原方程组bAx?分解为两个三角形方程组?????yUxbLy.).矩阵LU分解的的存在和唯一性如果n阶矩阵A的各阶顺序主子式),,,(nkk??D均不为零,则必有单位下三角矩阵L和上三角矩阵U,使得LUA?,而且L和U是唯一存在的.).Gauss列主元消去法矩阵每一列主对角元以下(含主对角元)的元素中,绝对值最大的数称为列主元.为避免小主元作除数、或作分母,在消元过程中,每一步都按列选主元的Guass消去法称为Gauss列主元消去法.由于选取列主元使得每一个行乘子均为模不超过的数,因此它避免了出现大的行乘子而引起的有效数字的损失.).带列主元的LU分解Gauss列主元消去法对应的矩阵形式即为带列主元的LU分解,选主元的过程即为矩阵的行置换.因此,对任意n阶矩阵A,均存在置换矩阵P、单位下三角矩阵L和上三角矩阵U,使得LUPA?.由于选列主元的方式不唯一,因此置换矩阵P也是不唯一的.原方程组bAx?两边同时乘以矩阵P得到PbPAx?,再分解为两个三角形方程组?????yUxPbLy.).平方根法(对称矩阵的Cholesky分解)对任意n阶对称正定矩阵A,均存在下三角矩阵L使TLLA?,称其为对称正定矩阵A的Cholesky分解.进一步地,如果规定L的对角元为正数,则L是唯一确定的.原方程组bAx?分解为两个三角形方程组?????yxLbLyT.利用矩阵乘法规则和L的下三角结构可得?????????????jkjkjjjjlal,jjjkjkikijijlllal/?????????????,i=j+,j+,…,n,j=,,…,n.计算次序为nnnnlllllll,,,,,,,,,???.由于jjjkal?,k=,,…,j.因此在分解过程中L的元素的数量级不会增长,故平方根法通常是数值稳定的,不必选主元.).求解三对角矩阵的追赶法对于三对角矩阵????????????????????nnnnnbacbacbacb???A,它的LU分解可以得到两个只有两条对角元素非零的三角形矩阵????????????????????????????????????nnnnudududulll,????UL.其中??????????????????niclbuniualbunicdiiiiiiiii,,,,,,,,/,,,,???计算次序是nnulululu????????.原方程组bAx?分解为两个三角形方程组?????yUxbLy.计算公式为niylbybyiiii,,,,,??????,.,,,,/)(,/????????nniuxcyxuyxiiiiinnn该计算公式称为求解三对角形方程组的追赶法.当A严格对角占优时,方程组bAx?可用追赶法求解,解存在唯一且数值稳定.).矩阵的条件数设A为非奇异矩阵,?为矩阵的算子范数,称)(cond??AAA为矩阵A的条件数.矩阵的条件数是线性方程组bAx?,当A或b的元素发生微小变化,引起方程组解的变化的定量描述,因此是刻画矩阵和方程组性态的量.条件数越大,矩阵和方程组越为病态,反之越小为良态.常用的矩阵条件数为∞-条件数:?????)(condAAA,-条件数:)(cond??AAA,-条件数:)()()(condminmaxAAAAAAAHH?????.矩阵的条件数具有如下的性质:())(cond?A;())(cond)(cond??AA;())(cond)(condAA??,??,R??;()如果U为正交矩阵,则)(cond?U,)(cond)(cond)(condAAUUA??.一般情况下,系数矩阵和右端项的扰动对解的影响为定理.设bAx?,A为非奇异矩阵,b为非零向量且A和b均有扰动.若A的扰动δA非常小,使得??AAδ,则)()(cond)(condbδbAδAAAAAxδx????.关于近似解的余量与它的相对误差间的关系有定理.设bAx?,A为非奇异矩阵,b为非零向量,则方程组近似解x~的事后估计式为bxAbAxxxbxAbA~)cond(~~)cond(?????.其中称xAb~?为近似解x~的余量,简称余量。).矩阵的QR分解利用正交变换保条件数的性质,将满秩矩阵化为主对角元都大于零的上三角矩阵,保持矩阵条件数不变.设A是n阶可逆实矩阵,则存在正交阵Q和对角元都大于零的上三角阵R,使得QRA?,称其为矩阵A的QR分解,并且)(cond)(condRA?.为实现矩阵一般的QR分解,我们引入Householder矩阵????ωωωωIωH)(,其中,??ωωnR.该矩阵具有如下性质:()特征值为:)())((TTH?????????即,???????TT,????个,,?n;())()(ωHωH??,即H阵为对称阵;()nIωHωH??)()(,即H阵为正交阵;()如果yxωH?)(,则xy?(不变长度,镜面反射);()设nnxxxR???),,,(?x且x?,取exxω??,则().)()(exxxexxHωH??????1
内容来自淘豆网转载请标明出处.君,已阅读到文档的结尾了呢~~
第二章 矩阵变换和计算
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
第二章 矩阵变换和计算
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口& & & & & 在上一个主题中,学习了android图像的颜色处理。没读过的朋友可以点击一下链接学习:
& & & 那么在从这一篇文章开始,继续学习android的图像处理知识之图像的变换。比如说图像的缩放,拉伸,平移,旋转,以及高级点的图像的渐变和最有用的像素点变换方法。在这里进行一一的学习。这些知识也是我在学习后,总结在这里的,毕竟知识是积累起来的,每天积累一点学习一点,就会进步的很快。
& & & 好了,废话不多说。在这篇文章中,将学习最基本的图像变换知识,即图像的缩放,拉伸等。而其中的原理就是利用矩阵来实现这些效果。我们还是按照老规矩,先学习一下基础的知识,然后再进行实战的代码编写。
一、必须要知道的基础知识
& & & 下面有一张图片,完美的解释了矩阵变换的知识点。如下:
& & & 如上图所示,矩阵A就是我们需要设置的矩阵,而C代表着图像上每一个像素点的位置(X为横坐标,Y为纵坐标),R就是A*C得来的新的坐标位置。这样子通过这样子的矩阵运算,我们就把一张图片的每一个像素点的坐标都做了改变,因此就会呈现出不同的效果。而这就是矩阵变换实现缩放,拉伸等效果的基本原理。我们还需要知道的是,矩阵A的某些元素是会控制一些特殊的效果的,下图就是一个很好的总结:
& & &那么怎么根据矩阵画出效果呢?对应于android中的API,其实就是利用了Canvas的一个方法,如下:
//画出根据矩阵的变换后的图像
canvas.drawBitmap(bmp, matrix, null);
& & &其中bmp对应于一个Bitmap图片,而matrix是一个Matrix对象。那么下面的问题就是我们要怎么来设置这个矩阵了,也就是A。设定A有两种方式。
& & &第一种,直接赋值
& & &很容易知道矩阵A其实是3*3的矩阵,有9个数值。因此,我们只需要给Matrix的setValues方法传入一个长度为9的数值数组即可。
& & 第二种,利用缩放,旋转等封装好的api
& & 如果你觉得第一种方式太麻烦,不利于控制,没关系。对于常见的缩放,旋转等效果,android已经给你封装好了API,只要你调用相关方法,就可以自动设置好矩阵A。方法很多,举出一些如下:
Matrix matrix=new Matrix();
matrix.setTranslate(100, 50);//水平方向平移量为100,垂直方向平移量为50
matrix.setRotate(30, 20, 30);//旋转30度,其中旋转围绕点(20,30)进行,默认为(0,0)
matrix.setScale(1, 2);//缩放,水平方向放大1倍,垂直方向放大2倍
matrix.setScale(1, 2,20,30);//依然是缩放,但是以点(20,30)为基准进行缩放
matrix.setSkew(5,10);//将图片水平方向倾斜3,垂直方向倾斜10
matrix.setSkew(5,10,24,24);//同样的道理,为倾斜找个基准点(24,24)
canvas.drawBitmap(bitmap,matrix, paint);
& & & 好了,基础的知识你差不多都知道了。下面我们赶紧编写一些实际的代码来试试吧。
& & & 首先新建android项目&图形变换&。编写activity_main.xml代码,如下:
1 &LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:gravity="center"
android:background="#cc00ff"
android:text="图像图形变换" /&
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="btnMatrix"
android:textSize="25sp"
android:text="矩阵变换"/&
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="btnXFermode"
android:textSize="25sp"
android:text="画笔风格"/&
android:id="@+id/btn3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="btnShader"
android:textSize="25sp"
android:text="图片渲染实验"/&
android:id="@+id/btn4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="btnLShader"
android:textSize="25sp"
android:text="线性渲染实验"/&
android:id="@+id/btn5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="btnMesh"
android:textSize="25sp"
android:text="像素块实验"/&
52 &/LinearLayout&
& & & 怎么那么多按钮啊。嘿嘿,这说明我们还有好多知识要学习要实验呢,下面的一系列文章会一一实现这些按钮功能的。不用着急,我们这篇文章先来实现第一个按钮&矩阵变换&的效果,就是我们几天所学的内容。
& & &然后需要一个自定义的view来画出原来的图片和经过矩阵变换后的图片,这样有比较才有感觉。新建类MyMatrixView继承自View,代码如下:
1 package com.fuly.
3 import android.content.C
4 import android.graphics.B
5 import android.graphics.BitmapF
6 import android.graphics.C
7 import android.graphics.M
8 import android.util.AttributeS
9 import android.view.V
11 public class MyMatrixView extends View{
private M//颜色矩阵
public MyMatrixView(Context context) {
super(context);
initView();
public MyMatrixView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
public MyMatrixView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
private void initView(){//初始化方法
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.hudie2);
setMatrix(new Matrix());//刚开始给个空矩阵即可
* 该方法用来设置颜色矩阵
* @param matrix
public void setMatrix(Matrix matrix){
this.matrix =
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画出原来的图像
canvas.drawBitmap(bmp, 0, 0, null);
//画出根据矩阵的变换后的图像
canvas.drawBitmap(bmp, matrix, null);
& & & 在代码中,我们首先将两张相同的图片画在了同一个地方。这样子,当其中的一张图片旋转或者拉伸,就很好的得到对比效果了。所用的图片资源,读者可自行替换为自己的一张小图片。下面就是新建imagematrix.xml文件,将这个自定义的view放进去。代码如下:
1 &LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"&
&LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"&
&com.fuly.image.MyMatrixView
android:id="@+id/myview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/&
&/LinearLayout&
&LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"&
&GridLayout
android:id="@+id/mGrid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnCount="3"
android:rowCount="3"&&/GridLayout&
&/LinearLayout&
&LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnChange"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:onClick="btnChange"
android:text="改变"/&
android:id="@+id/btnReset"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="btnReset"
android:layout_height="wrap_content"
android:text="恢复"/&
&/LinearLayout&
48 &/LinearLayout&
& & & 在这里,我们仍旧准备了两个按钮,用来改变和还原,而GridLayout就是用来设置矩阵A的。好了,下面就开始新建MatrixActivity,用于将这个布局显示出来。注意不要忘记给这个活动注册哈。代码很简单,不用多解释的,注释也很详细。如下:
1 package com.fuly.
3 import android.app.A
4 import android.graphics.M
5 import android.os.B
6 import android.view.V
7 import android.widget.EditT
8 import android.widget.GridL
10 public class MatrixActivity extends Activity{
private MyMatrixV
private GridLayout mG
private int mEtW
private int mEtH
private Matrix matrix = new Matrix();
private float[] mMtatrix = new float[9];
private EditText[] Ets = new EditText[9];
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.imagematrix);
mGrid = (GridLayout) findViewById(R.id.mGrid);
mv = (MyMatrixView) findViewById(R.id.myview);
//这个方法在mGrid被画出来后调用
mGrid.post(new Runnable(){
public void run() {
mEtWidth = mGrid.getWidth()/3;
mEtHeight = mGrid.getHeight()/3;
initGrid();
initMatrix();
* 初始化GridLayout
private void initGrid(){
for(int i=0;i&9;i++){
EditText et = new EditText(this);
mGrid.addView(et,mEtWidth,mEtHeight);
* 该法初始化矩阵
private void initMatrix(){
for(int i=0;i&9;i++){
if(i%4 == 0){
Ets[i].setText(String.valueOf(1));
Ets[i].setText(String.valueOf(0));
* 该方法获取矩阵
private void getMatrix(){
for(int i=0;i&9;i++){
mMtatrix[i]= Float.valueOf(Ets[i].getText().toString());
matrix.setValues(mMtatrix);
//下面是两个按钮事件
public void btnChange(View v){
getMatrix();
mv.setMatrix(matrix);
mv.invalidate();
public void btnReset(View v){
initMatrix();
getMatrix();
mv.setMatrix(matrix);
mv.invalidate();
& & & 东西都准备齐全了,下面就在MainActivity里面添加按钮事件,跳转到我们这个活动中来吧。如下:
1 package com.fuly.
3 import android.os.B
4 import android.view.V
5 import android.app.A
6 import android.content.I
9 public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//下面是按钮事件
public void btnMatrix(View v){
Intent intent = new Intent(this,MatrixActivity.class);
startActivity(intent);
& & & OK,一切都好了,运行程序吧。下面是两张效果图:
& & & & & & & & & & & & & & &&
& & & 刚开始是左边的图片,然后设定好矩阵的值,点击改变是右边的图片,点击恢复后又变为左边的图片。
& & & 经过上面的实际演练,不知道你有没有掌握矩阵变换的知识呢?你可以试着采用第二种矩阵设置的方式,试一试,这样子能更好的检验你的学习效果。我就不尝试了。在下一篇文章中,将会学习利用画笔风格来实现图片效果。赶快和我一起学习吧!另外,如果继续学习,请妥善保存好本篇代码,因为后面的文章是在这个代码上进行再书写的。
阅读(...) 评论()为了对一个点进行变换(平移、伸缩、旋转等),可以用一个4&×&4
的的变换矩阵来表示,如最常见的是使用一个模型视图变换矩阵,来变换点、线、多边形以及其它几何体,也可以变换多边形表面的切向量。变换思路如下:设置一个4&×&4
的矩阵中元素的值,使其表示某一具体的变换。然后将某一点的坐标或者某一向量的分量放入一个1&×&4
的行向量v中。乘积vX就生成了经过变换的向量v~,例如,如果X表示沿着x轴平移10个单位,v=[2,6,-3,1],则乘积vX=v~=[12,6,-3,1]。
前面提到了将某一点的坐标或者某一分量的各分量放入一个1&×&4的行向量v中。但是在几何学中,表示3D空间中的某点信息是使用3个分量(XYZ)来表示的!为了使向量-矩阵相乘有意义,我们必须将3D的点或向量拓展为4D行向量。
如何使用第四个分量?这个分量我们用w表示,其中w叫做齐次坐标。取值为0或者1。当W分量为1时,是为了保证点的平移变换能正确进行。而对于向量,没有必要进行平移变换,而将W分量设为0是为了防止对向量实施平移变换。
拓展后的4D向量被称为齐次向量,因此齐次向量即可以表示点,也可以表示向量,所以注意本文提到的名词“向量时,注意区分我指的是点还是向量,一般来说,下文提到的”向量“时,基本上指代的是点。
有时,我们所定义的矩阵改变了一个向量的分量w的值(即w≠0&且w≠1)如下所示:
P=[p1,p2,p3,1]????1000010000100010????=[p1,p2,p3,p3]=P′对于p3≠0和p3≠1的情况
可见,w=p3。当w≠0且w≠1时,就称该变量处于齐次空间中,以区别3D空间。将齐次空间的向量映射回3D空间的方法是:用w分量去除该齐次向量的每一个分量。例如将齐次空间的向量(x,y,z,w)映射回3D向量x的方法如下:
[xwywzwww]=[xwywzw1]=[xwywzw]=X
在进行3D编程是,如果涉及到透视投影,则经常需要将向量由齐次空间映射到3D空间。该操作发生在顶点变换步骤的透视除法环节。在OpenGL中,一个典型的顶点变换步骤如下:
可见,对顶点的变换都是通过矩阵来完成的,下面讨论模型视图矩阵的具体形式。
要想将向量(x,y,z,1)沿着x轴平移px个单位,沿着y轴平移py个单位,沿着z平移pz个单位,只需要将该向量与如下矩阵相乘:
T(p)=?????100px010py001pz0001?????
该平移矩阵的逆矩阵可以简单地对平移向量p取负得到。
T-1=T(p)=?????100-px010-py001-pz0001?????
我们可以用如下3个矩阵将一个向量分别绕着x,y,z轴旋转θ弧度。当沿着旋转轴指向原点的方向观察时,角度是按顺时针方向度量的。
X(θ)=????10000cosθ-sinθ00sinθcosθ00001????
Y(θ)=????cosθ0sinθ00100-sinθ0cosθ00001????
Z(θ)=????cosθ-sinθ00sinθcosθ0000100001????
旋转矩阵R的逆矩阵与其转置相等,即RT=R-1。俱备这样特点的矩阵称为正交矩阵。
比例变换矩阵
如果想让一个向量沿着x、y、z轴分别放大qx、qy、qz倍,可令该向量与如下矩阵相乘:
S(p)=?????qx0000qy0000qz00001?????
如果将比例矩阵的各个缩放因子取倒数,就得到该矩阵的逆矩阵。
S-1=S(1qx,1qy,1qz)=????????????1qx00001qy00001qz00001????????????
几何变换的组合
经常需要对向量实施一系列的变换。例如我们可能先对向量进行缩放,然后在进行旋转,最后平移到所期望的位置。
这个过程的每一步都是通过让向量乘以一个矩阵来实现,矩阵的一个最关键的优点是,可以借助矩阵乘法将几种变换组合到一个变换矩阵。
例如,当我们先对向量p实施比例变换,乘以比例变换矩阵S;在对变换后的向量实施旋转变换,乘以旋转变换矩阵R:最后对变量实施平移变换,乘以平移变换矩阵T,最后得到向量p′′′:
pSp′Ryp′′T===p′p′′p′′′
我们可以向全部的变换组合为一种变换,然后应用该变换,得到向量p~:
SRyTpQ==Qp~
则可以验证:p′′′=p~
法线的变换矩阵
在着色器中执行光照计算时,不仅需要我们指定顶点坐标,还需要我们去指定法线向量。对于顶点坐标,在着色器中对其施加模型视图变换和投影变换即可得到变换后的顶点坐标,但是对于法向量的变换矩阵却与顶点的变换矩阵不一样!
这是因为法线向量会随着我们的平移和旋转发生变化。比如说,如果我们忽略旋转并且假设做了一个(0,0,-5)的平移,那么法线向量(0,0,1)就会变成(0,0,-4),这不仅长度不对而且根本就指向了错误的方向!这里也许我们可以将法线向量的w分量设为0,这样就可以忽略掉那些移位变换。但是不幸的是,当模型视图矩阵包含不同的空间变换时,尤其是缩放和扭曲时,它将不再有用。比如说,如果模型视图矩阵将我们要绘制的物体放到两倍大小,那法线向量也会被拉伸,即使我们将w分量设为0。这会导致严重的光照错误。
在OpenGL中计算法线向量的变换矩阵的方法是:先求出模型视图矩阵的逆矩阵,然后再对求出的逆矩阵转置。这样就可以得到正确的变换矩阵。这样可以去掉矩阵中非正交的因素。
证明方法如下:
假设世界坐标系(未变换前)中的某条切线向量是T,法线向量是N。那么由他们是垂直的可得到:TT?N=0
假设他们变换到视图坐标系中后分别是T′和N′。那么他们应该仍然是相互垂直的:T′T?N′=0
假设切线向量和法线的变换矩阵为M、G。则有:(M?T)T?(G?N)=0
进一步推出:TT?MT?G?N=0
由于TT?N=0,因此我们猜想MT?G=0.因此:
即:应用于法线向量的变换矩阵是顶点变换矩阵的逆转置矩阵。
注意,在上面求证法线的变换矩阵的时候,是讨论OpenGL中的情况,在OpenGL中,对某一顶点实施变换时,是通过一个矩阵乘以顶点实现的,即M?v=v′,其中,M是变换矩阵,v和v′分别是变换前后的顶点。所以对于上面的证明过程有M?T=T′而不是T?M=T′.
由于刚才提到的原因,所以在使用OpenGL编程时,我们用代码制定了一系列变换,但是最后指定的变换会最先应用到顶点上。
考虑下面的代码:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(N);
glMultMatrixf(M);
glMultMatrixf(L);
glBegin(GL_POINTS);
glVertex3f(v);
经过变换之后的顶点是N?M?L?v,也就是说,v首先与L相乘,L?v的结果再与M相乘,M?L?v再与N相乘,顶点v的变换是按照相反的顺序发生。
**********************************
《DirectX 9.0 3D游戏开发编程基础》
《OpenGL编程指南 第七版》
几何变换详解[转]&&
10:59:44|&&分类:&举报字号&
本文已收录于以下专栏:
相关文章推荐
很多朋友学习3D游戏编程,但往往一些基本概念含混不清,这会对以后的学习带来很大阻碍。最近看到有朋友问关于矩阵和坐标变换如何理解,故在此略作讨论,如有谬误,请不吝赐教!首先,谈到矩阵,就离不开坐标变换,...
平时开发程序,免不了要对图像做各种变换处理。有的时候变换可能比较复杂,比如平移之后又旋转,旋转之后又平移,又缩放。
直接用公式计算,不但复杂,而且效率低下。这时可以借助变换矩阵和矩阵乘法,将多个...
看电影,免费申领传智播客价值7800多元的正版教学光盘(内含java,.net,php,网页平面设计教程)
申领地址:/subject/dvd01/index...
主要分析从局部坐标系变换到全局坐标系下的坐标转换公式。首先对全局坐标系进行描述,如图1,o-xyz即全局坐标系,O’-X’Y’Z’即在o-xyz坐标系中定义的局部坐标系,两个坐标系之间的关系如下:这个...
转http://learn./NCourse/jxcamcad/cadcam/Mains/main11-2.htm
2.3.3 基本二维变换 
    基本二维变换有比例...
在摄影测量和计算机视觉中,经常会遇到空间坐标系之间的坐标转换问题,而两个坐标系之间的变换关系一般可以通过一个旋转矩阵R和一个平移向量T(或C)描述。因此,理解清楚坐标系之间旋转平移的转换过程与对应变换...
一般来说,方阵能描述任意线性变换。线性变换保留了直线和平行线,但原点没有移动。线性变换保留直线的同时,其他的几何性质如长度、角度、面积和体积可能被变换改变了。从非技术意义上说,线性变换可能“拉伸”坐标...
几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本...
  所谓空间坐标变换(coordinate transform),就是指空间任意点P在两个空间右手直角坐标系oxmymzm和oxnynzn中的坐标关系。
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 初等变换求逆矩阵技巧 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信