精华内容
下载资源
问答
  • 我们先来看图,看看这个方法操作过程,等一下,我找找我大学线性代数课本,找到啦!(哈哈,虽然读研了,因为我是...1.首先我们看看这个正交化过程,因为a1,a2...an为一向量(大佬们请原谅我用a字母代替阿...

    我们先来看图,看看这个方法的操作过程,等一下,我找找我的大学的线性代数课本,找到啦!(哈哈,虽然读研了,因为我是菜鸟,所以还是随时带着)如下图所示:

    大部分人在考研时候都是直接背下来这个正交化过程对吧,或者也根本没有搞懂为啥这样操作就能够得到正交化的基,现在就结合我的理解来分析一下这个原理吧

    1.首先我们看看这个正交化过程,因为a1,a2...an为一组基向量(大佬们请原谅我用a字母代替阿尔法希腊字母,实在是太难输入了,嘻嘻!),只是满足k1a1+k2a2+k3a3+...knan = 0时候,一定有系数k1=k2=...=kn=0,但是如果,a1,a2...an没有任意两者内积为零,也就是他们不是正交的,这就说明了一个问题,a1,a2...an这些基向量之间有冗余(如果是正交基的话,应该是不存在这个问题的),意思就是他们之间的一些分量可能重叠了,还不理解?(我以前学习的时候听到这些也是一脸蒙逼)哈哈,没关系,那我就来举个例子吧,我们看下面的例子:

    情况一:假如:

    a1 = (1,0) , a2 = (0,1)

    我们先来测试他是不是一组基(这两个向量也太简单了,劳资一眼就能看出来是吧,哈哈,我们假装不知道,人生不易,全靠演技!),上面我说了,是不是一组基就看他是不是线性无关,即:

    k1a1+k2a2 = 0,看看是否k1=k2=0,如果k1=k2=0,那么a1,a2线性无关,否则就是线性相关了

    我们带入进去看看

    k1(1,0)+k2(0,1) = 0,很明显了,k1=k2=0,所以a1,a2线性无关,而且a1*a2 = 0,(这里面*都表示向量内积)所以a1垂直a2,即a1,a2正交,那么说明a1,a2是一组正交基,

    又因为a1,a2的模长(就是向量所确定的点到原点的距离)为1的,

    即|a1|=|a2|=1,所以a1,a2是一组标准正交基(有的书可能叫做规范正交基)

    情况二:现在我再假如:

    a1 = (1,0),a2 = (1,1)

    我们再验证一下,k1(1,0)+k2(1,1) = 0,很明显了,k1=k2=0,发现他们还是线性无关的,就说明他们还是一组基,

    但是a1*a2不等于0,所以a1不垂直a2,即a1,a2不正交,那么他们不是正交基。

    (不写了,凌晨1.24了,已经很晚了,以前高中为了考个牛逼点的985,那时候经常一点多才睡,嘻嘻!不过现在不想那样了,得赶紧睡觉,明天早上继续写,晚安各位大佬!)

    吃了个早餐继续写,接着昨天晚上的内容:

    这时候我们发现a1,a2虽然是一组基,但是不是正交的,我们可以将这个情况二与情况一对比一下就是发现,我最开始说的,a1,a2向量的有些分量就会有冗余,我们发现a2的第一个分量与a1的第一个分量都是1,这里我们就可以看成是一种分量冗余了,所以这两个向量没有垂直(正交)

    这里我先定义一下符号表示:假设e1,e2,e3...en向量分别为a1,a2,a3...an向量标准正交化后得到的向量

    那现在引出了我们的问题,如何才能在第一个向量a1的基础上,包括后面的a2,a3...an都两两向量正交化呢,

    我们心里最自然的想法当然是:如果我们能够在a2向量中扣除与a1向量冗余的部分(别担心扣除后a2与a1不再线性无关了,因为扣除后a2就与a1正交了,所以一定是线性无关,仍然是一组基而且是正交基),a3中扣除与a1,a2冗余的部分,a4中扣除与a3,a2,a1冗余的部分,an中扣除与前面所有向量a1,a2...an-1冗余的部分,那这样是不是就达到了正交化的目的呢,现在我告诉你,没错,这个正交化算法的操作过程就是这样(哈哈,好好想想,是不是感觉特别简单,恨自己不早生100年,不然这个算法就是自己发明的啦,哈哈!!!)

    那我们现在就举个例子来验证一下我们刚刚这个伟大的想法是不是正确的:

    为了便于理解,我们先从二维空间开始(事实上我觉得学习抽象的知识就应该这样,线性代数的高维空间是高度抽象的,估计现在世界上都还没有人能想象出高维空间是啥样的,所以咱们从二维平面,实实在在看得见的东西开始,然后再类比推理到高维空间,就很容易理解了),仍然用我们情况二的a1 = (1,0),a2 = (1,1),我们先来画个图(电脑自带的画板软件画的,嘻嘻),看看这两个向量的样子:

    我们上面说了a1,a2不垂直,那么他们就是某些分量有冗余的,从这个图就能看出来,a2,a1向量夹角明显小于90度,但是因为a1,a2线性无关,所以可以作为一组基,能表示出这个平面中的任何一个向量。

    但是现在我们需要在a1,a2向量中找出正交的两个向量e1,e2作为新的一组基,即正交基(因为正交基形式简单,具有很多优良性质,所以数学家需要找到这组基)

    我们先在a1的基础上进行,令e1=a1/|a1|,即我们先单位化(也叫做标准化)a1,然后这就是成为了第一个标准正交基,从刚刚的想法,应该是在a2中扣除与a1的冗余部分,那么剩下的向量部分肯定就是与a1正交的了(实际上就是我们把a2向量再正交分解一次,分解为为冗余的a1和垂直于a1的a1‘向量),从图中可以看出,a2由两部分构成,a1和a1'向量(这个向量实际上就是垂直于a1的),也就是:a2 = a1 + a1',但是我们写为更一般的形式,

    a2 = c*e1 + a1',(注:因为我们已经令e1=a1/|a1|,即e1已经是单位化的了,所以a2在a1向量方向上的单位分量肯定得带一个系数c,刚好我举的这个例子这里c=1罢了),现在我们只要能找出这个a1’向量(因为前面没带系数,那么我们找到的a1‘向量可能不是单位化的,我们一定得正交化一次,才能成为第二个标准正交基)即可,

    也就是找到了a2中蕴藏的第二个正交基 e2 = a1'/|a1'|

    根据a2 = c*e1 + a1',推出

    a1' = a2 - c*e1 即为我们所求,这里因为c是未知系数,我们是求不出a1’的,因此我们得先求出系数c即可

    再结合一个条件:a1'得垂直于e1,即使得a1' * e1 = 0(他两内积得为零)

    现在我们带a1' = a2 - c*e1进入a1' * e1 = 0,得到:

    (a2 - c*e1)*e1 =0 ,展开得到

    a2*e1 = c*e1*e1,因为e1*e1 = 1(单位向量与自己内积当然是等于模长啦!就是=1的)即

    c = a2*e1 = (a2,e1) (写成了向量内积的括号表示方式)

    由于a2,e1都是已知的向量,所以这里我们就求出了系数c,那么结合上面的式子a1' = a2 - c*e1就可以求得第二个正交向量,

    带入向量的值,a2 = (1,1),e1 = (1,0),计算得到:

    a1' = a2 - (a2,e1)*e1 = a2 - e1 = (0,1)

    此时再单位化得到的第二个正交基a1'向量,e2 = a1' / |a1'| = (0,1) / 1 = (0,1),就得到了我们的第二个标准正交基

    哈哈,是不是发现这个(0,1)向量正好是图中那个y轴上面的与a1垂直的a1'向量,那这就对了,虽然举的这个例子比较简单,而且参数也比较特殊了一点,但是足以说明这个问题的本质了,你还可以试着自己举一些不同方向,不同长度的a1,a2向量,然后安照这个原理进行正交化,你会发现,完全正确!

    现在e1,e2都找到了,那么这个标准正交化就结束了。

    现在我们用最开始书本图片上那个正交化公式来计算一遍,看看是不是和我们这个结果吻合的:

    β1 = a1,(我刚刚标准正交基向量用的是e1,e2的符号,书上这里用的是β1,β2,不过没关系,知道就好)

    β2 = a2 - (β1,a2) / (β1,β1) * β1

    带入向量的值,a2 = (1,1),β1 = a1 = (1,0),计算得到:

    β2 = (1,1)- 1/1 * (1,0) = (0,1)

    这个结果跟咱们刚刚那个绿色的结果比较一下,是不是发现完全一样,哈哈,这就说明咱们最上面那个紫色的那段话的思想是完全正确的,恭喜你,要是时间退回两百年前,那么发明这个算法的数学家就是你了,哈哈!

    现在我们已经掌握了这个正交化的原理以及精髓,现在我们需要做更一般的推理,推广到高维向量空间(什么?空间是啥你不知道?好吧,我解释一下,空间就是集合的别名,比如数轴上的所有全体实数组成的集合,我们叫做实数集对吧,我们还可以叫做实数空间,懂了吧!!!)

    现在为了表述更清晰,向量我又换了几个符号来表示,不过这个没关系,聪明的你总是能分辨白天黑夜的!!!

    符号说明:这里用g1,g2,g3..gn来代表上面的线性无关向量组a1,a2,a3,...an。h1,h2...hn代表正交后得到的向量a1',a2'...an'

    最终的单位正交向量还是用e1,e2,...en表示。废话不多说,咱们开始,前方高能,请认真阅读,不懂的联系我qq2488890051.

    设{ g1,g2,g3,...gn }为n维空间中的一组线性无关元素系

    令e1 = g1 / |g1|,作h2 = g2 - c21*e1(这儿就是扣除第一个正交基的冗余部分),求出c21,利用条件h2⊥e1,即

    (h2,e1) = (g2,e1)- (c21*e1,e1) = 0

    c21 = (g2,e1),即可求得上面的h2

    令e2 = h2 / |h2|,作h3 = g3 - (c31*e1 + c32*e2)(即:我们最开始说的,得扣除和之前向量e1,e2冗余的部分,只是那时候咱们是二维而已),求c31,c32,使得,h3⊥e1,h3⊥e2,可求得:

    c31 = (g3,e1),c32 = (g3,e2),即可求得h3

    令e3 = h3 / |h3|,..........

    以此类推。

    设e(n-1)(注:这里n-1是下标,为了书写方便,我加了个括号,即第n-1个标准正交基)已得,

    作 hn = gn - (cn1*e1+ cn2*e2+......c(n-1)*e(n-1))(注:即为扣除前面所有的冗余向量)

    使 hn⊥e1,hn⊥e2,hn⊥e3.......hn⊥e(n-1),求得cn1,cn2,cn3.......c(n-1)等系数,即:

    cn1 = (gn,e1),cn2 = (gn,e2),cn3 = (gn,e3).....cn(n-1) = (gn,e(n-1))

    即可求得hn

    令 en = hn / |hn|,.......

    由此而得到的{e1,e2,e3......en}即为由{g1,g2,g3......gn}标准正交化(也叫做规范正交化)而得到的标准正交系(规范正交系)。

    这里讲一下,上面这个红色加粗字体,系数的来源的通熟易懂的直观理解,前面我们用的是

    h2 = g2 - c21*e1,求出c21,利用条件h2⊥e1,即(h2,e1) = (g2,e1)- (c21*e1,e1) = 0

    故c21 = (g2,e1),从而求出的这个系数,这个是严格的推导而来,没有任何问题。现在我们来如下思考,就更加容易结合实际意义来理解了。

    若A = c1*a1 + c2*a2 + c3*a3 + ...cn*an  这里A是更一般的(即更抽象性,代表了不同事物的相同本质的东西),A可能是个向量,也可能是一个函数。这里面a1,a2,a3,......an互相垂直的一组标准正交基,即内积为零,函数也是有基函数,有内积的,所以这里说的东西适用于向量和函数,c1,c2...cn为这些基的系数。现在假如我们想求A在某一个基(分量)的系数,那么怎么求呢,实际上就是用 cn = (an,A),即用an去与A作内积,由于这些基两两正交,所以必然只有an * an这一项不为零,那么

    (an,A) = an*cn*an = cn*1 = cn 这个系数了嘛(an*an = 1的,因为是标准正交基,模长为1),上面红色加粗字体部分我们求向量的系数是如此,实际上求函数的标准正交基的系数也是如此,下面我举一个函数的例子:

    我们知道傅立叶变换中,满足狄利克雷条件的f(x)都可以展开成傅立叶级数,

    即1,cosx,sinx,cos2x,sin2x......cosnx,sinnx,...(因为他们是一组完备的正交基,什么是完备???哈哈,就是你再也找不到另外一个基函数可以与他们两两相交的,他们就已经是整个宇宙中能找到的最完整的一组正交基了,但是他们为啥不是标准正交基?我们来积分一下,因为∫cosxdx从-pi到pi积分 = pi,而不是1。不过这个没关系,我们把它除以一个pi就可以将他们单位化了,即1/π,1/π*cosx,1/π*sinx,1/π*cos2x,1/π*sin2x......1/π*cosnx,1/π*sinnx,...他们现在就是一组标准正交基函数了)

    我们现在把f(x)展开成三角函数的标准正交基的表示形式,这里用an表示cosnx的系数,bn表示sinnx的系数,即:

    f(x) = a0*1/π*cos0x + b0*1/π*sin0x(注:这一项=0) + a1*1/π*cosx + b1*1/π*sinx + a2 * 1/π*cos2x + b2*1/π*sin2x + ...... + an*1/π*cosnx + bn*1/π*sinnx

    即:

    f(x) = a0*1/π + a1*1/π*cosx + b1*1/π*sinx + a2 * 1/π*cos2x + b2*1/π*sin2x + ...... + an*1/π*cosnx + bn*1/π*sinnx)

    根据上面粉红色的字体部分说的,求某个正交基上面的系数的方法就是用这个正交基去内积f(x)即可,即:

    a1 = (1/π*cosx,f(x))= ∫f(x)*1/π*cosxdx,                b1 = (1/π*sinx,f(x) )= ∫f(x)*1/π*sinxdx

    a2 = (1/π*cos2x,f(x))= ∫f(x)*1/π*cos2xdx,            b2 = (1/π*sin2x,f(x))= ∫f(x)*1/π*sin2xdx

    ......

    an = (1/π*cosnx,f(x))= ∫f(x)*1/π*cosnxdx,            bn = (1/π*sinnx,f(x))= ∫f(x)*1/π*sinnxdx

    即:

    an = 1/π*∫f(x) * cosnxdx       (n =0,1,2,3....),特别的,当n=0时,a0 = 1/π∫f(x)dx

    bn = 1/π*∫f(x) * sinnxdx        (n =1,2,3....)

    哈哈,这就是傅立叶变换后,系数的求解方法,大佬,你记住了吗!!!

     

    展开全文
  • 本节为线性代数复习笔记的第二部分,矩阵的概念与计算(1),主要包括:向量组的秩,向量内积、正交、模,施密特标准正交化(正交规范化),向量空间以及坐标变换公式。 1. 向量组的秩   向量组α1⃗,α2⃗,...,...

    本节为线性代数复习笔记的第五部分,向量(2),主要包括:向量组的秩,向量内积、正交、模,施密特标准正交化(正交规范化),向量空间以及坐标变换公式。

    1. 向量组的秩

      向量组α1,α2,...,αs\vec{\alpha_1},\vec{\alpha_2},...,\vec{\alpha_s}的极大线性无关组中所含有向量的个数称为向量组的秩,其中等价向量组必然等秩,但向量组等秩不一定是等价向量组,且有矩阵的秩=行向量组秩=列向量组秩。
      若A经过初等行变换变为B,则A的行向量组合B的行向量组等价,且A和B任何列向量组具有相同的线性相关性。
      设有向量组β1,β2,...,βt\vec{\beta_1},\vec{\beta_2},...,\vec{\beta_t}α1,α2,...,αs\vec{\alpha_1},\vec{\alpha_2},...,\vec{\alpha_s},若βi\beta_i均可由α1,α2,...,αs\vec{\alpha_1},\vec{\alpha_2},...,\vec{\alpha_s}线性表出,则:r[β1,β2,...,βt]r[\vec{\beta_1},\vec{\beta_2},...,\vec{\beta_t}]\leqr[α1,α2,...,αs]r[\vec{\alpha_1},\vec{\alpha_2},...,\vec{\alpha_s}]

    2. 向量组内积,向量正交,模

      设αT=[α1,α2,...,αn]T\alpha^T=[\vec{\alpha_1},\vec{\alpha_2},...,\vec{\alpha_n}]^Tβ=[β1,β2,...,βn]T\beta=[\vec{\beta_1},\vec{\beta_2},...,\vec{\beta_n}]^T,则αTβ\alpha^T\beta称为向量组的内积,记为(α,β)=αTβ(\alpha,\beta)=\alpha^T\beta
      当αTβ=0\alpha^T\beta=0,称两个向量组正交。
      向量组的模记为α=Σi=1nαi2||\alpha||=\sqrt{\Sigma_{i=1}^n\alpha_i^2},模为1则向量为单位向量。

    3. 标准正交向量组

      对于向量组α1,α2,...,αn\vec{\alpha_1},\vec{\alpha_2},...,\vec{\alpha_n},若i=jαiTαj=1i=j,\alpha_i^T\alpha_j=1ijαiTαj=0i\neq j,\alpha_i^T\alpha_j=0,则称向量组α1,α2,...,αn\vec{\alpha_1},\vec{\alpha_2},...,\vec{\alpha_n}为标准/单位正交向量组。
      A是正交矩阵(方阵)\LeftrightarrowATA=EA^TA=E\LeftrightarrowAT=A1A^T=A^{-1}\LeftrightarrowA的行与列向量组皆为标准正交向量组
      若A是正交矩阵,则称Y=AXY=AX为正交变换,不改变向量内积(成都和两两夹角不变)。
      对于正交矩阵A,若|A|=1,称A为特殊正交矩阵/旋转矩阵;若|A|=-1,称A为瑕旋转矩阵。

    正交矩阵和正交变换还有很多有意思的性质~

    4. 施密特标准正交化/正交规范化

      线性无关向量组α1,α2,...,αn\vec{\alpha_1},\vec{\alpha_2},...,\vec{\alpha_n}的标准正交化公式为:
    β1=α1β2=α2(α2,β1)β1,β1β1...βn=αn(αn,βn1)βn1,βn1βn1...(αn,β1)β1,β1β1 \beta_1=\alpha_1\\\beta_2=\alpha_2-\frac{(\alpha_2,\beta_1)}{\beta_1,\beta_1}\beta_1\\...\\\beta_n=\alpha_n-\frac{(\alpha_n,\beta_{n-1})}{\beta_{n-1},\beta_{n-1}}\beta_{n-1}-...-\frac{(\alpha_n,\beta_1)}{\beta_1,\beta_1}\beta_1
      得到的β1,β2,...,βn\vec{\beta_1},\vec{\beta_2},...,\vec{\beta_n}是正交向量组,将β1,β2,...,βn\vec{\beta_1},\vec{\beta_2},...,\vec{\beta_n}单位化得:ηi=βiβi\eta_i=\frac{\beta_i}{||\beta_i||},这样即可得到标准正交向量组。
      (α2,β1)β1,β1\frac{(\alpha_2,\beta_1)}{\beta_1,\beta_1}这个计算本质上是将α2\alpha_2投影到α1\alpha_1方向上的投影系数,然后做向量的相减,得到方向上与α1\alpha_1正交的新向量。

    5. 向量空间

      若ξ1,ξ2,...,ξn\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}RnR^n中的线性无关向量组,且任一向量αRn\vec{\alpha}\in R^n均可由ξ1,ξ2,...,ξn\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}线性表出,则称ξ1,ξ2,...,ξn\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}RnR^n的一个基,其个数n称为该向量空间的维数。若有:α=a1ξ1+a2ξ2+...+anξn\vec{\alpha}=a_1\vec{\xi_1}+a_2\vec{\xi_2}+...+a_n\vec{\xi_n},则(a1,a2,...,an)(a_1,a_2,...,a_n)称为向量α\vec{\alpha}在此向量空间的坐标。
      若η1,η2,...,ηn\vec{\eta_1},\vec{\eta_2},...,\vec{\eta_n}ξ1,ξ2,...,ξn\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}为向量空间RnR^n的两个基,且:
    [η1,η2,...,ηn]=[ξ1,ξ2,...,ξn][c11c12...c1nc21c22...c2n............cn1cn2...cnn]=[ξ1,ξ2,...,ξn]C [\vec{\eta_1},\vec{\eta_2},...,\vec{\eta_n}]=[\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}]\left[\begin{matrix}c_{11}&c_{12}&...&c_{1n}\\c_{21}&c_{22}&...&c_{2n}\\...&...&...&...\\c_{n1}&c_{n2}&...&c_{nn}\end{matrix}\right]\\=[\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}]C

    称矩阵C为从η\etaξ\xi的过渡矩阵(必然是可逆矩阵),上述公式称为基变换公式
      若α=[ξ1,ξ2,...,ξn]x=[η1,η2,...,ηn]y\vec{\alpha}=[\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}]\vec{x}=[\vec{\eta_1},\vec{\eta_2},...,\vec{\eta_n}]\vec{y},且[η1,η2,...,ηn]=[ξ1,ξ2,...,ξn]C[\vec{\eta_1},\vec{\eta_2},...,\vec{\eta_n}]=[\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}]C,则α=[ξ1,ξ2,...,ξn]x=[η1,η2,...,ηn]y=[ξ1,ξ2,...,ξn]Cy\vec{\alpha}=[\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}]\vec{x}=[\vec{\eta_1},\vec{\eta_2},...,\vec{\eta_n}]\vec{y}=[\vec{\xi_1},\vec{\xi_2},...,\vec{\xi_n}]C\vec{y},即x=Cyy=C1x\vec{x}=C\vec{y},\vec{y}=C^{-1}\vec{x},称为坐标变换公式。这里要注意区分是从哪一个坐标到哪一个坐标。


    欢迎扫描二维码关注微信公众号 深度学习与数学   [每天获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]
    在这里插入图片描述

    展开全文
  • 线性代数中一个很重要的概念就是基,一基是构成线性空间“最高效的方式“,即若多余这个向量个数会出现冗余,若少于这个向量个数会出现无法构成该向量... 本文采用C语言实现了基的标准正交化,正交化方法为格兰姆-

        线性代数中一个很重要的概念就是基,一组基是构成线性空间“最高效的方式“,即若多余这个向量个数会出现冗余,若少于这个向量个数会出现无法构成该向量空间。由一般向量构成的一组基往往不是标准正交的,所以需要进行标准正交化!

        线性代数“基“的概念在很多领域都有应用,包括机器人学,图像处理,数据降维等,具体可以参考相关线性代数教材。

        本文采用C语言实现了基的标准正交化,正交化方法为格兰姆-施密特正交化(参见相关线性代数教材或维基百科)。程序功能为:询问用户输入向量的维数,用户输入一组基,构成n*n的矩阵(为了符合输入习惯,采用行向量的方式进行输入),然后对矩阵进行转置,将行向量变为列向量(符合线性代数的习惯),在进行判断之前,先判断用户输入的向量能否构成一组基,判断方式在isInverse()这个函数中,采用的是消元法判断矩阵是否可逆,若可逆则进行正交化,若不可逆,输出该矩阵不可逆,退出程序,具体程序如下:

    /*==================================================
    
     # Author:      Joker@HIT    NolanRobot@163.com
     # Filetype:    C source code
     # Environment: Linux & Ubuntu 14.04
     # Tool:        Vim & Gcc 
     # Date:        Sat Aug 20 2016
     # Descprition: Input a couple of basis as rows of 
     		a matrix. the program tansposes it,
    		and examine it's inverse whether 
    		exists or not! If exists, orthogonize
    		it standardly!
    
    ==================================================*/
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<stdbool.h>
    #include<math.h>
    
    void transpose(int, double [*][*]);
    void show_matrix(int, double [*][*]);
    void orthogonize(int, double [*][*]);
    bool isInverse(int, double [*][*]);
    void exchange(int, int, double [*][*]);
    
    int main(void)
    {
    	int dimention, i, j;
    	bool judge;
    
    	printf("Enter the dimention of the basis: ");
    	scanf("%d", &dimention);
    
    	double basis_matrix[dimention][dimention];
    
    	printf("Input the basis (as rows of the matrix):\n");
    	for(i=0;i<dimention;i++)
    		for(j=0;j<dimention;j++)
    			scanf("%lf", *(basis_matrix+i)+j);
    
    	transpose(dimention, basis_matrix);
    
    	printf("The matrix you input as follow:\n");
    	show_matrix(dimention, basis_matrix);
    	
    	judge = isInverse(dimention, basis_matrix);
    
    	if(!judge){
    		printf("The column vector of matrix can't consists of the basis!\n");
    		exit(1);
    	}
    
    	printf("The standard orthogonal basis matrix as follow:\n");
    	orthogonize(dimention, basis_matrix);
    	show_matrix(dimention, basis_matrix);
    
    	return 0;
    }
    
    void transpose(int dim, double matrix[dim][dim])
    {
    	int i, j;
    	double replica[dim][dim];
    
    	for(i=0;i<dim;i++)
    		for(j=0;j<dim;j++)
    			*(*(replica+i)+j) = *(*(matrix+i)+j);
    
    	for(i=0;i<dim;i++)
    		for(j=0;j<dim;j++)
    			*(*(matrix+i)+j) = *(*(replica+j)+i);
    
    	return;
    }
    
    void show_matrix(int dim, double matrix[dim][dim])
    {
    	int i, j;
    
    	for(i=0;i<dim;i++){
    		for(j=0;j<dim;j++)
    			printf("%-9.3f", *(*(matrix+i)+j));
    		putchar('\n');
    	}
    
    	return;
    }
    
    void orthogonize(int dim, double matrix[dim][dim])
    {
    	int i, j, k;
    	double numerator, demoninator;
    	double proj_vector[dim];
    	
    	for(i=1;i<dim;i++){
    		for(k=0;k<dim;k++)
    			proj_vector[k] = 0;
    		for(j=0;j<i;j++){
    			numerator = demoninator = 0;
    			for(k=0;k<dim;k++){
    				numerator += matrix[k][i] * matrix[k][j];
    				demoninator += matrix[k][j] * matrix[k][j];
    			}
    			for(k=0;k<dim;k++)
    				proj_vector[k] += numerator / demoninator * matrix[k][j];
    		}
    		for(k=0;k<dim;k++)
    			matrix[k][i] = matrix[k][i] - proj_vector[k];
    	}
    
    	for(i=0;i<dim;i++){
    		demoninator = 0;
    		for(j=0;j<dim;j++)
    			demoninator += matrix[j][i] * matrix[j][i];
    		for(j=0;j<dim;j++)
    			matrix[j][i] = matrix[j][i] / sqrt(demoninator);
    	}
    
    	return;
    }
    
    bool isInverse(int dim, double matrix[dim][dim])
    {
    	double replica[dim][dim];
    	double coef;
    	int i, j, k;
    	bool result = true;
    
    	for(i=0;i<dim;i++)
    		for(j=0;j<dim;j++)
    			replica[i][j] = matrix[i][j];
    
    	for(i=0;i<dim-1;i++){
    		exchange(dim, i, replica);
    		if(fabs(replica[i][i])<0.00001){
    			result = false;
    			break;
    		}
    		for(j=i+1;j<dim;j++){
    			coef = replica[j][i] / replica[i][i];
    			for(k=0;k<dim;k++)
    				replica[j][k] = replica[j][k] - coef * replica[i][k];
    		}
    	}
    
    	if(fabs(replica[dim-1][dim-1])<0.00001)
    		result = false;
    
    	return result;
    }
    
    void exchange(int dim, int flag, double matrix[dim][dim])
    {
    	double temp[dim];
    	int i, j;
    
    	for(i=flag+1;i<dim;i++)
    		if(fabs(matrix[flag][flag])<fabs(matrix[i][flag])){
    			for(j=0;j<dim;j++){
    				temp[j] = matrix[flag][j];
    				matrix[flag][j] = matrix[i][j];
    				matrix[i][j] = temp[j];
    			}
    		}
    
    	return;
    }

    运行结果如下图所示:

    其实上述代码在exchange()函数中可以进行一定的改进,采用指针数组的方式,然后排序操作是对指针进行排序,而不是对数组进行排序,优化程序运行时间和空间!


    若是读者对代码有什么意见,欢迎留言或者邮箱探讨

    展开全文
  • 案例介绍书接上回 【案例】求出矩阵最简型?...准备工作Python3.xnumpysympy预备知识施密特正交化线性无关向量组未必是正交向量组,如何从一个线性无关的向量组出发,构造出一个标准正交向量组,并且使...

    a2e6906c15372a618a554e2438d568f2.png

    案例介绍

    书接上回 【案例】求出矩阵的最简型?——sympy登场,今天我们来进一步编写我们的项目,从原理上来讲,上次我们能够求出一个矩阵的最大无关组,而这次,我们进一步将线性无关的列向量使用施密特正交化,化为正交向量组,顺便还进一步标准化。

    准备工作

    • Python3.x
    • numpy
    • sympy

    预备知识

    施密特正交化

    线性无关向量组未必是正交向量组,如何从一个线性无关的向量组出发,构造出一个标准正交向量组,并且使得两个向量组等价?通过施密特正交化即可。α 列向量组为线性无关的向量组,β 向量组为施密特正交化后的正交向量组。

    064e8445f59249ca39199f0d6babe303.png

    标准化过程:

    b20c7b99c346ee267ccca2e397562207.png

    代码汇总

     # coding: utf-8
     # !/usr/bin/python
     """
     @File       :   matrix.py
     @Author     :   jiaming
     @Modify Time:   2020/5/17 12:31
     @Contact    :   https://jiaming.blog.csdn.net/
     @微信公众号答疑:   codenough
     @Desciption :   None
     """
     import numpy as np
     from sympy import Matrix, GramSchmidt
     
     
     matrix = [[2, 1, 0], [2, 0, 1]]
     print("原矩阵:", Matrix(np.array(matrix)))
     
     rref = Matrix(np.array(matrix)).rref()[0].tolist()
     print("最简型:", rref)
     
     
     def std_print(o):
         L = []
         for i in [i.tolist() for i in o]:
             l = []
             for j in i:
                 l.append(j[0])
             # print(l)
             L.append(l)
         return L
     
     
     M = [Matrix(i) for i in matrix]
     o1 = GramSchmidt(M)
     print("正交化:", std_print(o1))
     o2 = GramSchmidt(M, True)  # 标准化
     print("标准化:", std_print(o2))

    运行结果

     原矩阵: Matrix([[2, 1, 0], [2, 0, 1]])
     最简型: [[1, 0, 1/2], [0, 1, -1]]
     正交化: [[2, 1, 0], [2/5, -4/5, 1]]
     标准化: [[2*sqrt(5)/5, sqrt(5)/5, 0], [2*sqrt(5)/15, -4*sqrt(5)/15, sqrt(5)/3]]

    后记

    我们这次进一步完善了我们的矩阵运算项目,当然他还有很多不足,比如之前就提到的用户交互不足,打包等等问题,这些问题,我们之后再解决吧。

    欢迎关注我的 CSDN 博客,里面有更多精彩知识分享。

    CSDN-专业IT技术社区-登录jiaming.blog.csdn.net

    1ced8e5ce771608086fcf40b78b21084.gif
    展开全文
  • 文章目录1、向量空间1.1 向量空间概念1.2 向量内积1.3 向量范数1.4 标准正交向量组1.4 Gram-Schmidt正交化1.5 向量正交表示2、信号空间2.1 信号能量2.2 信号内积2.3 信号范数2.4 信号相关系数2.5 ...
  • 格莱姆-施密特(Gram-Schmidt)正交化常用于求解向量空间的标准正交基,同时也是一种天然的求解矩阵的QR分解的方法,即将一个矩阵A分解为一个正交矩阵Q和一个上三角矩阵R的乘积,即A=QR。这里我们假设A是一个方阵,...
  • 同样,对于一个线性变换,只要你选定一基,那么就可以找到一个矩阵来描述这个线性变换。换一基,就得到一个不同矩阵。所有这些矩阵都是这同一个线性变换描述,但又都不是线性变换本身。 但是这样话,...
  • 5.3施密特正交化与正交矩阵1. 规范(标准)正交基定义设维向量向量空间一个基,... 基规范正交化设是向量空间一个基,要求一个规范正交基,就是要找一两两正交单位向量使与等价,这样问题称为把这个基规...
  • 本节介绍正交概念,以及将基变为正交基格拉姆-施密特(Gram-Schmidt)方法 0 回顾正交基 1 正交 如果向量x,y满足: 则称x与y正交(orthogonal)...则称这基是标准正交的(orthonormal) 3 格拉姆-施密特方法 具有欧
  • 知识概要 这一节从上一节结尾介绍的标准正交向量谈起,主要介绍标准正交向量组的性质与优点,以及将一组向量化为标准正交向量组的方法:Gram-Schmidt 正交化。二. 标准正交向量 2.1 回顾标准正交向量上节介绍过标准...
  • Gram-Schmidt过程可以将原空间基转变为标准正交基。正交向量 Orthonormal vectors满足如下条件的向量q1,q2……qn为标准正交: 换而言之,它们都具有单位长度1,并且彼此正交。标准正交向量是线...
  • 正交矩阵和Gram-Schmidt正交化

    千次阅读 2019-05-21 06:55:25
    今天我们学习一下正交向量(orthogonal vector)和正交矩阵(orthogonal matrix)。...注意准确说这组向量应该是标准正交向量(orthonormal vector),因为每个q向量长度都为1,即经过归一化的(normalization),但...
  • Gram-Schmidt正交化

    2020-08-21 21:24:05
    Gram-Schmidt正交化就是利用子空间中任意一组线性无关的向量组,计算出该子空间中一个彼此正交的向量组标准正交基)。 百度百科:...
  • 彻底理解施密特正交化

    千次阅读 2020-06-08 17:53:23
    从欧氏空间任意线性无关的向量组α1,α2,……,αm出发,求得正交向量组β1,β2,……,βm,使由α1,α2,……,αm与向量组β1,β2,……,βm等价,再将正交向量组中每个向量经过单位,就得到一个标准正交...
  • 目录:1、计算特征多项式2、矩阵的特征值、特征向量3、矩阵的对角化4、向量值的正交化与正交矩阵5、正交变换与二次型的标准化6、矩阵的对称性与正定性的判定7、常见矩阵的分解工具:WolframAlpha计算搜索引擎位...
  • 标准正交向量组则是一个正交向量组, 不过所有向量都是单位向量, 长度为111. 设q1,q2,...,qnq_1, q_2, ... , q_nq1​,q2​,...,qn​两两正交, m∗nm*nm∗n维矩阵QQQ各列分别是q1,q2,...,qnq_1, q_2, ... , q_nq1​,...
  • Gram-Schmidt正交化能够将任意一基转换为标准正交基,转换前后基所生成空间一致。 标准正交向量组向量\(\boldsymbol{q}_1,\boldsymbol{q}_2,\cdots,\boldsymbol{q}_n\)是标准正交的,当: \[ \boldsymbol{q...
  • 标准正交向量(Orthonormal vectors)标准正交向量是有一 满足: 换句话说,这组向量互相两两垂直并且每个向量长度为1., 自己和自己点乘等于1, 和别人点乘都等于0. 正交是一种比线性无关更严格要求,可以...
  • Gram-Schmidt正交化提供了一种方法,能够通过这一子空间上的一个基得出子空间的一个正交基,并可进一步求出对应的标准正交基。 这种正交化方法以Jørgen Pedersen Gram和Erhard Schmidt命名,然而比他们更早的...
  • 施密特正交化(Gram–Schmidt process)

    千次阅读 热门讨论 2009-11-18 15:06:00
    在线性代数中,如果内积空间上的一组向量能够张成一个子空间,那么这一组向量就称为这个子...Gram-Schmidt正交化提供了一种方法,能够通过这一子空间上的一个基得出子空间的一个正交基,并可进一步求出对应的标准正交
  • 本文主要内容 Contents应用初等变换求逆矩阵应用初等变换求解线性方程组化二次型为标准型求矩阵的特征根与特征向量向量组的标准正交化 & 矩阵的正交分解矩阵的初等变换我们先回顾一下,什么是矩阵的初等变换。 ...
  • Gram-Schmidt正交化提供了一种方法,能够通过这一子空间上的一个基得出子空间的一个正交基,并可进一步求出对应的标准正交基。 这种正交化方法以约尔根·佩德森·格拉姆和艾哈德·施密特命名,然而比他们更早的...
  • 实对称矩阵必可正交对角证明

    千次阅读 2018-08-05 13:36:26
    n阶矩阵A可正交对角化的充分条件是A是实对称矩阵,即若A是实对称矩阵则A必可正交对角。 首先,有以下定理: ...设A一个特征值为,对应特征向量为,将扩展为n维空间组标准正交基,记为:...
  • 向量空间中Fourier变换:DFT DFS DTFT

    千次阅读 2013-10-24 19:04:33
    持久动态系统一定存在振荡现象。从直观理解来说,不沿着圆运动物体终将停止,比如炸弹、人、火箭等不可逆转事物。 对于有限长度一段信号...不过它们不是标准正交,乘以1/sqrt(N)标准因子后才是标准正交基。 W
  • 两个性质正交矩阵有下面性质是正交矩阵当且仅当行(列)向量组一组标准正交基。注意:在中,利用施密特正交化法,可以轻松将任意一组基转化为标准正交基。详见以下视频:为了解答“行列式为1正交矩阵称为...
  • n维向量的概念及其线性运算 n维向量的概念 n维向量的线性运算 线性组合和线性表示 向量组的线性相关性 线性相关和线性无关 ...向量组的极大无关组和秩 ...向量组的秩与矩阵的秩 ...标准正交基和Schmidt正交化方法...
  • 正交矩阵有下面性质是正交矩阵当且仅当行(列)向量组一组标准正交基。注意:在中,利用施密特正交化法,可以轻松将任意一组基转化为标准正交基。为了解答“行列式为1正交矩阵称为旋转矩阵”原因,我们...

空空如也

空空如也

1 2 3 4
收藏数 64
精华内容 25
关键字:

向量组的标准正交化