数学大佬帮忙看一下这个数学二线性代数数中分块矩阵的结果是咋算出来的

签箌排名:今日本吧第个签到

本吧因你更精彩,明天继续来努力!

成为超级会员使用一键签到

成为超级会员,赠送8张补签卡

点击日历上漏签日期即可进行补签

超级会员单次开通12个月以上赠送连续签到卡3张

该楼层疑似违规已被系统折叠 

为什么前面那个矩阵的平方等于後面-7倍的矩阵



该楼层疑似违规已被系统折叠 

为什么解法一用了交换律 不是不可以用吗


该楼层疑似违规已被系统折叠 


该楼层疑似违规已被系統折叠 


扫二维码下载贴吧客户端

}

该楼层疑似违规已被系统折叠 

大佬们线性方程组的系数矩阵,其满秩唯一解是针对所有矩阵,还是只针对方阵啊?


}

原标题:数学对于编程来说重要嗎编程大佬眼里的数学二线性代数数

数学二线性代数数是最为抽象的一门课

思维跨度比微积分和概率统计要大得多

大多数小伙伴学过以後一直停留在

知其然不知其所以然的阶段

若干年之后接触图形编等领域

才发现数学二线性代数数的应用无处不在

但又苦于不能很好地理解囷掌握

多数人很容易理解初等数学的各种概念

但是一进入数学二线性代数数的世界

就好像来到了另一个陌生的世界

在各种奇怪的符号和运算里迷失了

在初接触数学二线性代数数的时候

简直感觉这是一门天外飞仙的学科

一个疑问在脑子里浮现出来

数学二线性代数数到底是一种愙观的自然规律还是人为的设计

“这还用问数学当然是客观的自然规律了”

从中学的初等数学和初等物理一路走来

很少人去怀疑一门數学学科是不是自然规律

当学习微积分、概率统计时

唯独数学二线性代数数让我产生了怀疑

因为它的各种符号和运算规则太抽象 太奇怪

引發了我去思考一门数学学科的本质

都不清楚数学二线性代数数到底是什么 有什么用

国内的孟岩写过《理解矩阵》

国外的Sheldon Axler教授写过《数学二線性代数数应该这样学》

都没有从根本上讲清楚数学二线性代数数的来龙去脉

读大学的时候没有学懂数学二线性代数数

反而是后来从编程嘚角度理解了它

很多人说数学好可以帮助编程

程序的理解帮助了我理解数学

下面老九君就带小伙伴们

做一次程序员在数学二线性代数数卋界的深度历险!

在进入数学二线性代数数的领域之前

我们先考察一番程序世界

这些语言是一种客观的自然规律还是人为的设计呢?

为什麼要问这样一个看起来很蠢的问题呢

对天天使用的程序语言的认识

一定胜过抽象的数学二线性代数数

程序语言虽然包含了内在的逻辑,

泹它们本质上都是人为的设计

所有程序语言的共同性在于

将每种语法映射到特定的语义

程序员和语言实现者之间遵守语言契约

程序员保证玳码符合语言的语法

编译器/解释器保证代码执行的结果

C++规定用new A()语法在堆上构造对象A

这样写了C++就必须保证相应的执行效果

在堆上分配内存并調用A的构造函数

否则就是编译器违背语言契约

从应用的角度我们能不能把数学二线性代数数视为一门程序语言呢?

答案是肯定的我们鈳以用语言契约作为标准来试试。

假设有一个图像我们想把它旋转60度,再沿x轴方向拉伸2倍;

数学二线性代数数告诉我们“行!按我的語法构造一个矩阵,再按矩阵乘法规则去乘你们的图像我保证结果就是你们想要的”。

实际上数学二线性代数数和SQL这样的DSL非常相似,丅面来作一些类比:

模型和语义:SQL是在低级语言之上建立了关系模型核心语义是关系和关系运算;数学二线性代数数在初等数学之上建竝了向量模型,核心语义是向量和线性变换

语法:SQL为每种语义定义了相应的语法如select, where, join等;数学二线性代数数也定义了向量、矩阵、矩阵乘法等语义概念相应的语法

编译/解释:SQL可以被编译/解释为C语言;数学二线性代数数相关概念和运算规则可以由初等数学知识来解释

实现:我們可以在MySQL、Oracle等关系数据库上进行SQL编程;我们也可以在MATLAB、Mathematica等数学软件上进行数学二线性代数数编程

所以,从应用的角度看数学二线性代数數是一种人为设计的领域特定语言(DSL),它建立了一套模型并通过符号系统完成语法和语义的映射

实际上,向量、矩阵、运算规则的语法和語义都是人为的设计这和一门语言中的各种概念性质相同,它是一种创造但是前提是必须满足语言契约。

可能有人对把数学二线性代數数当成一门DSL不放心给一个矩阵,你就把我的图形旋转了60度沿x轴拉伸了2倍我总感觉不踏实啊,我都不知道你“底层”是怎么做!

其实这就像有的程序员用高级语言不踏实,觉得底层才是程序的本质老是想知道这句话编译成汇编是什么样?那个操作又分配了多少内存别人在Shell里直接敲一个wget命令就能取下一个网页,非要用C语言花几十分钟来写一堆代码才踏实

所谓底层和上层只是一种习惯性的说法,并鈈是谁比谁更本质

程序的编译和解释本质上是不同模型间的语义映射,通常情况下是高级语言映射为低级语言但是完全也可以把方向反过来。Fabrice Bellard用Java写了一个虚拟机把Linux跑在Java虚拟机上,这就是把机器模型往Java模型上映射

建立新模型肯定依赖于现有的模型,但这是建模的手段洏不是目的任何一种新模型的目的都为了更简单地分析和解决某一类问题。

数学二线性代数数在建立的时候它的各种概念和运算规则依赖于初等数学的知识,但是一旦建立起来这层抽象模型之后我们就应该习惯于直接利用高层次的抽象模型去分析和解决问题。

说到数學二线性代数数是为了比初等数学更容易地分析和解决问题下面我们通过一个例子来实际感受一下它的好处:

当三角形有一条边恰好在唑标轴上时我们就很容易算出它的面积。

但是假如同样一个三角形我们把坐标轴旋转一下,让它的边不在坐标轴上怎么办?我们还能嘚到它的底和高吗

答案肯定是可以的,但是就明显复杂了而且还要分很多种情况去分别讨论。

相反如果我们用数学二线性代数数知識来解决这个问题就非常轻松

在数学二线性代数数中两个向量ab的叉积(Cross Product)是一个向量,其方向与ab垂直,其大小等于ab构成的平行四边形嘚面积:

我们可以把三角形的边视为向量,所以三角形的面积等于两个边向量的叉积向量的长度除以二:

注:length表示取向量长度cross_product表示两个向量的叉积。

这样一个在初等数学里面有点儿小难的问题在数学二线性代数数中瞬间搞定!

可能有人会说直接基于叉积来做,当然简单了但是叉积本身不是也挺复杂的吗?把它展开试试看呢

是的,模型的作用就是把一部分复杂性隐藏到模型中使得模型的使用者可以更加简单地解决问题。曾经有人质疑C++太复杂C++之父Bjarne Stroustrup这样回答:

在特定环境下,问题的复杂性是由其本质决定的C++把一部分的复杂性纳入了语訁和标准库,目的是使得应用程序更为简单

当然,并非所有场合C++都使得问题更加简单但是从原理上讲,C++的复杂性是有道理的

除了C++,Java、SQL、CSS等各种语言和框架莫不如是想象一下,如果不使用数据库动不动就自己去做数据存储和管理是多么复杂啊!

这样我们就不难理解為什么数学二线性代数数要定义叉积这样奇怪的运算了,它和C++把很多常用的算法和容器纳入STL是同一道理

同样的,甚至小伙伴还可以在数學二线性代数数中定义自己想要的运算拿来复用

所以,数学一点儿不死板它和程序一样是活活泼泼的,小伙伴们理解了它的来龙去脉僦能驾驭自如说到这里,我们就顺便回答一个很常见的疑惑:

数学二线性代数数的点积、叉积还有矩阵运算都很奇怪为什么要定义这些运算呢?它们的定义又为什么是这个样子呢

其实,和程序复用一样数学二线性代数数定义点积、叉积和矩阵运算是因为它们的应用非常广,有很大的复用价值可以作为我们分析和解决问题的基础。

比如很多问题都涉及到一个向量到另一个向量的投影或是求两个向量的夹角,那么就会考虑专门定义点积(Dot Product)这个运算:

点积概念的提出属于设计有发挥创造的余地;一旦设计定了,具体公式就不能随意发揮了必须符合逻辑,保证它映射到初等数学模型的正确性

这就像一门高级语言可以定义很多概念,什么高阶函数、闭包等等但是它必须保证映射到底层实现时在执行产生的效果符合其定义的规范。

上面说了数学二线性代数数是一种高层次抽象模型,我们可以采用学習一门程序语言的方法去学习它的语法和语义但是这一认识不只针对数学二线性代数数,它是对每一门数学学科通用的可能有人会有疑问。

微积分、概率论也是高层次抽象那么数学二线性代数数这种高层次抽象的特点在哪里呢?

这就问到了根本上数学二线性代数数嘚核心:向量模型。

我们在初等数学中学习的坐标系属于笛卡尔所提出的解析模型这个模型很有用,但同时也有很大的缺点

坐标系是囚为加上的虚拟参考系,但是我们要解决的问题比如求面积,图形旋转、拉伸等应用都是和坐标系无关的建立一个虚拟的坐标系往往無助于解决问题,刚才三角形面积的例子就是这样

向量模型很好地克服了解析模型的缺点,如果说解析模型代表了某种“绝对性”的世堺观那么向量模型就代表了某种“相对性”的世界观,我推荐把向量模型和解析模型看作对立的两种模型

向量模型中定义了向量和标量的概念。向量具有大小和方向满足线性组合法则;标量是只有大小没有方向的量(注:标量的另一种更深刻的定义是在旋转变换下保歭不变的量)。

向量模型的优点之一是其坐标系无关性也就是相对性,它在定义向量和运算规则的时候从一开始就抛开了坐标系的束缚不管坐标轴怎么旋转,我都能适应向量的线性组合、内积、叉积、线性变换等等运算全部都是坐标系无关的。

注意所谓坐标系无关性不是说就没有坐标系了,还是有的刚才三角形例子的顶点就是用坐标表示的,只是在解决问题的时候不同的坐标系不会构成影响

用┅个比喻,Java号称平台无关不是说Java就是空中楼阁,而是说小伙伴用Java编程时底层是Linux还是Windows往往对自身没有影响

向量模型有什么好处呢?

除了剛才三角形面积问题是一个例子下面再举一个几何的例子

这个问题如果是要从解析几何的角度去解决几乎复杂到没法下手,除非是平媔恰好是过坐标轴的特殊情况但是如果从向量模型考虑就很简单:

这里用到了向量模型的基本概念:法向量,投影向量点积,整个问題解决过程简洁明快

下面再给小伙伴们留一道相似的练习题(熟悉机器学习的朋友可能会发现这是数学二线性代数数在线性分类中的应鼡):

离开向量,下面我们要请出数学二线性代数数的另一个主角:矩阵(Matrix)

数学二线性代数数定义了矩阵和向量、矩阵和矩阵的乘法,运算规则很复杂用来做什么也不清楚,很多初学者都不能很好地理解可以说矩阵是学好数学二线性代数数的拦路虎

遇到复杂的东西往往需要先避免一头陷入细节,先从整体上把握它

其实,从程序的角度看无论形式多么奇怪,它无非是一种语法语法必然对应了语義,所以理解矩阵的重点在于理解其语义

矩阵的语义不止一种,在不同的环境中有不同的语义在同一环境中也可以有不同的解读,最瑺见的包括:

1)表示一个线性变换;

2)表示列向量或行向量的集合;

3)表示子矩阵的集合

矩阵作为一个整体对应的是线性变换语义:用矩阵A乘鉯一个向量v得到w,矩阵A就代表了v到w的线性变换

比如,如果想要把向量v0按逆时针方向旋转60度得到v'只需要用旋转变换矩阵(Rotation Matrix)去乘v0就可以了。

除了旋转变换拉伸变换也是一种常见的变换,比如我们可以通过一个拉伸矩阵把向量沿x轴拉伸2倍(请试着自己给出拉伸矩阵的形式)。

更重要的是矩阵乘法有一个很好的性质:满足结合率,这就意味着可以对线性变换进行叠加

举个例子,我们可以把“沿逆时针旋轉60度”的矩阵M和“沿x轴拉伸2倍”的矩阵N相乘得到一个新矩阵T来代表“沿逆时针旋转60度并沿x轴拉伸2倍”。

这是不是很像我们Shell中把多个命令通过管道进行叠加呢

上面重点介绍了向量模型的坐标系无关性,除此之外向量模型的另一优点是它能描述线性关系,下面我们来看一個熟悉的Fibonacci数列的例子:

数列性质我们可以得到从v1到v2的递推变换矩阵:

这样就把线性递推问题转化为了矩阵的n次幂经典问题,在O(log n)时间複杂度内解决除了线性递推数列,初等数学中著名的n元一次方程组问题也可以转化为矩阵和向量乘法形式更容易地解决

这个例子是想說明,凡是满足线性关系的系统都是向量模型的用武之地我们往往可以把它转化为数学二线性代数数得到简洁高效的解决方案。

本文提絀了一种观点:从应用的角度我们可以把数学二线性代数数视为一门特定领域的程序语言。数学二线性代数数在初等数学基础上建立了姠量模型定义了一套语法和语义,符合程序语言的语言契约

向量模型具有坐标系无关性和线性性,它是整个数学二线性代数数的核心是解决线性空间问题的最佳模型。向量的概念、性质、关系、变换是掌握和运用数学二线性代数数的重点

对于编程来说,学好数学是必不可少的对于数学二线性代数数而言,用编程的方式来思考可以帮助理解

}

我要回帖

更多关于 数学二线性代数 的文章

更多推荐

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

点击添加站长微信