为什么要有线性代数?

可能有人对把线性代数当成一门DSL不放心,我给你一个矩阵,你就把我的图形旋转了60度沿x轴拉伸了2倍,我总感觉不踏实啊,我都不知道你“底 层”是怎么做!其实,这就像有的程序员用高级语言不踏实,觉得底层才是程序的本质,老是想知道这句话编译成汇编是什么样?那个操作又分配了多少内存?别人 在Shell里直接敲一个wget命令就能取下一个网页,他非要用C语言花几十分钟来写一堆代码才踏实。其实,所谓底层和上层只是一种习惯性的说法,并不 是谁比谁更本质。程序的编译和解释本质上是不同模型间的语义映射,通常情况下是高级语言映射为低级语言,但是完全也可以把方向反过来。Fabrice Bellard用JavaScript写了一个虚拟机,把Linux跑在JavaScript虚拟机上,这就是把机器模型往JavaScript模型上映射。

建立新模型肯定依赖于现有的模型,但这是建模的手段而不是目的,任何一种新模型的目的都为了更简单地分析和解决某一类问题。线性代数在建立的时候,它的各种概念和运算规则依赖于初等数学的知识,但是一旦建立起来这层抽象模型之后,我们就应该习惯于直接利用高层次的抽象模型去分析和解决问题。

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

给定三角形的顶点(x1, y1), (x2, y2), (x3, y3),求三角形的面积。

初等数学中三角形面积最著名的计算公式是area = 1/2 * base * height ,当三角形有一条边恰好在坐标轴上时我们就很容易算出它的面积。但是,假如同样一个三角形我们把坐标轴旋转一下,让它的边不在坐标轴上,怎么办?我们还能得到它的底和高吗?答案肯定是可以的,但是就明显复杂了,而且还要分很多种情况去分别讨论。

相反,如果我们用线性代数知识来解决这个问题就非常轻松。在线性代数中两个向量a,b的叉积(Cross Product)是一个向量,其方向与a,b垂直,其大小等于a,b构成的平行四边形的面积:

2018-12-24 21:18:07 上传

下载附件 (13.05 KB)

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

area = abs(1/2 * cross_product((x2 - x1, y2 - y1), (x3 - x1, y3 - y1)))

注:abs表示取绝对值,cross_product表示两个向量的叉积。

这样一个在初等数学里面有点儿小难的问题在线性代数中瞬间搞定!可能有人会说,你直接基于叉积来做,当然简单了,但是叉积本身不是也挺复杂的吗?你把它展开试试看呢?是的,模型的作用就是把一部分复杂性隐藏到模型中,使得模型的使用者可以更加简单地解决问题。曾经有人质疑C++太复杂,C++之父Bjarne Stroustrup这样回答:

Complexity will go somewhere: if not the language then the application code.

在特定环境下,问题的复杂性是由其本质决定的,C++把一部分的复杂性纳入了语言和标准库,目的是使得应用程序更为简单。当然,并非所有场合C++ 都使得问题更加简单,但是从原理上讲,C++的复杂性是有道理的。除了C++,Java、SQL、CSS等各种语言和框架莫不如是,想象一下,如果不使用 数据库,动不动就自己去做数据存储和管理是多么复杂啊!这样我们就不难理解为什么线性代数要定义叉积这样奇怪的运算了,它和C++把很多常用的算法和容器 纳入STL是同一道理。同样的,甚至你还可以在线性代数中定义自己想要的运算拿来复用。所以,数学一点儿不死板,它和程序一样是活活泼泼的,你理解了它的 来龙去脉就能驾驭自如。说到这里,我们就顺便回答一个很常见的疑惑:

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

其实,和程序复用一样,线性代数定义点积、叉积和矩阵运算是因为它们的应用非常广,有很大的复用价值,可以作为我们分析和解决问题的基础。比如,很多问题都涉及到一个向量到另一个向量的投影或是求两个向量的夹角,那么就会考虑专门定义点积(Dot Product)这个运算:

2018-12-24 21:18:07 上传

下载附件 (12.62 KB)

点积概念的提出属于设计,有发挥创造的余地;一旦设计定了,具体公式就不能随意发挥了,必须符合逻辑,保证它映射到初等数学模型的正确性。这就像一门高级语言可以定义很多概念,什么高阶函数、闭包等等,但是它必须保证映射到底层实现时在执行产生的效果符合其定义的规范。

线性代数好在哪里?

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

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

这就问到了根本上,线性代数的核心:向量模型。我们在初等数学中学习的坐标系属于笛卡尔所提出的解析模型,这个 模型很有用,但同时也有很大的缺点。坐标系是人为加上的虚拟参考系,但是我们要解决的问题,比如求面积,图形旋转、拉伸等应用都是和坐标系无关的,建立一 个虚拟的坐标系往往无助于解决问题,刚才三角形面积的例子就是这样。

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

向量模型中定义了向量和标量的概念。向量具有大小和方向,满足线性组合法则;标量是只有大小没有方向的量(注:标量的另一种更深刻的定义是在坐标变换中保持不变的量)。向量模型的优点之一是其坐标系无关性, 也就是相对性,它在定义向量和运算规则的时候从一开始就抛开了坐标系的束缚,不管你坐标轴怎么旋转,我都能适应,向量的线性组合、内积、叉积、线性变换等 等运算全部都是坐标系无关的。注意,所谓坐标系无关性不是说就没有坐标系了,还是有的,刚才三角形例子的顶点就是用坐标表示的,只是在解决问题的时候不同 的坐标系不会构成影响。用一个比喻,Java号称平台无关,不是说Java就是空中楼阁,而是说你用Java编程时底层是Linux还是Windows往 往对你没有影响。

向量模型有什么好处呢?除了刚才三角形面积问题是一个例子,下面我再举一个几何的例子:

给定三维坐标系中的一点(x0, y0, z0)和一个平面a*x + b*y + c*z + d = 0,求点到平面的垂直距离?

2018-12-24 21:18:07 上传

下载附件 (25.08 KB)

这个问题如果是要从解析几何的角度去解决几乎复杂到没法下手,除非是平面恰好是过坐标轴的特殊情况,但是如果从向量模型考虑就很简单:根据平面方程,平面的法向量(Normal Vector)是v=(a, b, c),设从平面上任意一点(x, y, z)到(x0, y0, z0)的向量为w,那么通过内积dot_product(w, v)算出w到v的投影向量p,其大小就是(x0, y0, z0)到平面a*x + b*y + c*z + d = 0的垂直距离。这里用到了向量模型的基本概念:法向量,投影向量,内积,整个问题解决过程简洁明快。

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

给定n维空间中的两点(a1, a2, ... an),(b1, b2, ... bn)和一个超平面c1*x1 + c2*x2 ... + cn*xn + d = 0,请判断两点在超平面的同侧或异侧?

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

线性代数定义了矩阵和向量、矩阵和矩阵的乘法,运算规则很复杂,用来做什么也不清楚,很多初学者都不能很好地理解,可以说矩阵是学好线性代数的拦路 虎。遇到复杂的东西,往往需要先避免一头陷入细节,先从整体上把握它。其实,从程序的角度看,无论形式多么奇怪,它无非是一种语法,语法必然对应了语义, 所以理解矩阵的重点在于理解其语义。矩阵的语义不止一种,在不同的环境中有不同的语义,在同一环境中也可以有不同的解读,最常见的包括:1)表示一个线性 变换;2)表示列向量或行向量的集合;3)表示子矩阵的集合。

矩阵作为一个整体对应的是线性变换语义:用矩阵A乘以一个向量v得到w,矩阵A就代表了v到w的线性变换。比如,如果想要把向量v0按逆时针方向旋转60度得到v',只需要用旋转变换矩阵(Rotation Matrix)去乘v0就可以了。

2018-12-24 21:18:07 上传

下载附件 (8.9 KB)

除了旋转变换,拉伸变换也是一种常见的变换,比如,我们可以通过一个拉伸矩阵把向量沿x轴拉伸2倍(请试着自己给出拉伸矩阵的形式)。更重要的是,矩阵乘法有一个很好的性质:满足结合率。这就意味着可以对线性变换进行叠加,比如,我们可以把“沿逆时针旋转60度”的矩阵M和“沿x轴拉伸2倍”的矩阵N相乘,得到一个新矩阵T来代表“沿逆时针旋转60度并沿x轴拉伸2倍”。这是不是很像我们Shell中把多个命令通过管道进行叠加呢?

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

Fibonacci数列定义为:f(n) = f(n-1) + f(n-2), f(0) = 0, f(1) = 1;问题:输入n,请给出求f(n)的时间复杂度不超过O(logn)的算法。

首先,我们构造两个向量v1 = (f(n+1), f(n))和v2 = (f(n+2), f(n+1)),根据Fibonacci数列性质,我们可以得到从v1到v2的递推变换矩阵:

2018-12-24 21:18:06 上传

下载附件 (8.71 KB)

并进一步得到:

2018-12-24 21:18:07 上传

下载附件 (8.17 KB)

这样就把线性递推问题转化为了矩阵的n次幂经典问题,在O(log n)时间复杂度内解决。除了线性递推数列,初等数学中著名的n元一次方程组问题也可以转化为矩阵和向量乘法形式更容易地解决。这个例子是想说明,凡是满足 线性关系的系统都是向量模型的用武之地,我们往往可以把它转化为线性代数得到简洁高效的解决方案。

总之,向量模型是整个线性代数的核心,向量的概念、性质、关系、变换是掌握和运用线性代数的重点,线性代数视为一门特定领域的程序语言,在初等数学基础上建立了向量模型,定义了一套语法和语义,符合程序语言的语言契约。

c语言做线性代数第六版答案,编程与线性代数相关推荐

  1. C Primer Plus第六版(中文版)编程练习答案(完美修订版)汇总

    //本文是博主编写的C Primer Plus第六版(中文版)编程练习答案的所有链接; //使用超链接汇总于此,若是有用请点赞收藏并分享给他人; C Primer Plus 第六版(中文版)第二章(完 ...

  2. 计量经济学导论伍德里奇第六版答案+数据集

    计量经济学导论答案 计量经济学导论伍德里奇 第四版.第五版.第六版答案+数据集均有

  3. C prime plus 第六版 课后编程练习 第7章

    C prime plus 第六版 课后编程练习 第7章 7.12.1 编写一个程序读取输入,读到#字符停止,然后报告读取的空格数.换行符数和所有其他字符的数量. 7.12.2.编写一个程序读取输入,读 ...

  4. 高等数学·同济七版+线性代数第六版+概率论与数理统计第四版(教材+辅导)

    教材加辅导 内容简介 <高等数学>第7版是普通高等教育"十二五"国家级规划教材,在第6版的基础上作了进一步的修订.版教材在保留原教材结构严谨,逻辑清晰.叙述详细.通俗易 ...

  5. 计算机网络自上而下第六版答案,《计算机网络: 自顶向下方法》(第六版) 第一章习题...

    声明 本书为<计算机网络:自顶向下方法>(第六版),也就是图片上的那本.所有的课后复习题和习题答案均为个人理解,若有错误或不足的地方欢迎大家在评论中指出. 习题 P1. 设计并描述在自动柜 ...

  6. 线性代数学习指导与MATLAB编程实践,线性代数学习指导与MATLAB编程实践

    第一章行列式1 第一节内容提要1 第二节典型例题4 第三节编程应用15 第四节习题21 习题答案与解法提示24 第二章矩阵28 第一节内容提要28 第二节典型例题33 第三节编程应用46 第四节习题5 ...

  7. C++ Primer Plus(第六版)编程练习答案 所有章节汇总

    本博客汇总了本人历时一年学完<C++ Primer Plus (第6版)>所做的所有编程练习的答案,供大家学习参考和交流. 以下附上各章节的答案详解博客地址,以及源码工程下载地址. PS: ...

  8. c语言程序设计教程第三版答案9.5,C语言程序设计-第5-9章习题解答.ppt

    C语言程序设计-第5-9章习题解答 华中科技大学计算机学院 C语言程序设计 第5-9章 部分习题解答 作业中问题较多的习题 第5章5.4(2) 第6章6.1,6.3,6.5(6),6.8 第7章无 第 ...

  9. C++ Primer Plus(第六版)编程练习答案 第4章 复合类型

    本章所有编程练习的工程源码可在此处下载(点击打开下载链接),供大家参考交流! 1. 编写一个C++程序,如下述输出示例所示的那样请求并显示信息: What is your first name? Be ...

  10. C++primer plus第六版课后编程题答案8.3(正解)

    在百度知道里面得到了正确的答案 http://zhidao.baidu.com/question/198940026560129285.html?quesup2&oldq=1 #include ...

最新文章

  1. 2021年大数据Spark(十一):应用开发基于IDEA集成环境
  2. 2018,送给大家一份提升技术的宝典
  3. php fetchassoc 跨表,php-mysqli_fetch_assoc-如果同时更改数据会怎样?
  4. python什么模块动态调用链接库_python如何调用扩展模块
  5. 转: 三大WEB服务器对比分析(apache ,lighttpd,nginx) (2008年的旧文,仅供参考之用)...
  6. [BT5]信息收集1-2 Dnsmap
  7. 前端学习(1833):前端面试题之nodejs的轮询机制
  8. .net伪静态传多个参数
  9. android平台Camera采集数据ffmpeg进行编码探究
  10. 用java写一个双色球的彩票程序(源码)
  11. php留言板入门教程,一个php留言板实例
  12. 大数据集群安装02之Hadoop配置
  13. android sd卡 f2fs,显著提速!谷歌Pixel 3/3 XL使用了三星F2FS文件系统
  14. 开源机器学习项目的简单介绍
  15. getParameterValues 和 getParameter区别
  16. 将Excel列转为字符串存到数据库表中
  17. rust石墙掉耐久_rust恢复房子耐久 | 手游网游页游攻略大全
  18. 阿里云图片服务器OSS对象存储器使用方法(附详细步骤)
  19. “槑囧圐圙”您认得这些汉字吗?
  20. (一)AC6(System Workbench for STM32)简单介绍及创建一个简单的STM32的工程

热门文章

  1. 【python】TCP协议编程
  2. Pascal VOC Dataset 下载地址
  3. 翻译记忆软件-塔多思TRADO经典教程_5
  4. python分支语句中if和else必须同时出现吗_多分支决策必须采用嵌套的if-else语句实现: A、 对 B、 错_学小易找答案...
  5. CWM模式(卡刷)教程
  6. 稳定版本php源包下载,PHPWind历史版本及升级包下载(v1.0.0 - v9.0.2、Ofstar to PW)20170501更新...
  7. python 排队论_建模算法(七)——排队论模型
  8. ppt的计算机试题,2016年职称计算机考试PowerPoint练习试题及答案
  9. 通过本地上传工具把CSV文件导入到百会报表
  10. 【历史上的今天】6 月 25 日:笔记本之父诞生;Windows 98 发布;通用产品代码首次商用