精华内容
下载资源
问答
  • C++矩阵求秩问题
    千次阅读
    2020-09-27 16:04:51

    本来以为很简单,还是花了俺很久才解决
    step1 下载Eigen库
    Eigen官网

    step2 在clion中Cmake包含Eigen文件夹

    cmake_minimum_required(VERSION 3.17)
    project(untitled)
    
    set(CMAKE_CXX_STANDARD 11)
    
    include_directories("F://eigen")
    
    add_executable(untitled main.cpp)
    

    step3 利用奇异值分解求矩阵的秩

    #include <iostream>
    #include <Eigen/SVD>
    #include <Eigen/Dense>
    
    using namespace Eigen;
    
    int main()
    {
        Matrix<double,4,4> A;
        A<<1,2,3,4,
           0,2,3,4,
           0,0,3,4,
           0,0,0,0;
        JacobiSVD<Eigen::MatrixXd> svd(A);
        std::cout<<"A :\n"<<A<<std::endl;
        std::cout<<"rank:\n"<<svd.rank()<<std::endl;
        return 0;
    }
    

    撒花!!

    更多相关内容
  • C/C++求矩阵

    2018-10-08 19:13:07
    C/C++语言实现矩阵求秩,原理是高斯消元法实现矩阵求秩。之前我在网上找的C/C++语言实现矩阵的很多程序通不过大量的测试,此程序是本人经过大量的测试通过的。对于方阵和非方阵都能准确的出其,如果发现有...
  • 用于矩阵求秩

    2017-05-06 16:25:16
    矩阵求秩
  • C++ 求矩阵

    万次阅读 2016-09-22 18:06:25
    int getNumOfLeastColors(setint>& colorSet) {// 二进制矩阵,即消元,最后看斜对角线上有几个 1  的方法,就是求矩阵 你就是一个画家!你现在想绘制一幅画,但是你现在没有足够...

    网易笔试题:混合颜料


    下面 
    1. int getNumOfLeastColors(set<int>& colorSet) {// 求二进制矩阵的秩,即消元,最后看斜对角线上有几个 1  

    的方法,就是求矩阵的秩

    你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职程序员的你需要编程来计算出最少需要购买几种颜色的颜料? 
    输入描述:
    第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50)
    第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料.

    输出描述:
    输出最少需要在商店购买的颜料颜色种数,注意可能购买的颜色不一定会使用在画中,只是为了产生新的颜色。

    输入例子:
    29
    4096 8192 16384 32768 65536 131072 262144 524288 1048576 16 32 64 128 256 512 1024 2048 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 999999999 1000000000 15
    输出例子:

    27


    思路:将所有的数二进制展开,构成一个矩阵,通过消元只保留对角线上 1,即求矩阵的秩,最后得到 1 的个数即秩的大小,也就是最少需要的颜色数。


    C++实现:

    [cpp]  view plain  copy
    1. #include <iostream>  
    2. #include <set>  
    3. #include <vector>  
    4.   
    5. const int N = 8 * sizeof(int);// 整型 int 的二进制位数  
    6.   
    7. using namespace std;  
    8.   
    9. void getBinaryMat(const set<int>& s, vector<vector<int> >& bMat) {// 求每个数的二进制,存储在vector里面,最后得到二进制矩阵  
    10.     if(s.empty()) return;  
    11.     for(set<int>::iterator it=s.begin(); it != s.end(); it++) {  
    12.         vector<int> v(N);  
    13.         int flag = 1;  
    14.         for(int i=0; i < N; i++) {  
    15.             v[i] = (*it) & flag;  
    16.             flag <<= 1;  
    17.         }  
    18.         bMat.push_back(v);  
    19.     }  
    20. }  
    21.   
    22. int getNumOfLeastColors(set<int>& colorSet) {// 求二进制矩阵的秩,即消元,最后看斜对角线上有几个 1  
    23.     if(colorSet.empty()) return -1;  
    24.     vector<vector<int> > bMat;  
    25.     getBinaryMat(colorSet, bMat);  
    26.     const int Row = bMat.size();  
    27.     int r = 0, c = 0;  
    28.     for(c=0; c < N && r < Row; c++, r++) {// 从每一列开始,将每一列消到只有 1 个 1 或者全 0  
    29.         int i = 0;  
    30.         for(i = r; i < Row; i++) {// 寻找这一列第一个非 0 的行  
    31.             if(bMat[i][c] != 0)  
    32.                 break;  
    33.         }  
    34.         if(Row == i)  
    35.             --r;  
    36.         else {  
    37.             swap(bMat[r], bMat[i]);  
    38.             for(int k=i+1; k < Row; k++) {  
    39.                 if(0 != bMat[k][c]) {  
    40.                     for(int j=c; j < N; j++) {  
    41.                         bMat[k][j] ^= bMat[r][j];// 用第 r 行的 1 消除这一列上其他所有行的 1  
    42.                     }  
    43.                 }  
    44.             }  
    45.         }  
    46.     }  
    47.     return r;  
    48. }  
    49.   
    50. int main() {  
    51.     int n;  
    52.     while(cin >> n) {  
    53.         set<int> colorSet;  
    54.         int color;  
    55.         for(int i=0; i < n; i++) {  
    56.             cin >> color;  
    57.             colorSet.insert(color);  
    58.         }  
    59.         cout << getNumOfLeastColors(colorSet) << endl;  
    60.     }  
    61.     return 0;  
    62. }  
    展开全文
  • 学数值计算还有复变函数了喔,矩阵忘干净了。又看了一遍 蓝棕 的相关的讲解,总结一下。1.向量是什么?从初到末的箭头(物理角度,表示一种运动过程)有序的数字列表(计算机/数学角度)[1,2]加和数乘运算有意义的...

    学数值计算还有复变函数了喔,矩阵忘干净了。又看了一遍 蓝棕 的相关的讲解,总结一下。

    1.向量是什么?

    • 从初到末的箭头(物理角度,表示一种运动过程)
    • 有序的数字列表(计算机/数学角度)[1,2]
    • 加和数乘运算有意义的anything(抽象意义)

    12两种理解之间的关系就是线性代数的奥秘,即几何角度与数值角度。

    一个向量的坐标由一对数构成,可以理解为从原点到终点的箭头,描述运动过程。

    比如,规定好坐标平面的单位,[1,2],第一个数表示沿x轴走了1个单位;第二个数表示沿y轴走了2个单位。从原点出发的箭头和坐标向量一一对应。

    向量的相加和数乘,从1运动效果的角度来看,十分直观。即总效果等于各个分量上的效果和,所以向量的相加和数乘可以变为坐标运算。

    2.线性组合,张成空间与基

    向量的另一种理解:缩放分量并且相加,它表示一种变换。例如在正交基

    下,[3,2]表示的变化为i伸长为原来的三倍,j伸长为原来的2倍,最后把两者相加。在这种理解下,基向量其实就是用来缩放的对象。

    为基,在
    的拉伸下表示向量
    ,我们把这叫做线性组合,线性的意思即固定其中一个参数,拉伸后的向量始终在一条直线上移动,如图。

    284471dd67b29a08a4d4802593195c3a.png

    所有可以表示为给定向量线性组合(通过向量加法和数乘能得到)的向量的集合叫,张成空间。

    当新增一个向量,这个向量落在之前的向量的张成空间时,我们说新增向量没有对张成空间做出任何贡献,称这几个向量是线性相关的,代数上理解即新增向量可以被线性表出。

    向量空间的一组基是张成该空间的一个线性无关的向量集。

    此处可以想一下三维空间是如何张成的。

    为了更简洁的表示更多的向量,我们可以以终点代替箭头来表示向量。

    3.矩阵与空间变换

    变换的意思类似函数,给定一个向量,输出一个向量。

    线性变换需要满足:直线变换后仍保持为直线,不能有所弯曲;原点必须固定不变。

    直观上理解:坐标网格线保持平行且等距分布。

    如何表示变换呢?只要描述基的变换就可以了,即描述

    变换后去哪了。如图。

    c2e09504d00aff8ec44cba41d56c7977.png
    i变换到(1,-2),j变换到(3,0),原来的向量(-1,2)表示-1i+2j,现在变到-1×(1,-2)+2×(3,0)=(5,2)

    只要知道

    去哪了,我们可以推断出任何向量变换后的位置。

    所以,二维空间中,描述一个变换只要4个数,即

    变化后的两个坐标。我们将这两个坐标放在一个2×2的方格中,称为2×2矩阵。这种理解与之前向量表示缩放基向量再相加的思想很契合!

    举个栗子!再次感受一下矩阵变换的过程!

    58084d9d27d8fce6adb9e91f1270848b.png

    如果变换后的两个向量落在一条直线上,那么这两个向量会张成一个一维空间

    d5c543118a9be0ba0318cb21cb74b741.png

    注意此时的矩阵只是一个记号,它表示一种线性变换。

    我们规定一种写法,用向量在右,矩阵在左来表示这种变换。

    f4397b910491d48f90ef346a759e1f8f.png

    讲到这里,变换的内容就描述完了。下面想想几个常见变换的矩阵表示~~

    • 逆时针旋转90度
    • 剪切变换

    要记住,矩阵,是描述变换的。

    4.矩阵乘法与线性变换复合的联系

    两次变换---复合变换的表示

    例子是,先逆时针再剪切变换,

    ,即

    b5c782fcc2b1be3f4758731a7b2dcf87.png

    由此,我们定义矩阵的乘积

    ,从右向左读。

    可是,矩阵的运算法则是怎么来的呢?对于复合变换

    我们首先考虑

    的变化过程 :

    再考虑

    的变化过程:

    所以,从变换的效果来看,我们得到了矩阵的运算法则,即

    这种变换效果的理解过程也很好的说明了,为什么矩阵不满足交换律,满足结合律。

    交换律改变了作用顺序,而结合律不会。

    推广到三维,

    同理

    d487c3b6e5786767f8ed0d09118a3e93.png

    5.行列式的介绍及其几何意义

    我们发现,有的变化对空间有拉伸作用,有的是压缩作用。

    我们从

    所在单位正方形来看面积的变化比例,就能知道其他任意区域的面积变化比例(网格线平行等距的原因)

    这个特殊的缩放比例,被称作行列式。比如

    ,说明面积不缩放。

    行列式为负值时,表示变换改变了空间的顺逆方向。想像一个变换,变换过程中

    不断接近直至重合,又远离,行列式由正值不断趋于0然后再变为负值是很自然的。从二维的角度看,即看
    变换后两者的左右颠倒了没。(类比角速度方向,右手法则)

    而行列式等于0时,如

    表示线性变换将空间压缩到一条线(甚至是一个点)上。这告诉我们,只要看行列式就能了解矩阵所代表的的变换是否将空间压到更小的维度上。

    推广到三维,即体积的变化缩放比例(方向的话,伸出你的三维小鸡爪,类比手性系)。

    问题是,行列式是如何计算的呢?

    二维情形下,如果有一个元素值为零。从伸缩角度很好的能理解,如下图:

    6e7b9639ede27bd37023cb8d7a5f324d.png
    i拉伸为a倍,j在垂直方向拉伸d倍,行列式为ad

    如果都不为零的话,稍稍复杂一丢丢,也很好懂。

    a32298b45b23c0630b48994c4424d001.png

    这种对行列式的理解也从作用效果说明了,为什么

    6.逆矩阵,列空间,秩与零空间等概念的直观介绍

    线性方程组来了。

    3d23e05a56832b8b137a39f54dd734f7.png

    从变换的角度来理解这个方程组:

    ,that is,我们需要找一个向量x,使得x经A变换后的向量与v重合。

    首先考虑变换矩阵A的行列式:

    1)行列式不为零时,在线性变换下,网格平行等距,变换前的点和变换后的点在坐标平面上是一一对应的,通俗的理解就是可以变过去,也可以再变回来的。由v到x变回来的矩阵通常被称为A的逆,记为

    。从效果上理解,

    知道了A的逆,我们就可以解方程了

    (几何理解即逆向变化,看v跑到哪里了)推广到多维同样

    只要行列式不为零,都能找到逆矩阵,都可这样解。

    2)行列式为零时,压缩后不能解压。不能一对多。但即使不存在逆变换,解仍然可能存在。

    如果v恰好在x变换后的线上,解存在。

    但对于三维来说,变换压到一个面和一条线行列式都为零。太广泛。所以引入秩的概念。

    当变换的结果为一条直线时,结果是一维的,我们称这个变换的秩为1;

    变换后的结果为一个面时,压缩并没有那么严重,秩为2;

    变换后仍充满整个空间的,秩为3。

    所以说,秩代表着变换后列空间的维数。而变换后基向量的张成空间就是所有可能的变换结果。

    零向量一定在变换后的空间中,对于非满秩矩阵来说,会有一系列向量被压缩到原点;变换后落在原点的向量,被称为矩阵的“零空间”或“核”,也就是v是零向量时方程的所有的解的集合。

    非方阵矩阵的理解:考虑输入与输出个数。

    当输入二维,输出为三维时,如变换矩阵

    ,两个列向量为变换后的张成空间的基。只能张成一个平面,此时的三维是伪三维。

    当输入三维,输出二维时,如变换矩阵

    ,降维。

    其实还有从二维到一维的变换,判断变换是不是线性的很直观的方法是,看原来直线上等距分布的点,变换后是不是还是保持直线的等距分布。这句话很重要,接下来将用到。

    7.点积与对偶性

    我们知道,如果有两个长度相同的向量,求他们的点积就是把各分量相乘再把结果相加。

    点积还有一个形象的意义,就是将其中一个向量投影的长度与另一个向量做数乘。

    点积为什么会和投影有关呢?为什么几何定义一个向另一个作投影这件事看起来没有那么对称,但其实点乘结果与向量顺序无关?

    首先,先搞明白,点积的几何理解其实是对称的。

    如果两个向量的长度恰好相同,那么利用对称性可知,两者在彼此上的投影数量都相同。

    现在我们把其中一个变做原来的k倍。单位长度的两个向量仍然具有对称性。而投影数量是单位向量投影数量的k倍,把倍数最后乘上即可。

    所以,缩放对于两个向量的影响最后作用到点积,效果是完全一样的。

    下面来探究点积与投影的关系。

    我们首先来看一个矩阵线性变换的例子,

    ,把i变换成数轴上的1,j变为数轴上的-2,运算结果为-2。

    我们发现

    左边从矩阵的角度来理解,是一种数值运算,但是和右边点积的运算过程一样。

    如果投影能和1×2矩阵变换建立几何联系,由于坐标运算与点积运算形式上一样,我们就能搞清楚点积与投影之间的关系了。

    首先,由于投影变换下,直线上等距分布的点投影到向量上仍然等距,所以投影变换是线性变换,可以用一个1×2矩阵来描述。求这个矩阵,由几何解释,我们只需要知道原来的

    投影到这个向量上的两个坐标值就可以了。

    神奇的地方出现了!由对称性,

    投影到向量
    上的坐标值等于
    上投影的坐标值。即投影变换为
    ,而
    恰好是
    向量的转置!

    所以,向量在

    上的投影数值上等于
    和那个向量的点积!精彩!

    8.叉积及其几何意义

    我们都知道,叉积的数值表示面积,体积,whatever。

    正负与叉乘的顺序有关。二维为例,逆时针为正。

    b1d3b9e195923423655fb6aafaa1542f.png

    我们首先定义,叉积运算的结果的大小是有向面积。

    所以二维向量的叉乘积是两个向量组成矩阵的行列式,也就是原来的

    所在单位正方形变换后的面积。正负也很契合。

    也不难看出

    不过,其实真正的叉积其实是通过两个三维中的向量生成一个新的三维向量,

    向量的长度是平行四边形的面积,方向与
    所在的平行四边形的面垂直,遵循右手法则(食指×中指=拇指!)

    计算叉积时,我们有一个运算的小技巧,如下图

    4784117e5d237a39b59dc0ebfb9deef3.png

    这个技巧是咋来的呢?

    首先,由前几部分的内容可知,从空间到数轴的线性变换都可以由一个一行的矩阵实现,emm也与点积相同。

    证明思路:

    1)定义一个由三维到一维的线性变换

    2)找到那个一行的矩阵(或是对偶向量)

    3)说明那个一行的向量就是

    由二维的“假叉积”,我们很容易想到,三维中的行列式代表体积,也就是体积伸缩的比例,是不是三维叉积的结果是

    呢?

    显然不是,行列式是一个数,而叉积的结果是向量。

    那如果稍稍改动一下呢?

    把行列式其中一列变为变量,得到

    于是我们得到了一个输入为三维,输出为一维的变换,形象上理解就是得到了一个函数,这个函数能计算以vw为底,自变量为高的平行六面体的体积。很显然,这个函数是线性的,用矩阵来描述这个函数

    把行列式两项展开,与点积展开式作比较,就能得到p的分量的计算方法了。

    这与把i,j,k放进行列式的结果一致。

    3794badafbbae371c21e6f6c9779c8ca.png

    如果能证明这个p向量是v×w的话,就证毕了。

    下面我们考虑,什么样的p能满足以上的性质呢?

    我们知道,一方面,点积的作用是做投影相乘。把

    在p上投影)
    相乘

    另一方面,行列式表示体积,大小为vw的面积乘上

    在垂直于vw上的投影)

    所以从这两方面相等的角度来看,p的大小应该是vw的面积,方向是垂直于vw所在平面的,也就是v×w。

    至此,我们证明了,p的分量就是v×w。

    Q.E.D 开森

    9.基变换的概念及其矩阵表示

    我们之前提到,坐标的意义是缩放基向量,然后再将所有的方向的结果相加。

    所以,坐标表示的向量与被缩放的基向量的选取有密切的联系。也就是说,在我们用坐标表示向量时,首先需要明确缩放的基向量的指向,还要求基向量为单位长度。

    试想,除了选互相垂直相等的基向量,我们还可以有许许多多奇怪的选法。选法不同,表示同样的向量,我们的坐标肯定也不一样。向量与坐标之间的转化通过选取坐标系实现。

    这就像每个世界里都有每个世界的描述东西的语言(坐标,也就是数组),语言不同但是描述的东西(向量)可能相同。(注意奥,这里不同的世界在零点的选取上达成共识。

    例如,想象小红的世界里,两个基向量

    呈钝角。可是小红用坐标描述
    的时候,在她眼里,由缩放相加的思想,两个基向量的坐标就是

    可是想象小蓝的世界里,他的基向量选取的是互相垂直的

    。用小蓝的坐标描述同样的
    ,坐标变为了

    ab7fd114dbed304e9e2e663de7709705.png

    既然语言不通,接下来一个很自然的问题就是,如何在不同的坐标系之间进行转化。如何进行翻译,让小红和小蓝能够互相理解呢?

    比如小红用坐标

    描述一个向量时,她是在说

    从小蓝的角度看,

    的坐标为
    的坐标为

    于是

    由红语翻译到蓝语就是

    我们来看一下这个过程发生了什么:我们用某个给定的坐标分量与小红的两个基向量分别相乘,然后又把结果相加了。,这通操作是不是似曾相识?对,是矩阵乘法。

    众所周知,矩阵是表示变换的。那么从变换的角度,我们再来理解一下这个过程。

    小蓝视角(以下坐标与变换矩阵基于小蓝视角表示):

    小红基向量构成的矩阵

    表示的变换是将小蓝的基向量
    ,
    变到小红的基向量
    ,

    这里注意:由于线性变换是不改变缩放系数的,我们只描述基向量的变化后的去向,而不改变基向量缩放相加的组合系数。(也可以理解成,从前后两个视角看,线性变换不改变坐标。就是从变换前小蓝眼中的坐标,和变换后小红眼中的坐标是一样的。

    小蓝尝试理解

    坐标在小红的世界里表示什么。小蓝首先想自己的世界里的
    ,然后用用变换得到小红眼中的
    ,这个变换后的向量就是小蓝视角下小红的向量表示。于是,翻译完成!

    这个矩阵,将小红语言描述的向量坐标,也就是小蓝误解的向量坐标,翻译成了小蓝能正确get到的真实向量坐标。

    e2c4eef7e7987add6aa8856336a7f010.png

    上图看起来感觉反了。怎么小红的语言通过 蓝到红的矩阵反倒变成了 小蓝的语言呢?

    这样想矛盾的原因在于,这几个表示的视角不统一。一会小蓝眼中一会小红眼中。

    我们应该把

    当做小蓝眼中的误解,而不是小红眼中真实,小蓝的误解向量乘上小蓝眼中的变换矩阵,把小蓝眼中误解的变成小蓝眼中真实的。这样想运算过程小蓝视角才是统一的。

    我个人习惯于这样理解:

    这个矩阵是以小蓝为基向量表示的,任何别的基下的坐标乘上这个矩阵得到的缩放系数是以小蓝为基向量的,于是乘上之后说的就是蓝语。

    同样的,想由蓝语翻红语,我们只需要乘上

    的逆。

    至此,不同坐标系下单个向量的转化已经完成。下面我们来解决不同坐标系下,描述变换的矩阵之间是如何转化的。

    比如,小蓝眼中的逆时针旋转90度变换

    ,在小红眼中是如何表示的呢?

    由于两个列向量追踪的是

    的去向,显然小红眼中的变换矩阵并不是

    我们还拿小红眼中

    这个向量做变换。很自然的思路是,首先将红语翻蓝语,作变换,再将蓝语翻回红语,于是变换后应为

    所以,左边三个矩阵的复合应该就是小红眼中的变换矩阵!

    ,嘿嘿,这就是相似矩阵。所以说相似矩阵同一种变换在不同基下的表示。

    这个矩阵不同视角的变换在下一部分大有用处!

    10.特征向量与特征值

    试想一个普通的线性变换

    ,设
    吧。绝大部分向量在变换后都偏离了原来的位置,但是会有特殊的
    ,使得变换后的向量还是在原来向量的直线上。这时矩阵对它的作用仅仅是拉伸或者压缩而已,如同一个标量。

    在这个例子里,

    就是这样一个特殊的向量,变换后被伸长3倍。与
    共线的向量也如此。

    其实还有一个比较隐蔽的向量

    ,被拉长为2倍。

    这些特殊的向量就被称为变换的特征向量,每个特征向量都有一个拉伸的倍数,被称作特征值。特征值为负时表示变换后的向量与原向量反向。

    特征向量有什么应用呢?比如描述3维空间中的旋转变换,显然特征值为1。什么样的向量是变换前后不变的呢?只有旋转轴上的向量。把三维旋转看成绕某个轴旋转一定角度,比矩阵描述直观的多。

    下面看看特征向量怎么求。

    其实是由

    ,解出来特征向量和特征值。

    首先把右侧的数乘用变换表示,即

    ,整理得

    这个式子恒成立,说明这个变换降维了。而空间压缩对应的就是矩阵的行列式为零

    均可解。

    不过,二维变换不一定都有特征向量,比如旋转90度变换。(其实是特征值为复数,深入讨论可把复数理解为变换)

    特征值也可以有无数个,比如

    华点来了,我们引入特征基的概念。

    如果我们的基向量恰好是特征向量,变换矩阵就会是一个对角矩阵,矩阵的对角元是它们所属的特征值。这时是变换就只是横竖方向改变坐标网格的大小了。

    对角矩阵在很多运算中都有很好的性质,比如和自己多次相乘的结果更容易计算,只是对角元不断的乘自己。

    但是基向量恰好为特征向量的情况很难遇到。结合上一part内容,我们尝试换基。

    如果特征向量能够张成全空间,我们就可以变换坐标系使得这些特征向量就是基向量。

    啊这就是相似对角化。

    11.抽象向量空间(有点超纲,最近好忙周一更)

    展开全文
  • 矩阵的谱分解(可对角化矩阵——满可逆)谱分解定理:设 为一个n阶可对角化矩阵,A的谱为 其中 的重数为 ,则存在唯一一组s个n阶方阵 ,满足(1) (2) (3) (4) (5) 这些矩阵 称为矩阵A的成分矩阵或主幂等矩阵。...

    835166ff9da19f33f9ed917cdb4839f4.gif

    矩阵的谱分解(可对角化矩阵——满秩可逆)

    谱分解定理:设 d1a0d216-1d2c-eb11-8da9-e4434bdf6706.svg 为一个n阶可对角化矩阵,A的谱为 d2a0d216-1d2c-eb11-8da9-e4434bdf6706.svg 其中 d3a0d216-1d2c-eb11-8da9-e4434bdf6706.svg 的重数为 d4a0d216-1d2c-eb11-8da9-e4434bdf6706.svg ,则存在唯一一组s个n阶方阵 d6a0d216-1d2c-eb11-8da9-e4434bdf6706.svg ,满足
    (1) d9a0d216-1d2c-eb11-8da9-e4434bdf6706.svg     (2) daa0d216-1d2c-eb11-8da9-e4434bdf6706.svg      (3) dca0d216-1d2c-eb11-8da9-e4434bdf6706.svg      
    (4) dda0d216-1d2c-eb11-8da9-e4434bdf6706.svg          (5) dea0d216-1d2c-eb11-8da9-e4434bdf6706.svg

    这些矩阵 e0a0d216-1d2c-eb11-8da9-e4434bdf6706.svg 称为矩阵A的成分矩阵或主幂等矩阵。一般成分矩阵不一定是Hermite矩阵,因此, e1a0d216-1d2c-eb11-8da9-e4434bdf6706.svg 中的诸向量 e3a0d216-1d2c-eb11-8da9-e4434bdf6706.svg 未必是正交的。

    谱分解的计算例子:

    求矩阵的谱分解, e5a0d216-1d2c-eb11-8da9-e4434bdf6706.svg

    解:e8a0d216-1d2c-eb11-8da9-e4434bdf6706.svg 所以A有特征值 eaa0d216-1d2c-eb11-8da9-e4434bdf6706.svg (两重)。通过齐次线性方程组,可得对应于特征值的特征向量分别为:

    eba0d216-1d2c-eb11-8da9-e4434bdf6706.svgeca0d216-1d2c-eb11-8da9-e4434bdf6706.svg ,则可以求出

    eea0d216-1d2c-eb11-8da9-e4434bdf6706.svg

    这里计算P的逆矩阵很烦人的,可以用初等行变换的方法进行求解。因此,

    efa0d216-1d2c-eb11-8da9-e4434bdf6706.svg

    故A的谱分解为 f1a0d216-1d2c-eb11-8da9-e4434bdf6706.svg . A的幂为 f2a0d216-1d2c-eb11-8da9-e4434bdf6706.svg 说明谱分解本质上还是为方便求解矩阵幂服务的。前面我们知道矩阵的对角化,可以方便我们求逆。矩阵的满秩分解可以方便我们求逆,现在我们知道矩阵的谱分解可以方便我们求幂。但是谱分解和对角化都要求矩阵是满秩可对角化的,如果不满足这些条件的矩阵能够有方便的形式求解吗?答案是肯定的,矩阵的Jordan标准型就是专门为矩阵求幂设计的。

    矩阵求逆问题也是重点。但是矩阵求逆为了在数值上计算稳定,数学家们想出了很多将矩阵分的方法,后面我们将会看到矩阵的LU三角分解,QR正交分解,奇异值分解等,都是为了在数值上获得矩阵求逆的稳定方法而设计的。

    矩阵的LU分解(n阶方阵,不一定存在)

    LU分解实际上是高斯消元的另一种看法。即对于任意的n阶方阵A,存在L是单位下三角矩阵,U是上三角矩阵,使得 f3a0d216-1d2c-eb11-8da9-e4434bdf6706.svg. 这里对矩阵A只要求是方阵,其他的要求都没有。

    考虑高斯消元,即存在初等矩阵 f5a0d216-1d2c-eb11-8da9-e4434bdf6706.svg ,对矩阵A进行初等行变换,可以将A变为上三角矩阵,该上三角矩阵就是U.   举个例子: 对于任意的3阶矩阵,我们能通过左乘初等矩阵,即 f7a0d216-1d2c-eb11-8da9-e4434bdf6706.svg(不交换行) 那么我们有

    faa0d216-1d2c-eb11-8da9-e4434bdf6706.svg

    可以发现,L必定为单位下三角矩阵。因为我们的初等变换都只涉及对A的下三角部分进行变换,另外,每一个初等矩阵的逆都不会改变主对角元素(都是1)。

    从高斯消元的角度可以看出,如果矩阵A最后一行不能被前面的r(A)行线性表示,则就找不到初等矩阵,使得A经过初等行变换后变成U,则三角分解不存在。

    如果方阵A可逆,并且有三角分解,则该分解是唯一的。(因为最后一行可以被前面r(A)唯一的线性表示。)

    863d6eed947aa1f04372e87d8c747d1d.png

    矩阵QR分解(可逆矩阵存在)(唯一)

    矩阵可逆也不一定存在三角分解,这是非常令人遗憾的。矩阵正交(Q)三角(R)分解是对任何可逆矩阵都存在的理想分解。其原理是斯密特正交化。首先给出QR分解的定理:

    00a1d216-1d2c-eb11-8da9-e4434bdf6706.svg 且A为满秩的,则存在唯一的酉矩阵U和对角线元素均为正的上三角矩阵R,使得 03a1d216-1d2c-eb11-8da9-e4434bdf6706.svg .(当然对于实数矩阵,这里的酉矩阵类比为正交矩阵Q即可)

    一个很重要的推广是矩阵A可以是非方阵,只需要列满秩即可, 04a1d216-1d2c-eb11-8da9-e4434bdf6706.svg , 则矩阵 07a1d216-1d2c-eb11-8da9-e4434bdf6706.svg 为r个列向量构成的标准正交基, 0aa1d216-1d2c-eb11-8da9-e4434bdf6706.svg 为对角线元素为正的上三角矩阵。分解也是唯一的。

    计算过程:

    以实数矩阵为例,对于列满秩矩阵 0ca1d216-1d2c-eb11-8da9-e4434bdf6706.svg,求其QR分解。

    解:令 0da1d216-1d2c-eb11-8da9-e4434bdf6706.svg 由斯密特正交化方法得:

    0ea1d216-1d2c-eb11-8da9-e4434bdf6706.svg

    从而有:

    0fa1d216-1d2c-eb11-8da9-e4434bdf6706.svg

    值得注意的是上三角矩阵R是怎么计算的?

    对斯密特正交化的过程进行变形得:

    12a1d216-1d2c-eb11-8da9-e4434bdf6706.svg

    写成矩阵形式:

    14a1d216-1d2c-eb11-8da9-e4434bdf6706.svg

    所以在计算QR分解时,把步骤写清楚,尤其是在计算 17a1d216-1d2c-eb11-8da9-e4434bdf6706.svg 时,因为每一个系数都会成为矩阵的元素。

    矩阵的奇异值分解(普适性很强,要求很低)

    对标正规矩阵(normal matrix),正规矩阵都可以酉对角化。这是非常好的性质。但是非正规矩阵是否具有类似的性质呢?注意到正规矩阵满足 19a1d216-1d2c-eb11-8da9-e4434bdf6706.svg ,其中 两个酉矩阵互为共轭转置,我们能不能放弃这一性质,使得非正规矩阵矩阵也有类似的分解?当然可以。

    奇异值分解定理:设 1aa1d216-1d2c-eb11-8da9-e4434bdf6706.svg1ba1d216-1d2c-eb11-8da9-e4434bdf6706.svg 则存在m阶和n阶酉矩阵U和V,使得 1da1d216-1d2c-eb11-8da9-e4434bdf6706.svg ,其中 1ea1d216-1d2c-eb11-8da9-e4434bdf6706.svg , 1fa1d216-1d2c-eb11-8da9-e4434bdf6706.svg 称为奇异值。

    这里不谈证明,直接给出奇异值分解的计算方法。

    20a1d216-1d2c-eb11-8da9-e4434bdf6706.svg 那么分别求其正规矩阵形式的酉对角化,即有

    23a1d216-1d2c-eb11-8da9-e4434bdf6706.svg

    利用上面两个等式,可以分别求出 25a1d216-1d2c-eb11-8da9-e4434bdf6706.svg 矩阵。

    26a1d216-1d2c-eb11-8da9-e4434bdf6706.svg ,其特征值分别为1,3,对应的标准正交特征向量为 2aa1d216-1d2c-eb11-8da9-e4434bdf6706.svg 这里就求出了U矩阵。

    接着我们有

    2ca1d216-1d2c-eb11-8da9-e4434bdf6706.svg 其对应的特征值为1,3,0(注意这里第三个特征值必须为0)

    对应的特征向量可以计算分别为

    2fa1d216-1d2c-eb11-8da9-e4434bdf6706.svg

    其中 33a1d216-1d2c-eb11-8da9-e4434bdf6706.svg 可以不用计算,因为他必须和前面两个特征向量正交。这样我们就求出了V。然后根据奇异值分解定理,可以得到

    36a1d216-1d2c-eb11-8da9-e4434bdf6706.svg

    Chelesky分解(实正定矩阵)

    chelesky分解是针对实正定矩阵而言的。正定矩阵一般默认是对称的。实正定矩阵A必存在三角分解A=LU,且存在唯一的对角元素均为正的下三角矩阵G,使得 37a1d216-1d2c-eb11-8da9-e4434bdf6706.svg .举个简单的例子, 38a1d216-1d2c-eb11-8da9-e4434bdf6706.svg A是正定的。存在初等变换 39a1d216-1d2c-eb11-8da9-e4434bdf6706.svg ,使得

    3ba1d216-1d2c-eb11-8da9-e4434bdf6706.svg 因为A对称,对A的初等行变换,其转置就是对A的初等列变换。因此可以化为对角矩阵(对实对称矩阵的对角化)。那么令

    3ca1d216-1d2c-eb11-8da9-e4434bdf6706.svg 

    这是只需要进行一次初等行变换的条件下,计算方法。当需要多次进行初等行变换时,计算是类似的。此时需要将所有的初等变换看成一个初等变换,把它当成 3da1d216-1d2c-eb11-8da9-e4434bdf6706.svg 即可。

    *文章内容整理于https://zhuanlan.zhihu.com/p/52890135

    ------------------------------

    欢迎关注爱数学之家, 一个致力于传播数学文化的公众号

    e2dd38c07577421e9499bcb04db544a1.png

    展开全文
  • 这样就可以把向量空间的方法用来解决与矩阵秩相关的问题. 比如: 如果B是另外一个矩阵且BA = O, 要求证明 rank(A) + rank(B) ≤ m这时, 如果将 A看成若干个列向量拼起来的, 我们就很容易看出 A的列向量都是齐...
  • 点击上方蓝字关注无距书乡获取持续更新在开始今天的正式内容之前,先补充一个创建矩阵的方法——由向量组合成矩阵。A=[1;2;3],B=A+3,C=B+3,A, B,...在matlab中求矩阵用rank()命令,如:前述矩阵D的,通过...
  • 渐渐的你越来越想问候矩阵创始人的家人,你越来越想知道,到底是谁,为了解个方程组竟然还要定义一个新概念!而且还有如此多的子概念,子子孙孙无穷匮也!那么我们不妨就浅析一下,这矩阵,除了解方程的工具,他到底...
  • 知识要点:矩阵的本质矩阵的计算公式实例演示背景矩阵计算是我们经常碰到的一个问题。在几乎所有跟“学问”二字稍微沾点边的东西里,矩阵这个家伙从不缺席。那Excel在其中扮演什么样的角色呢?矩阵是什么呢?矩阵...
  • 实现了计算一个矩阵的性质:,行列式,迹,矩阵转置,逆矩阵和方阵,最大可支持40行40列。矩阵的行(row)之间必须进行换行,元素间必须用空格隔开。输入计算器的矩阵必须是每个值都为数的矩形矩阵。此外,你可以...
  • 最近在学习矩阵相关知识,但是其抽象的解释让人摸不着头脑,通过浏览一些博客的内容和自己的理解,本文通过通俗的语言将矩阵的内涵做了总结。其中除了书本和个人观点,部分引用博客。本文主要帮助大家理解矩阵,但不...
  • 83 80 85 求矩阵的行数 > nrow(mdata)[1] 3 求矩阵的列数 > ncol(mdata)[1] 5 求矩阵的行维与列维 > dim(mdata)[1] 3 5 两个矩阵的内积 第一个矩阵的列数应与第二个矩阵的行数相同 m1 m2 m1 %*% m2 [,1] [,2][1,]...
  • 点击上方蓝字关注无距书乡获取持续更新大家好,今天终于要开始介绍matlab中的矩阵了,矩阵是matlab这个软件的灵魂。从Matlab这个名称的由来(Matrix 和 Laboratory 的合并简写)即可知矩阵这个成分在matlab 中的重要性...
  • 对一组给定的向量,线性独立是一个重要的性质。如果不存在一组标量a1,a2,•••,an(它们不构成零向量),使得 aX=0 则向量x1,x2,•••,xn线性独立。 确定一组向量是否线性独立的方法之一是试图从这组向量...
  • 矩阵是由m*n个数排列成的m行n列的数表,图是‘节点’和‘边’的一个集合,两者之间存在着联系。本文探索以矩阵为工具运算‘图’中的元素。 在图中,两个‘节点’之间用‘边’联系。边是向量,我们用-1表示起点,1...
  • 2. 矩阵求秩 3. 矩阵QR分解 4. 矩阵行列式和逆 [由于使用double做为基本类型,运算后对误差会进行过滤操作(可调整)] 5. 矩阵转置 6. 矩阵大小设置 7. 矩阵元素输入输出 可作为C++基础语言学习的资料...
  • 本节主要介绍最小多项式与若尔当标准型的相关知识,这是考研中常考的一部分内容,几乎每个院校都有所考察,对于若尔当标准型,请大家先把第八章 矩阵的知识掌握,这样有利于更好的熟悉这一块内容,在真正考试的时候,...
  • Numpy 科学计算库中既可以创建数组,也可以创建矩阵,这两者究竟有哪些相似与不同之处呢?下面我们一起来解开这个疑惑。1 创建方式我们先来看一下三个例子。应用示例1:# 创建矩阵2 X 2的矩阵 A_mat 和 二维数组 A_...
  • 求矩阵

    2022-04-07 18:47:16
    求矩阵
  • 之前介绍了如何将一个矩阵化成上三角矩阵,并且提到了矩阵可以通过上三角矩阵轻松得出,就是上三角矩阵中非零行的个数,不知道怎么将一个矩阵通过初等行变换的伙伴们可以参考我的上一篇文章 ...
  • C++矩阵C++矩阵运算

    2019-03-17 15:30:29
    封装好的矩阵类,提供运算化间求秩等功能,全部在Main函数上方
  • Normal Equation对于损失函数,可以使其导数为零,...上面两个公式是损失函数 对 和 进行偏导。当导数为0时,可以求得损失函数的最小值,即由上面两个公式可以得到最优解 和 。最优解为:其中, ,即为 的均值。以...
  • 【相似矩阵要点总结】其实整个相似矩阵的重点就在以下四张图里,算法涉及到三阶带参行列式的求解、初等行变换求解方程组、和施密特正交化,只是这一章我们新学了很多概念和知识点,需要在不同的情境下去使用这个算法...
  • 自制C++矩阵计算器

    2018-08-11 23:26:39
    自制的通过CMD来显示的矩阵计算器,压缩包内含头文件及源文件。可以实现矩阵加、减、乘、除(逆后相乘)、逆、求秩、转置和行列式大小。东北大学中荷学院学生可能会需要到。
  • C语言实现矩阵求解分析

    千次阅读 2022-03-19 20:09:14
    从数学角度来说矩阵就是矩阵中线性无关的行向量的最大个数,并且初等行变换和列变换均不会影响矩阵的大小,为了实现这一过程常使用全选的高斯消去法将矩阵变为上三角矩阵,则其中非零的行向量个数就是矩阵的...
  • C++矩阵

    千次阅读 2022-01-21 18:19:58
    C++课程设计,设计矩阵类。
  • 求矩阵秩的全选主元高斯消去法、对称正定矩阵的乔里斯基分解与行列式的值、矩阵的三角分解 、一般实矩阵的QR分解、一般实矩阵的奇异值分解 、广义逆的奇异值分解法、约化对称矩阵为对称三对角阵的豪斯荷尔德变换...
  • C++实现矩阵转置

    万次阅读 2018-07-24 11:14:28
    一个三行三列的转置矩阵。 链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=29 输入 第一行一个整数n&lt;20,表示有n组测试数据,下面是n组数据; 每组测试数据是九个整型数(每个数都不大于...
  • c++实现矩阵类以及矩阵的相关运算 每次写线代作业的时候,自己懒的进行矩阵相关运算,想借助计算机,但这需要重新启动vscode,因为vscode的配置是和文件夹走的,我的c++和python不是一个文件夹,由于这一学期还是写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,749
精华内容 699
关键字:

c++求矩阵的秩

c++ 订阅