线性代数考研,线性代数考研哪个老师好

原创:@刘亚曦 转载需注明出处

没有任何东西比几何图形更容易印入脑际了,因此用这种方式来表达事物是非常有意义的。

——笛卡尔

证明的本质不在于纯粹的观察其计算结果,而在于深刻理解其背后的实际意义。

——刘亚曦(数学专业的同学请跳过,让我装一下13)

多年以前,当我还坐在大学课堂上听课的时候,曾经有一门课程让我感到非常的困惑,也就是《线性代数》这门课程。我同大多数同学一样,不止一次地怀疑过这门课程到底有什么用处,我也请教过我们的线代老师,但得到的答案却无外乎是锻炼思维,或者工程技术研究之类的回答。我们的教材是同济版的那本,现在回头看看,其实这本教材编的实在是太仓促了,里面几乎所有的概念都介绍的非常笼统,直接给你个定理,然后就开始证明,从来不不告诉你它的来历与用途。导致大多数人习题做的很好,但要问这些内容的本质是什么,他就回答不出来了。所以,正是由于这种困惑,当年我在业余时间曾经花了相当长的一段时间在图书馆研究这门课程,尽管那时候确实有一定深入的了解,但依然停留在只会做题的阶段。

然而直到后来工作后,我工作的内容跟图像处理算法有关,经常要写一些算法,这时候大学学的的线性代数的知识才映入眼帘,更是让我发现了发现线性代数的威力所在。我之所以写这篇文章,目的是想跟大家分享一些我自己对线性代数的理解与应用,尤其是跟那些从事于机器人工程学,计算机视觉等领域的人,同样,还有一部分人就是刚接触线性代数的学生们来说,或者考研人,换一种眼光来看待线性代数,也许你会发现线性代数比你想象的有趣得多。为了更加形象化,我在结尾的部分给出了示例代码。鉴于自己的水平所限,这篇文章权当抛砖引玉,内容难免有错误之处,还望大家的指正。如果你想领取本文的源代码以及素材的话,关注我的公众号,回复“线性代数”四个字即可领取。

现在请仔细回想一下,当初你学习《线性代数》这门课程的时候,是否产生过以下几种疑问:

1),线性代数为什么被称为线性代数,究竟「线」在哪里?

2),行列式的计算法则为什么那么奇怪,究竟是谁「规定」的,行列式的本质又是什么?

3),矩阵乘法规则为什么那样规定,矩阵乘法为什么不满足交换律?

4),克拉默法则求解线性方程组的实际几何意义在哪里?

5),逆矩阵的的「逆」到底「逆」在哪里?奇异矩阵为什么没有逆矩阵?

6),矩阵的Rank为什么不直接翻译成「排名」,而是莫名其妙地被翻译成了「秩」,秩的本质又是什么?满秩矩阵(Full Rank)「满」在哪里?

7),如果P^-1AP=B,那么矩阵A与矩阵B相似,这里相似矩阵到底「相似」在哪里?

8),如果Ax=λx,那么λ被称为矩阵A的特征值,特征向量和特征值到底「特征」在哪里?

如果你也有上面的疑问,那我敢肯定你也没理解线性代数的本质,同时恭喜你中奖了,想必你在大学时期用的也是同济版的线性代数教材,关于同济版教材的缺点我就不多说了,我们更关心的是,线性代数到底有什么用处呢?

首先举个一定令你惊讶的例子,向自己的女神表白。什么,线性代数居然可以表白,逗我呢?你听后一定非常惊讶,但是确实可以这样做,不信你看:

我喜欢你,就像这个行列式,上面是521,中间是125,下面是1314,无论经过多少轮转置,海不清,石不烂,结果亘古不变,永远是520.

哈哈,你没看错,这个行列式堪称为线性代数中最浪漫又最神奇的行列式了,不信你可以计算一下,这是不失理工男的典雅又不缺文艺人的浪漫的撩妹技能,当年我在学校就是用这种方法差点追到数理系的一位妹纸的。哈哈,开个玩笑哈。

想必看到这里,你一定非常惊讶吧,线性代数居然如此之美,为什么之前没有发现呢。生活不缺少美,而是缺少发现美的眼睛,同样适用于数学。当然,线性代数的美,远远不止这些,在这里就不多举例子了,而我们最关心的是,线性代数究竟在那些领域有用处呢?

第一, 机械工程学。嗯,没错,我就是这个专业的,作为机械专业的学子,三大力学(工程力学、材料力学、理论力学)是我们的必修课,一些重要的力学模型都要用矩阵分析,例如组合变形杆件的刚度分析,等等。同样机械专业的ANSYS有限元分析软件,底层的算法也是在求解大量的线性方程组。

第二, 计算机科学。要知道,矩阵相乘的几何含义就是对一个向量进行一次线性变换(下文我会详细说到),所以凡是涉及到图形学,几乎都有线性代数的身影。例如最经典的也算是最简单的平移变换与旋转变换,这种变换与电视广告中产生的文字与动画常常有关。再举个例子,在玩吃鸡、英雄联盟等大型3D游戏的时候,背后的强大的游戏引擎开发也离不开线性代数。

机 械 工 程 学 机 器 人 工 程 学 经 典 力 学 计 算 机 科 学 计 算 机 图 形 学 计 算 机 视 觉 机 器 学 习 工 业 机 器 视 觉

好了,我只举上面两个领域,因为只对上面两个领域有一定了解,但线性代数的应用远远不止这两个领域。抛开这个话题先不说,让我们带着本文最开始的时候,我举的那八个问题,先来深入理解一下线性代数。而线性代数最基本也是最重要的一个问题,就是线性变换,这个概念往往最容易被初学者所忽略,然而它却是最重要的。我写这篇文章的主要目的在于引导你用线性变换的概念去理解线性代数,所以我会用大量的篇幅去介绍这一概念。为了更加直观,下面所有的矩阵我会尽量用二阶矩阵来作为例子进行说明,一旦你理解了线性变化这个概念,我保证,所有生涩难懂的概念例如行列式、逆矩阵、特征值、等等你都将会在你脑海里面迎刃而解。

首先第一个问题,线性代数为什么称为线性(linear)呢?在这里我们先回顾一下初等数学对线性函数的定义,在初等数学上线性可以理解成一阶导数(dy/dx)为常数的函数,也就是说凡是满足 的形式,都可以称为线性函数。而对于线性两个字,基本的定义就两个:可加性与可比性。如果一个函数满足: 那么它就是可加性,如果满足: 那么他就是可比性。而线性代数里面的线性的含义也与初等函数代数的直线方程有类似的性质。那么究竟该如何理解线性代数里面的线性这个词呢?在这里也有多种方法,而我喜欢的方式则是:

把一个空间内做一次有规律的变换,如果这个变换满足以下两个性质:

1),空间内的直线在做变换后依然是一条直线,不能弯曲。

2),空间的原点位置保持不变。

那么我们就称这种变换为线性的。因此,线性代数里面的线性与初等数学里面的线性稍有不同,因为线性代数不研究坐标原点的移动,所以他的形式就没有那个b了。

相比传统生涩难懂的数学公式,我更喜欢用几何的方式去解释线性代数,包括后面几乎所有的定理我都会尽量用几何的语句去解释每一个公式。为了更加清晰理解这个定理,我举一个直观的例子,如果一个二维空间内布满了网格,请把这个空间想象成一块无限大的一块海绵。假如你手上有一块海绵,海绵上面布满了等距等分的网格线,单位长度为1,且互相垂直。为了方便,我选择黄色的那条线为参考线,原始海绵长这样:

假如你对这块海绵施加一外力,将海绵弹性拉大。海绵的形状发生了变化,变成了这个样子:

由于你施加的外力均匀,变化后的网格依然等距等分。因此,这块海绵的变化就是线性的。

如果你将这块海绵沿对角压缩,最后变成了这个样子:

由于变化后虽然发生了倾斜,但是依然等距等分,所以它依然是线性的。

如果你施加一个更大的外力,让这块海绵压缩成了一条直线,甚至一个点,它依然保持等距等分,所以它依然是线性的。

如果你施加的外力不均匀,海绵网格无规律地变成了这个样子:

或者变成了这个样子:

这就不是线性的,这是因为海绵网格不等距等分。而最终的结果是让原本是直线的黄线,变成了曲线。

说到这里,你一定已经看出我这种几何解释方法有点不严谨了。对,因为这种说法忽略了对网格的任意刻度的比较,正确的说法应该是让无论在横向还是纵向,无论网格任何一点,伸缩变换后的网格对比伸缩后的网格均有:

其中,x,f(x)分别为海绵网格中任意一点在变化前与变化后的横坐标位置,y,g(y) 分别为海绵网格中任意一点在变化前与变化后的纵坐标位置。这是一个严谨的解释,但是今天我更想抛弃这些繁琐的数学公式,用几何的方法给大家以直观的方式来解释一下线性代数的含义,文中难免出现一些不严谨的地方,还请大家见谅。

为什么线性如此重要呢,这是因为线性问题一般情况下只要我们知道不超过两个已知量,就能通过线性关系计算出其他任何未知量。而更加庆幸的是,即便工程中遇到一些非线性问题,我们依然可以通过一些巧妙的转化(回忆一下微积分中的求曲线的长度问题)来把它转化为线性解决。

那么你可能会问,我举这些例子究竟跟矩阵有什么关系呢?先别急,我们先来看一个三元一线性次方程组:

写成矩阵形式就是: 可以简写为:

为了解出X,我们可以在两边分别乘以A的逆矩阵:

其中

其中A^*为A的伴随矩阵。

但是,对于这个线性方程组,如果你懒得计算逆矩阵,那么克拉默法则则告诉你一种简便的做法,它的解向量为

其中D为系数方阵,D1,D2,D3分别为用结果向量去替换系数矩阵对应某列的列向量得到的方阵,两者对应的行列式相除,便是对应的解。关于克拉默法则的几何意义解释,下文我会详细说到。

因此,聪明的你,你一定大致猜出来矩阵与列向量相乘的几何意义了吧,对,没错,我们这里可以把右边的系数矩阵A看作是对列向量的某种作用法则,未知数与值分别看作三维空间内的一个向量或者一条直线,也就是说,在三维空间内,系数矩阵A将向量(或者说经过坐标原点的直线)X映射(map)成了直线Y,或者说,在求解这个方程组的解的几何意义就是,如何找出一个列向量X,在作用法则A的条件下,变换后恰好与列向量Y重合,够直观吧。这个理解非常重要,它直接能影响到你后矩阵的理解。矩阵就是一种变换,确切地说是空间的一种线性变换。奇怪的是,这么重要的直观理解,在同济版教材里面,竟然很少有提到,貌似只在那旋转矩阵一节提到过一点点,而这却恰恰是矩阵的本质含义,令人匪夷所思。

那么我们该如何理解这种变换呢,也就是说,究竟是如何通过一种变换规则,将输入一个向量,转换成另外一个向量呢?回答这个问题之前,我们先来回想一下中学时代学过的基向量。

为了直观,我们就以二维空间为例,在空间坐标系内,任何一个向量都可以通过两个模为1的基向量i与j来表示,其中

例如

也就是说,一旦确定了基向量i,j,那么,我们就确定了空间内所有的向量,中学时代我们定义的基向量模一定是1,并且两个基向量正交。我们先来看一下,上图那个向量V=(2,3)究竟与其基向量有什么关系:

上面的式子是在原始空间坐标内,用i,j来表示V的,如果我们再回到开头我举的海绵的例子,把这个空间进行等距拉伸分放大一倍,由于是线性关系,所以空间内所有的向量都必将也放大一倍,包括基向量:

为了做一个良好的对比,我将用灰线表示原单元框格,用白线表示被伸缩后的单元格,下面雷同。

被放大的基向量组成了被放大的空间,也是就是新的空间。我们再来看这个向量V如何表示,其中基向量被改变。

将两者作对比: 新基向量:

再扩展到空间内任意一组基向量来表示列向量(x,y),为了方便,我都用i,j表示基向量

也就是说向量(x,y)在经过线性变换后,被“加工”成了新向量Y=(ax+cy,bx+dy),也即: 被 矩 阵 加 工

回想一下,在列向量没被「加工」之前,它是如何得来的。因为任何一个二维向量,都可以表示为空间两个基向量之和。那么我们定义一个列向量:其所在空间中基向量i=(1,0),j=(0,1).它代表二维平面内,分别x轴的基向量为x倍,沿y轴的方向向量为y倍,也是就是说上面的列向量B等价于:

被 单 位 阵 加 工

因此,将上面矩阵A的两个列向量定义成全新的基向量,即新的基向量:

基 向 量 被 替 换 成

基 向 量 被 替 换 成

因此,我们做一个大胆的假设,任何一个向量被一个矩阵左乘(也即线性变换),实际几何意义就是在这个向量所在的空间的坐标系被进行了更换!新的坐标系中,基向量就是这个矩阵的两个列向量!简单来说,线性变换的意义就是用新的基向量来表示原本向量。在这里,我特别说明一下,矩阵的线性变换是一种对空间的操作,而非对空间内某一对象的操作。举个直观的例子,小明手里面钟表的时针指向原本垂直向上,后来变成了水平向左,我们应该把它理解成是小明把整个钟表逆时针旋转了90度,而非小明把时针逆时针拨了90度,尽管它们两种的操作效果相同。这样理解对你后期理解矩阵的各种性质非常有帮助。

上面我说了,一旦基向量确定后,空间坐标系也就确定了。所以,新的基向量组成了新的坐标系,也就是在新的坐标系下,列向量B的表示方法由(x,y)被左边矩阵映射变成了(ax+cy,bx+dy),

新 基 向 量 坐 标 系 下

也就是说任何一个矩阵相乘,都可以将被左乘的列向量看做一个输入向量,结果看做输出向量,一一对应。 输 入 向 量 新 基 向 量 坐 标 系 下 输 出 向 量

但同时,不要忘记我上面说过的:矩阵的线性变换是一种对空间的操作,而非对空间内某一对象的操作。也就是说,之所以输入向量会变成新的输出向量,并不是因为向量本身变了,而是因为向量所在的空间变化,进而引起输入向量的变化。

为了更加直观,我把上面的代数公式用数字的方法替代,请看下面的图片(图片是我自己直接用CAD绘制的,不好意思,有点粗糙,哈哈):

假如一个列向量

也就是说,原始坐标系下,两个基向量分别是 在二维空间内,它的原始图像是这样的:

如果这个列向量被矩阵A左乘,也即: 也就是说,坐标系中原本的两个模为1的两个基向量基向量被替换了,用新的坐标系来表示右边的列向量,其中: 基 向 量 被 替 换 成 基 向 量 被 替 换 成 新的坐标系变成这个样子,其中i,j两个基向量已不再正交,而且模也不一样,可见,在两个坐标系下换色的那个向量V都是(-i+2j),但是由于坐标系不一样,他们表示的结果向量也就不一样。为了更加直观,我保留原始坐标系,而斜线代表新的坐标系:

以上就是对线性变换这个概念的几何解释。这时候,你应该明白了矩阵相乘的本质了吧,或者多少知道点他的几何意义了,也就是说矩阵A左乘列向量b的几何意义就是在b的原始空间内,将其基向量用矩阵A的两个列向量进行了替换。但是,等等,我上面所有举的例子,都是一个一个矩阵左乘一个列向量,聪明的你一定会想到,如果右边也是一个二阶矩阵,那么它的几何意义作何解释呢,例如: 如果我们让线对左边的矩阵左乘右边矩阵的第一个列向量,也就是: 再左乘第二个列向量: 上面说过,矩阵左乘列向量的意义就是把这个列向量做线性变换,输出新的向量。因此,我们可以得出矩阵与矩阵相乘的几何意义就是一个复合变换,这个变换就是左边的矩阵分别与右边矩阵的列向量相继变换,组成一个新的基向量。在这里,我举两个重要又常用的矩阵:旋转矩阵与剪切矩阵,为了更加直观,我先来绘制一下原始坐标系,里面的四边形ABCD作为参照物:

如果: θ θ θ θ

这个矩阵是旋转矩阵,它左乘任何一个列向量,都能将这个列向量逆时针旋转西塔度,我们注意观察一下它对空间的旋转:

特别地,当西塔等于90度的时候,旋转矩阵变成: 它的作用是将任何列向量都逆时针旋转90度:

而斜切矩阵 将任何列向量都沿水平方向斜切:

镜像矩阵, 将任何列向量都关于水平方向镜像

如果 镜 像 矩 阵 旋 转 矩 阵

那么AB的话,它的几何意义就是先旋转,再镜像 而如果左边是BA的话,就是,它的几何意义就是先镜像,再旋转。 显然,AB与BA不相等,这与几何意义相符合。也就是说一般情况下,矩阵的乘法一般不满足交换律。这在几何意义上很好解释。

如果先旋转再镜像,注意观察基向量的变化:

反之,如果先镜像再旋转,注意观察基向量的变化:

最终的变换结果在两张图像上并不相等,两者结果并不相同,这也说明了矩阵的乘法一般不满足交换律。

那么,矩阵乘法为什么满足结合律,也就是说如何证明(AB)C=A(BC)呢,当然你可以用最传统的方法来证明,也就是直接将他们依次相乘,经过左右两边数值的展开代计算,结果必然相等。但是这种证明方法简直是囫囵吞枣,还是那句话,证明的本质在于深刻理解其含义,而非代数本身。这种方法你除了练习了那么一丁点动手能力,其余的什么也学不到。但是如果我们用线性变换的方法来解释证明,则容易多了:

我们假设AB=M,BC=N那么左边=MC,实际几何意义是先进行C变换,再进行M变换,也就是先进行C变换,再进行B变换,再进行A变换;而右边=AN,也就是先进行N变换,再进行A变换,同样也是先进行C变换,再进行B变换,再进行A变换。证毕 再 变 换 先 变 换 讲到这里,线性变换的概念基本说完了,想必你也一定有所了解了,如果没理解,也没关系,下去可以多花一点时间,多思考一些。

一旦你理解了矩阵的相乘就是线性变换的概念,后面的问题就好解决了。这也是我为什么花大量的篇章来介绍这一概念。

我们再来说行列式。由于前面说过,矩阵的线性变换其实是对线性空间的伸缩,那么这个伸缩量是多少呢?答案就是这个矩阵对应的行列式。说到这里,再次吐槽一下同济版的教材,居然先讲解行列式再讲解矩阵,这好比先给你讲解圆周率再给你讲解什么是圆一样的。这里为了方便,我就用二阶行列式来作为引入对象: 其实,行列式A的实际几何意义也有两种,一种是把行列式对应的矩阵作为基向量,那么它就是对基向量组成的单位正方形做的放大或者缩小比例系数,也即线性空间的缩放倍数;另一种是,对应矩阵的两个列向量围城的平行四边形的面积。我个人推荐第二种,更加直观一些。下面给出证明方法:

如图所示,假如有两个列向量: 根据和差公式 α β α β α β

这里,由于:

α β α β 也就是说: α β 整理 α β 四 边 形 证明完毕。

好了,这时候我们再来看前面几个问题中逆矩阵的问题,为什么奇异矩阵没有逆矩阵?由于矩阵的几何意义就是线性变换,在求解线性方程组 的时候,我们在几何上就是说如何寻找一个列向量X,让它在进行A变换后,恰好与Y重合。那么逆矩阵的概念就是说,如何在变换后的空间内,寻找一个逆变换B,让它能把这个变换恢复成原来的模样。

给出任意一个奇异矩阵矩阵A,假如 对应的线性变换:

我们观察图形,很明显,变换后的两个基向量居然共线了,而这时候它们对应的行列式必定为0.但是,这样造成了一个很不舒服的情况就是,除非结果向量V与基向量i或者基向量j共线,否则无论他它两个怎么组合,都无法表示出那个黄色的结果向量。也就是说,奇异矩阵的几何意义就是讲高维度进行了降维操作,上图就是将二维平面压缩成了一条直线,同样,你永远无法把一条直线寻找一个逆变换再恢复成一个平面,因为过一条直线的平面有无数多个。这与函数的映射概念相违背。因此奇异矩阵没有逆矩阵。

这时候,我们再来看看那八个问题中的矩阵秩(Rank)的概念。实际上,秩的本意是线性变换后空间的维数(再次想吐槽一下同济版的,没给出秩的实际意义,奈何我已无力吐槽)。例如

显然R(A)=2,也就是说它是一个满秩矩阵,因为秩数等于列数。它没有对空间进行压缩,变换后依然是一个二维平面,但是下面:

经过初等行变换后,R(B)=1<2,这个线性变换对空间进行了压缩,将一个平面压缩成了一条直线。我们也可以称它为假二维平面,秩数小于列数,它是一个非满秩矩阵。不能完全表示出它原本应该的面貌。

那么为什么Rank翻译成秩呢,在这里,如果你看一下汉字秩的本意,也许你就会恍然大悟了。哈哈,由于这里不是说文解字,我在这里就不多解释了。但是这里我想再留下一个问题:请用几何的方法去解释下非齐次线性方程组Ax=b有解的充分必要条件是R(A)=R(A,b).

一旦你理解了线性变换,那么克拉默法则的几何意义也就更加直观了。为了几何从集合角度解释这一定理,也更加直观,我还将空间的维度降低,就以二元线性方程组为例来说明: 如果 那么方程组有唯一解: 它的几何意义是怎么样呢?

我们以方程组 为例来说明,由于系数矩阵是一个线性变换,因此,在几何上如下图所示:

根据几何关系,这个问题变成了:我们如何寻找两个数x,y,使得x*i+j*y组成的向量恰好落在(7.5,5)上面呢。我们看上面这张图片,四边形ODHC,OAFD分别是结果向量与两个基向量组成的平行四边形,根据平行四边形的关系,不难看出: 因此, 证毕。

可见,方程组的解分别是在基向量基础之上,将平行四边形伸缩的倍数,这就是克拉默法则在二维空间的几何意义。同样,在三维空间内,并扩展到n维空间内,请思考一下克拉默法则代表什么几何意义。

最后,我会给出几个实际案例,来说明线性代数的应用。

1, 斐波那契数列算法优化问题:

斐波那契数列是一个经典的数列,它由兔子的繁殖问题而引入的一种数列,我们知道,它的第n项(n>=3)是第n-1与第n-2项的和,开始两项都为1,因此,最简单的方式,我们可以采用递归的算法来求解斐波那契数列的第n项,代码如下(C++描述,以下雷同):

int Fibo(int n){if(n==1 || n==2){return 1;return \Fibo(n-1) + Fiobo(n-2);

此递归法的时间复杂度为o(2^n),指数增长,效率极为低下,尤其是当n大于10的时候,耗费时间急剧增大。为了降低时间复杂度,我们可以采用循环法来求解,代码如下:

int Fibo(int n){if(n==1 || n==2){return 1;int f1=1,f2=1,f3;for(int i=3;i<=n;i++){f3=f2+f1;f2=f1;f1=f3;return f3;

循环算法将时间复杂度降低为了o(n),但意味着随着n的增大,此算法的复杂度会成一个线性增长,那么有没有其他方法,再次提高计算效率呢,答案是有。我们首先定义二阶矩阵: 当n>=1时,由于 进一步递推,我们得到: 因此,在在计算第n项值的时候,我们采用快速幂乘算法,可以将复杂度降为o(logn),意味着最多只需要计算以2为底的log(n)次即可求出对应的结果,意味着哪怕我们要求第10亿项的值,本算法只需经过30次运算即可解决,而循环法却要就算至少10亿次。核心代码如下(部分):

int Fobi(Matrix base,\int power){if(power==1 ||\power==2){return 1;Matrix result;result.mat[0][0]=1;result.mat[0][1]=0;result.mat[1][0]=0;result.mat[1][1]=1;while(power>0){if(power%2==1){result=\CalcMatrix\(result,base);power=power/2;base=\CalcMatrix\(base,base);return \result.mat[1][0];

那么还有没更高效率的算法吗?答案是有!注意观察:由于我们构造的那个矩阵 它是一个对称阵,根据对称阵可以相似对角化的原则,所以存在可逆矩阵P以及对角阵Λ使得 首先求其特征值以及特征向量: λ λ λ 求得特征值: λ λ 得到对角阵: 然后我们选取对应特征向量: ζ ζ 从而可逆矩阵

由于: 根据 我们最后得出斐波那契数列的通项公式: 直接将此算法时间复杂度降为O(1),意味着哪怕n再大,我们只需要经过一次运算即可求出第n项的值。

2,图像的仿射变换:

我们知道,每张图片都是由一个个像素构成的,每个像素对应唯一的一个坐标。因此,我们可以通过矩阵的运算实现对任意一张图片的线性变换。如果我们记变换前的像素坐标为(x,y),变换后的坐标为(X,Y),那么存在这样一种仿射变换: 这样的变换可以将我们的图像进行诸如旋转、缩放等等操作。这里为了避免造轮子,我使用opencv处理这张图像。

3,图像压缩技术:

如果你用高像素手机拍摄了一张精美的图片,这张图片占用空间非常大,发送给朋友后却发现图片小了非常多,但主要内容却并没有丢失多少。这就是有损压缩技术。那么它的技术原理是什么呢?

我们知道,对称矩阵一定能够相似对角化,也即能将其特征值提取出来。而这里却有一个苛刻的条件,就是矩阵必须为方阵。而我们遇到的图片基本上不会刚好是一个正方形。为了提取出主要特征,这里就需要奇异分解。也就是:

其中A是一个m×n矩阵,U是一个m×m方阵,V是一个n×n方阵。Σ除了主对角线元素外,其余全是0.主对角元素就是奇异值。

为了求出奇异值,我们将等式两边右乘V 也即: σ 得出: σ 如图所示,我们有一张猫咪的图片,我们将像素矩阵的奇异值全部提取出来进行从大到小的排列。也就是:

σ σ σ σ 最后重新计算像素矩阵。如果我们只提取前5个奇异值,其余全部设为0.我们看这张图像发生了什么微妙的变化,左边是原始图像,右边是变换后的图像。C++实现代码如下(部分):

int main(){int val=5;Mat image=imread\("D:\\cat.jpg",0);Mat temp(image.size(),\CV_32FC1,Scalar(0));image.converTo(image,\CV_32F1);Mat U,W,V;SVD::computer(image,W,U,V);image.convertTo(image,\CV_8UC1);Mat w(500,500,CV_32FC1\,Scalar(0));for(int i=0;iw.ptr(i)[i]=\W.ptr(i)[0];temp=U*w*V;temp.convertTo(temp,\CV_8UC1);

发现代码运行后的图像模糊很大,但依然能够看清大致轮廓。我们再来调整奇异值的数量,将val变量增加到15:

发现猫咪的图像更加清晰了,我们再增加到30:

越来越清晰了。而右边的图片几乎保留了左边图片的所有特征,但是我们惊奇地发现右边图片的存储大小仅为原始图像的百分之二十!这就是图像压缩技术的原理。

结语:至此,本文到这里就结束了。我在本篇幅中花了大篇章来介绍线性变换这个概念,而其他部分内容只做了简单的概述,因为我相信只要你能够彻底理解了线性变换这个概念,其他问题都会迎刃而解。如果你觉得本文对你学习线性代数有帮助,那么我希望你能够将本文分享给其他朋友,让更多的人看到。

线性代数考研(线性代数考研哪个老师好)

类似文章