[程序观点下的线性代数.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[程序观点下的线性代数

程序观点下的线性代数线性代数是什么?在大学数学学科中,线性代数是最为抽象的一门课,从初等数学到线性代数的思维跨度比微积分和概率统计要大得多。很多人学过以后一直停留在知其然不知 其所以然的阶段,若干年之后接触图形编程或机器学习等领域才发现线性代数的应用无处不在,但又苦于不能很好地理解和掌握。的确,多数人很容易理解初等数学 的各种概念,函数、方程、数列一切都那么的自然,但是一进入线性代数的世界就好像来到了另一个陌生的世界,在各种奇怪的符号和运算里迷失了。我在初接触线性代数的时候简直感觉这是一门天外飞仙的学科,一个疑问在我脑子里浮现出来:线性代数到底是一种客观的自然规律还是人为的设计?如果看到这个问题,你的反应是“这还用问,数学当然是客观的自然规律了”,我一点儿都不觉得奇怪,我自己也曾这样认为。从中学的初等数学和初等物理 一路走来,很少人去怀疑一门数学学科是不是自然规律,当我学习微积分、概率统计时也从来没有怀疑过,唯独线性代数让我产生了怀疑,因为它的各种符号和运算 规则太抽象太奇怪,完全对应不到生活经验。所以,我还真要感谢线性代数,它引发了我去思考一门数学学科的本质。其实,不止是学生,包括很多数学老师都不清 楚线性代数到底是什么、有什么用,不仅国内如此,在国外也是这样,国内的孟岩写过《理解矩阵》,国外的Sheldon Axler教授写过《线性代数应该这样学》,但都还没有从根本上讲清楚线性代数的来龙去脉。对于我自己来讲,读大学的时候没有学懂线性代数,反而是后来从编程的角度理解了它。很多人说数学好可以帮助编程,我恰好反过来了,对程序的理解帮助了我理解数学。本文的目标读者是程序员,下面我就带各位做一次程序员在线性代数世界的深度历险!既然是程序员,在进入线性代数的领域之前,我们不妨先从考察一番程序世界,请思考这样一个问题:计算机里面有汇编、C/C++、Java、Python等通用语言,还有Makefile、CSS、SQL等DSL,这些语言是一种客观的自然规律还是人为的设计呢?为什么要问这样一个看起来很蠢的问题呢?因为它的答案显而易见,大家对天天使用的程序语言的认识一定胜过抽象的线性代数,很显然程序语言虽然包含了 内在的逻辑,但它们本质上都是人为的设计。所有程序语言的共同性在于:建立了一套模型,定义了一套语法,并将每种语法映射到特定的语义。程序员和语言实现 者之间遵守语言契约:程序员保证代码符合语言的语法,编译器/解释器保证代码执行的结果符合语法相应的语义。比如,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用JavaScript写了一个虚拟机,把Linux跑在

文档评论(0)

xuetingting + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档