Sunday, July 21, 2013

线性代数-3:矩阵的乘法和逆

本节课内容,矩阵的五种乘法,以及用Gauss-Jordan方法求矩阵的逆


矩阵的乘法


有五种乘法,结果显然是一致的,矩阵相乘的前提,如AB,A的列和B的行要相等,C = AB,A拥有m行,n列;B拥有n行,p列;而C就会有m行,p列Image [3]


1. 最常见的乘法,行 * 列


Image [2]


2. 矩阵 * 列的方法


Image [4]


我们都知道,矩阵*向量得到向量。A*B的列1,得到C的列1,其余的部分不参与次运算,A*B的列2,得到C的列2,扩展开来,C中的列是A中的列的线性组合,矩阵乘法可以看做是A与一个个列相乘的p个向量组合在一起。而A乘以向量,等价于A中列的线性组合,而向量B的列说明了如何组合,这点很重要。在linear regression,的feature的组合中经常用到这种解释,A的列对应某一维特征的值,而向量则表明了每一维特征的权重。


3. 行 * 矩阵的方法


同上面的方法比较类似,即C中的行,是B中的行的线性组合


4. 列 * 行的相加


这算是一种比较非主流的方法,没列 * 行得到一个矩阵,多个矩阵相加得到最终相乘的结果


Image [5]


5. 分块矩阵乘法


第一种方法的拓展,将矩阵划分中多个block,像元素一样使用,记得相乘的block需要能够行列match


Image [6]


矩阵的逆(方阵)


矩阵是否可逆


如A=[1 3| 2 6] (如果取行列式,结果为0,还没学到)


一种解释:

假设A * B = I,I中的列是A中的列的线性组合,显然不可能,所有的线性组合都在直线上,但是1,0不在上面


另一种解释:

if i can find a vector X(非零向量),with AX = 0,这样的A 没有逆,这里可以得到X = [3 , -1],证明如下:假设AX = 0,而且A有左逆A-1,则 A-1 ( AX) = 0,then X = [0, 0],矛盾,因此A没有左逆


结论:


singular matrix(即不可逆矩阵)的列能通过线性组合(非零向量X)得到0


如何求得方阵的逆


方法如下 gauss-jordan idea(同时处理两个方程组),A * column j of A-1 = column j of I


Image [7]


求逆和求解方程组类似,尝试将A用消元法(先消元变成上三角阵,然后继续向上消元,即逆向)变成I,而左侧的I随着A做一样的操作,既可以得到A-1,可以检验一下,确实是A的逆


为什么能得到逆?本质上就是矩阵消元的方法,各种E,即E[A I] = [I ?] = [I E],可以看出EA = I,so E就是A的逆,而右侧的?就是E






via WordPress http://www.econsh.com/2013/07/%e7%ba%bf%e6%80%a7%e4%bb%a3%e6%95%b0-3%ef%bc%9a%e7%9f%a9%e9%98%b5%e7%9a%84%e4%b9%98%e6%b3%95%e5%92%8c%e9%80%86/?utm_source=rss&utm_medium=rss&utm_campaign=%25e7%25ba%25bf%25e6%2580%25a7%25e4%25bb%25a3%25e6%2595%25b0-3%25ef%25bc%259a%25e7%259f%25a9%25e9%2598%25b5%25e7%259a%2584%25e4%25b9%2598%25e6%25b3%2595%25e5%2592%258c%25e9%2580%2586

Tuesday, July 16, 2013

线性代数-2:矩阵消元

本节课的主要内容如下



  • elimination 消元

  • back-substitution 回代

  • elimination matrices 消元矩阵

  • matrix multiplication 矩阵乘法


Image


消元


矩阵消元法解方程,也是计算机程序使用的方法;消元法奏效的情况,matrix is a good matrix;使用矩阵消元,既可以知道矩阵是不是一个好矩阵。消元后,回代,即可求解方程


我们本次要解决的AX = b


第一步

消元的目的,消去某个未知变量

先确定第一个主元(pivot)x,如A11,消去方程二和三种中的x,主元行不变,对第二行进行消元(行二减去主元行的某个倍数)

消元的时候可以先不管右侧矩阵,先看左侧(matlab也是这么做的,先算左侧A,再算右侧b)


第二个主元是A22,想消去方程三种的y,即3,2 step


第三个主元是A33


Image [2]


U 上三角矩阵,消元的目的是从A得到U


主元不能为0,为0即fail了,上面的success了,下面讨论下failure的消元,即得不到三个主元


如果0占据了主元的位置,需要做行交换,从下面的方程得到合适的主元,如果某行最终都为0了,则矩阵不可逆(下节课的内容),消元就fail了,行交换解决主元为0的临时问题,但是假如下面也没有可交换的行了,那么消元就fail了


回代


首先将右侧向量带入,将右侧向量放到矩阵中(最右列),即增广矩阵augmented matrix,对这一列的每行做消元时候相同的操作


Image [3]


回代就是把新的矩阵转换成方程组,UX=c算出未知数的值,从下网上,依次算出z y x,是反向的。


消元矩阵


矩阵变化,虽然之前在用矩阵,但是之前的操作,即消元步骤,并不是用矩阵来表示,下面就引入消元矩阵的概念。


矩阵乘法的一些思想

matirx * column = column

row * matrix = row


Image [4]


一步一步来,每次一个消元矩阵,下面是第一个消元矩阵


Image [5]


上图左为elementary matrix 即初等矩阵E21,表示位置目的把2 1 变成0。


然后是第二个消元矩阵


Image [6]


两步,消元就完成了。


其他:


把上面的消元矩阵结合起来如下


Image [7]


上式即矩阵相乘的结合律。


还有另一种初等矩阵,用于交换行的,or 置换,行交换,列交互,都可以使用单位阵来找置换矩阵


Image [8]


Image [9]


置换行的单位阵在左侧,置换列的单位阵在右侧。


同时引入矩阵的逆:


Image [10]






via WordPress http://www.econsh.com/2013/07/%e7%ba%bf%e6%80%a7%e4%bb%a3%e6%95%b0-2%ef%bc%9a%e7%9f%a9%e9%98%b5%e6%b6%88%e5%85%83/?utm_source=rss&utm_medium=rss&utm_campaign=%25e7%25ba%25bf%25e6%2580%25a7%25e4%25bb%25a3%25e6%2595%25b0-2%25ef%25bc%259a%25e7%259f%25a9%25e9%2598%25b5%25e6%25b6%2588%25e5%2585%2583

Sunday, July 14, 2013

MIT线性代数-1:方程组的几何解释

本节课主要是从三种几何角度来解释了方程组(或者说matrix于vector的乘法),一种角度是row picture,另一种则是column picture,还有big picture。下面就课程的一些例子做一个summary。


示例1:两个方程组和两个未知数


方程组和对应的matrix如下


方程组和对应的矩阵

方程组和对应的矩阵



row picture: 一次取一行,在平面上作图,每个方程就是一条直线,直线的交点就是方程的解,如下图:


Image [2]


column picture:找到正确的线性组合(linear combination),列向量的线性组合,用两个向量得到第三个向量,如下图


Image [3]


Image [4]


big picture:上面的两个向量的任意组合将得到一个平面,线性组合可以得到b,所有的线性组合得到所有的b,即整个平面(高维为超平面),线代的思想的基础即是线性组合。


示例2:三个方程组和三个未知数


和两个的比较类似,只不过维度多了一维,列一下。


Image [5]


row picture:三个方程对应三个平面,解是三个平面的交点(当然需要三个平面不平行)


column picture:则是三维空间的向量的线性组合


big picture:左侧矩阵不变,不同的线性组合可以构成整个三维空间,即AX = b,不论b是多少,X都有解(对于上图中的A)。而对于更多的方程和未知数,对应更高维度的矩阵A,道理其实是一致的,假如A中的列向量是线性无关的(即相互独立),他们能组成整个维度空间的所有向量,而假如线性有关(即有的列向量可以由其他向量组合而成,则改列向量相当于没有贡献),那么他们只能组成一个平面,甚至以条直线。


矩阵和向量的乘法的理解


Image [6]


AX可以认为是A的线性组合方式理解,计算AX可以像上图一样,以列的线性组合的方式进行,推荐用这种方法来思考,对矩阵的理解有益。






via WordPress http://www.econsh.com/2013/07/mit%e7%ba%bf%e6%80%a7%e4%bb%a3%e6%95%b0-1%ef%bc%9a%e6%96%b9%e7%a8%8b%e7%bb%84%e7%9a%84%e5%87%a0%e4%bd%95%e8%a7%a3%e9%87%8a/?utm_source=rss&utm_medium=rss&utm_campaign=mit%25e7%25ba%25bf%25e6%2580%25a7%25e4%25bb%25a3%25e6%2595%25b0-1%25ef%25bc%259a%25e6%2596%25b9%25e7%25a8%258b%25e7%25bb%2584%25e7%259a%2584%25e5%2587%25a0%25e4%25bd%2595%25e8%25a7%25a3%25e9%2587%258a

Thursday, June 6, 2013

BLOG接入公益404

无意中看到了自己的404页面,空荡而生硬,联想到了浩哥的404,咱也公益一把,也算是近点微薄之力。


虽然希望渺茫,但是希望这些娃能过得幸福,即使不在亲生父母身边,幸福是最重要的。


公益404

公益404



公益404接入地址:http://www.qq.com/404/






via WordPress http://www.econsh.com/2013/06/blog%e6%8e%a5%e5%85%a5%e5%85%ac%e7%9b%8a404/?utm_source=rss&utm_medium=rss&utm_campaign=blog%25e6%258e%25a5%25e5%2585%25a5%25e5%2585%25ac%25e7%259b%258a404

Wednesday, June 5, 2013

this指针是非左值的表达式

闲逛statckoverflow,有个问题是this指针到底是存在哪里的,栈,堆,还是代码段中?


this表达式


下面有个哥们给出了比较权威的解释:


C++ ISO的规范里面说



In the body of a nonstatic (9.3) member function, the keyword this is a non-lvalue expression whose value is the address of the object for which the function is called.

值得注意的是this并不是一个变量,它是一个表达式,就像1+2一样。而表达式的值可以存在任何地方,栈,寄存器,堆等,具体取决于编译器。即this是一个值为指针的表达式。


lvalue和rvalue


看到了non-lvalue的时候我自然就想到不就是rvalue么,也不知道为啥这么说,为了了解为何这么说(还是木有了解,可能是习惯?),又去看了下lvalue和rvalue,来自51CTO的一篇文章解释的不错,摘抄如下。


术语 “L-Values” 和 “R-Values” 是很容易被搞混的,因为它们的历史渊源也是混淆。他们最初起源是编译器的设计者,从字面上来理解就是表达式左边的值和表达式右边的值。它们的含义一直在演化而名字却没变,现在已经“名”不副“实”了。虽然还是称为left-value 和right-value,但是他们的含义已经大大不同了。


C++ 03 标准上是这样写的: “每一个表达式要么是一个 lvalue,要么就是一个 rvalue。”


记住,lvalue和rvalue是针对表达式而言的。


lvalue 是指那些单一表达式结束之后依然存在的持久对象。例如: obj,*ptr, prt[index], ++x 都是 lvalue。


rvalue 是指那些表达式结束时(在分号处)就不复存在了的临时对象。例如:1729 , x + y , std::string(“meow”) , 和 x++ 都是 rvalue。


++x 和 x++ 的区别的语义上的区别: 当写 int i = 10 ; 时, i 是一个 lvalue,它实际代表一个内存里的地址,是持久的。 表达式 ++x 也是一个 lvalue,它修改了 x 的值,但还是代表原来那个持久对象。但是,表达式 i++ 却是一个 rvalue,它只是拷贝一份i的初值,再修改i的值,最后返回那份临时的拷贝,那份拷贝是临时对象。 ++i 和 i++ 都递增i,但 ++i 返回i本身,而 i++ 返回临时拷贝。这就是为什么 ++i 之所以是一个 lvalue,而 i++ 是一个 rvalue。


lvalue 与 rvalue 之分不在于表达式做了什么,而在于表达式代表了什么(持久对象或临时产物)。 判断一个表达式是不是 lvalue 的直接方法就是“能不能对表达式取址?”,如果能够,那就是一个 lvalue;如果不能,那就是一个 rvalue。


参考文献



  1. Where is the ‘this’ pointer stored in computer memory?

  2. C++左值与右值之间共同与不同点解析






via WordPress http://www.econsh.com/2013/06/this%e6%8c%87%e9%92%88%e6%98%af%e9%9d%9e%e5%b7%a6%e5%80%bc%e7%9a%84%e8%a1%a8%e8%be%be%e5%bc%8f/?utm_source=rss&utm_medium=rss&utm_campaign=this%25e6%258c%2587%25e9%2592%2588%25e6%2598%25af%25e9%259d%259e%25e5%25b7%25a6%25e5%2580%25bc%25e7%259a%2584%25e8%25a1%25a8%25e8%25be%25be%25e5%25bc%258f