假如说有个大佬说app怎么样给我一套性价比特别好的配置单,我随意更换成自己喜欢的品牌,原配置也有保留,会有什么

Rancher2.0+Kubernetes(k8s)+Docker+SpringCloud 部署分布式服务 (1)
SpringCloud:
一般使用SpringCloud写好每个Service后,使用jar包的形式部署,一般架构为Eureka+Config+Feign+Sleuth+Zipkin的形式,常用的还有Zuul实现路由网关的功能,由于项目中没用,这里不做介绍
Eureka(client+server)提供了服务注册和服务发现的功能
Config(client+server)提供每个service的相关配置动态获取
Feign:提供了负载均衡和熔断的功能,即 Ribbon和Hystrix的功能
Sleuth+Zipkin:提供了每个service之间相互调用的链路追踪的功能
整个架构的流程大致是这样的:
1、先启动服务注册中心(eureka server),单独的一个service
2、再启动配置中心(config server+eureka client),单独的一个service
3、启动Zipkin.jar,这是官方提供的一个jar包,在启动时指定mysql路径,为了方面这里我们称为zipkin server
3、启动业务service-1(包含了eureka client+config client+sleuth+zipkin client),service-1提供一个接口(定义为接口A)供service-2调用
4、启动service-2(包含了eureka client+config client+sleuth+zipkin client+feign)
每当service-1、service-2启动的时候通过eureka client向服务注册中心注册服务,通过config client向配置中心请求数据,配置中心则通过远端的git仓库拉取数据,service-2通过feign调用service-1的接口A,如果我们启动了两个service-1,则feign就会根据默认的负载均衡规则选择调用恰当的service-1实例,如果接口A超过一定时间没有响应则会进入熔断(Hystrix)的逻辑。Feign是这么知道service-1的地址呢?就是通过注册中心(eureka server),service-2调用service-1的A接口,这条接口调用记录会被sleuth+zipkin client 采集并通过ip+端口的形式传给 zipkin server 最终写入zikpin server关联的数据库中,不可能每条都要被记录,这样会很耗性能,所以可以设置采样率,一般设置为1%。
由上面的流程可以清楚的知道注册中心和配置中心的重要性,因此都要做成高可用模式
config 是支持实时刷新的,即,远端git仓库更新了service的相关配置,会自动更新每个service的配置,看起来很高大上,其实没啥卵用,因为service的配置很多都是不支持热更新的,即,在运行状态下不可修改,支持热更新的配置很少很少,大部分配置都是在启动后不可修改
SpringCloud 入门可以参考这篇文章:
在学习SpringCloud之前建议先看看《微服务:从设计到部署》这本书,对微服务有个整体的认知
Docker(已改名为 Moby):
什么是Docker?Docker有哪些优势?这类问题,网上一搜有很多答案,用了Docker后最大的感觉就是不用因为要换服务器而再重复的配置各种东东啦,像我之前要部署ELK,换台服务器就要重配置一下,费事费力,用了Docker以后只要pull一下已经做好的image 然后run 一下就行了,省时省力,当然docker还有其他许多优点,比如:隔离性,一致性环境 ,便于排错等等。
Docker中的几个概念:
1、dockerfile:制作image的DSL
2、layer:在dockerfile文件中每一行就是一层,每一层最终会变成文件,所以在dockerfile中不要存在不必要的东西,少换行
3、image:将应用打包好之后的存储方式,一个image包含多层layer
4、镜像仓库:存放image的地方,便于image的重复利用,别人要是想用这个image直接pull就可以了
5、container:容器,run后的image,包含了文件资源(image展开)和系统资源(变成process存在于系统中)
6、docker-compose:一中编排工具,用于一次性 run 多个image
7、docker swarm:docker自己的容器调度平台
8、kubernetes:google推出的容器调度平台,渐渐成为主流
docker是不支持容器的跨主机通信的,同宿主机中得不同container之间通过docker0网桥进行通信,如果要实现container的跨主机通信,需要另行配置一些东西
Docker学习推荐《Docker-从入门到实践》在线阅读地址:
Kubernetes:
当容器部署的越来越多,部署到不同的宿主机,怎么去管理这些容器?怎么更有效率的进行业务的平行扩展?等等一系列问题,有了K8s就很方便的处理。Kubernetes是Google的开源系统,用来自动部署、缩放和管理容器应用。它可以使用多语言并且提供原语服务开通、运行、缩放和分布式系统管理。
Kubernetes学习 推荐《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第二版)》,对K8s有个整体的认知,虽然K8s更新的很快,但是主体架构是不会变的,更多的是逐步完善。
由上图可知K8s中分为Master节点和Work节点,Master管理这些Work节点,Work节点实际上就是跑容器的主机
K8s中有几个很重要的概念:
K8s最小的调度单位,里面存放的是业务容器,一个pods拥有一个IP,内部可以有一个或多个业务容器(容器解耦),endpoint 是pod的入口,在pod里会运行一个特殊的容器,pod中的其他业务容器共享该容器的网络栈和volume挂载卷
是对一组Pod的抽象,它会根据访问策略(如负载均衡策略)来访问这组Pod。每个Service都有个Cluster IP用于集群内部通信,当然也可以映射一个端口到宿主机,使得外部能访问,一个Service相当于实现了某个功能的微服务,而Pod副本的个数相当于这个微服务有多少个实例。
NameSpace:
Namespace在很多情况下用于实现多租户的资源隔离。Namespace通过将集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
下面三个是在Master节点上运行的服务
ApiServer:
对内:集群内各个模块之间数据交互和通信的中心枢纽,在master上执行的yaml文件通过apiserver与node节点的kubelet交互,通过kubelet在node节点上创建相应的pod
对外:提供了API入口(URL地址),用于查看pod的详细信息等等
Schedule:
主要功能是选择恰当的Work节点,并执行Pod副本
ControllerManager:
集群内部的管理控制中心,包含多个Controller,比如 ReplicationController、ResourceQuotaController、NameSpaceController等等
下面两个Work节点上运行的服务:
配合API Server 完成Pod的创建、删除、管理等操作
kubelet作为连接Kubernetes Master和各节点机之间的桥梁,管理运行在节点机上的Pod和容器。kubelet将每个Pod转换成它的成员容器,同时从cAdvisor获取单独的容器使用统计信息,然后通过该REST API暴露这些聚合后的Pod资源使用的统计信息。
Kube-proxy:
kube-proxy进程获取每个Service的Pod副本的Endpoints,核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上,实现了Service的负载均衡功能。
配置好K8s后work节点相关信息会被保存到master节点中的etcd中,如果想要运行某个微服务大致过程是这样的。这里以ReplicationController为例(其核心作用是确保在任何时候集群中一个RC所关联的Pod副本数量保持预设值),编写好相应的RC.yaml文件,和Service.yaml文件,在Master节点上使用kubectl命令运行RC.yaml文件该命令,首先会通过scheduler选择合适的work节点,然后通过apiserver和work节点的kubelet交互,由kubelet创建对应得Pod,假如Pod中需要运行2个容器,但实际上k8s会运行3个容器,2个业务容器和一个特殊的容器,这两个业务容器会共享这个特殊容器的ip和volume。
额外补充:
1、K8s本身并不会对跨主机容器网络进行设置,需要额外的工具实现容器的跨主机通信,比如
2、在Kubernetes中,每个Service之间是通过Cluster IP进行通信的,为了能够通过服务的名字在集群内部进行Service的相互访问,则需要创建一个DNS服务完成服务名到Cluster IP的解析
Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。
简单来说,Rancher可以让我们快速的部署K8s,Rancher有两个版本1.6和2.x,主要区别在于1.6的版本支持多种容器调度工具,
比如:、、和Rancher自己的Cattle,要支持那么多容器调度工具是很吃力的,2.x重心放在了K8s上,可见Rancher在压宝K8s。
rancher官网
本文只做简单的概述,下一篇将使用Rancher2.0将SpringCloud项目部署到K8s上
没有更多推荐了,【科普】总结了一些新手常见提问。有什么不懂可以问我。长期有效【拯救者游戏本吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:59,485贴子:
【科普】总结了一些新手常见提问。有什么不懂可以问我。长期有效收藏
新买了一台电脑。在贴吧里待了几天。发现很多问题,真的有点奇葩级别的。。。所以发个帖子来给那些所谓的小白看看。估计看完我这个帖子,会有很多人骂我吧。无所谓了。
但是我想说的是,“小白”没错,但是希望大家不要以“小白”为借口,张口就是问。最基本的,把你的问题拿到百度上一搜,十个问题,9个能搜到答案吧?何必再这个上面问,大部分是一些普通网友,回答的也不专业,还得等着,没时候能回复。和百度一比我觉得百度又快又详细吧。。。?
还是说您宁可相信一个半吊子外人也不肯相信自己。。。我觉得我对于电脑,还算是略懂吧,当然跟专业的肯定比不了。
我之前的电脑,6年前的Y470,拆成零件清灰,换CPU导热硅脂,各种方法做系统。
至今这个电脑还能在win10系统下低配流畅打英雄联盟。大家有什么不懂的可以问我,但是我也希望是一些正常的问题。。。尤其那些百度上有的,肯定比我回答的好多了!下面进入正题。1. 我新买的电脑到手了,求大神帮我看一下有没有问题?是正品/真的么?(顺便配两张鲁大师)
无语程度:四颗星
首先,电脑这种数码产品,属于高精密的电子类产品。它不像是鞋子:不需要什么高端技术,甚至夸张点讲,可能给你原材料,再配上一些剪刀,针线之类的工具,你也能做出来。
而电脑呢?是绝不可能和鞋子一样,三五个人在一个小作坊里面就能做出来的。光模具就得多少种?
还有焊接等等。技术不提,光这些,就不是手工完的成的,需要多少高成本的精密仪器呢。而技术,可能我孤陋寡闻,据我所知,目前市面上掌握成熟显卡技术的,只有英伟达和ATI,CPU只有英特尔和AMD。手机级别就不提了。还有没有我不知道,不过不管怎么样,现如今全世界只有个位数而已。所以可以看出来,它的入行成本,已经不是用极高可以形容的了。已经不是有点钱,我想干,就能干得了的了。
所以它绝对不可能出现例如饮料,八个核桃(六个核桃),雲碧(雪碧),詠动(脉动),这种改一个汉字、字母,来仿真造假的情况。
因此,它只有在配置上动手脚,例如同型号新的换成二手,或者把配置换低。再就是吧别人退回的,给你发过去了。所以在这个时候,几张鲁大师的配置图片能看出来什么?部件换成二手的了,照片直接拍那些部件,没细节,都不一定能看得出来呢。至于换成低配, 8G换4G,7代U换6代U,硬盘1T换成500G,
这些还需要外人帮你看么?而且这些太不常见了,可能也就二手市场会多一些,比如通过修改注册表啊之类,让4G内存显示成32G的,但是也很容易发现,进入bois或者重做系统。毕竟只是显示成32G,但4G再怎么样,也不能真的当32G用啊。
所以我说这个问题它就不成立,可能有点台侮辱各位了,可是。。。我是真的不明白这个问题是在问什么。2. 我XXXX元入手的,有没有高啊?
无语程度:两颗星
我把这个问题标为是两颗星,是因为它起码算是一个问题。
我真想问一句:难道您买之前,就不知道货比三家么?非要买了之后才后知后觉。实体店,官网,X东,X马逊,X猫,X宝等等,通常哪家最便宜还用我多说吗?现在网络这么发达,不知道也可以搜索啊 也不费事。X宝肯定是最便宜的。
至于有些人是通过关系成本价入手的,您知道了也就是徒增烦恼而已。我相信您肯定没那个途径。哪怕,您知道了某个地方,比你买的便宜很多,难不成您还要把自己的退掉,然后跋山涉水的去对方城市买么?恐怕省下来的钱都不值车费吧。3. 我该不该等新款?
无语程度:一颗星。
就像大部分人说的,早买早享受,我觉得还是很有道理的。什么时候有需求,就什么时候买,就好。没必要为了某某款,特意等好久。当然,你特别喜欢那款,就当我没说。
现在的电子产品可能半年甚至几个月就是一次更新换代。问题是虽然更新换代比较勤,但是两代间差距也并没有拉开多大!我回答不少吧友也是这么说的:现在的电子产品可能已经属于性能溢出了!比如8000元的手机,配置可能比2000元的高了好几倍,但是打开软件的速度会是好几倍?打游戏可能会流畅一点,但是一发子弹当2发?跑一步等于别人跑三步?都不会的!而且提升的这个流畅性(FPS),也没有太大实际意义,我不信一个2000元的新手机,到手打游戏就会卡。配置好那么一点点,又能怎么样?老款寿命5年,新款能多一倍?也不会的。
真正对性能有需求的人,可能买的就是一两万的本子了。而对我们大部分普通人来说,平时也就是看看网页,看看电影,玩玩常见的游戏而已。而对于档次、价位相近的电脑,至少我是没听说同一个游戏这款能玩,另一款就玩不了。
最后还有价格,新品上市,通常折扣力度很小。而老款在这之前就已经开始清仓了。你等几个月,新款出了。再等几个月,更好的配置就发布了,
难不成就为了所谓的高配置,一直等下去么?那么等到十年后,你这个价格,可能买到的就是今天的服务器了呢。
4. 我的本子外壳摔坏了,能保修不?(配了一张图)
无语程度:无限颗星。
一个最基本的常识,任何产品人为损坏都不给保修。
我说是常识应该不过分吧?应该是大家都知道的。 不然说的极端点,我生气了就砸一顿电脑,砸完了我就去保修,那厂家不是赔死了?虽然有点夸张,但是因为这类损坏,厂家根本无法区分你是有意还是无意的,所以都100%不给保修的。这不像是比如显卡烧了,虽然是我玩烧的,但是也很明显是质量不过关啊,不然为什么别人的没坏。
所以我当时就问他,你去饭店吃饭,也会把菜倒掉,然后问老板能不能再给我重新做一份?5. 我想加一块固态硬盘,装完之后怎么区分呀?
无语程度,五颗星。
和上一个问题一样,我说这种问题没脑子,可能有点骂人了,不应该,但是这种问题真的可笑。。
只要多思考一下,能问得出来么?
不会在系统信息里查看,好的。不知道新加入的盘,系统会提示,也没问题。(比如U盘插入电脑,会提示执行什么操作)
一个最简单的,
比如现在系统里是C D E,
新加入硬盘的除了是F还能有别的么?
这个想不到我也不说啥。
连固态硬盘和原有硬盘的容量肯定不一样,也想不到么?
或者原有硬盘里会有文件,而新装的固态,肯定是空白的啊。。类似这种问题,真的是给人打开了一扇新世界的大门。这真的仅仅是“小白”真的仅仅是啥都不知道而已么。。
如果连这种问题都不知道,那么电脑这种产品对他来讲是不是有点太高端????
这个怎么破
请教下楼主,我觉得y720屏幕偏黄,和我之前用的y50很不一样,有什么办法吗?升级显卡驱动有用吗
楼主,我的r720是三月买的,刚开始一直开机.7秒,现在每次都是20多秒,什么开机启动项都给关了,而且垃圾也清理了,但是还是没用,怎么治
楼主看这~~ 我和同事一起买的,都出现了同一个问题:网线接口那只识别特定的网线。换了四五个正常的网线接口,别的电脑都正常用,就拯救者不能用。后来同事找到一个能用的,我抱过去,也能用,其他的还是不能用。这是什么情况呢?感谢。
R720拯救者 1060maxQ那款值得入吗
那个mse一直占用资源,打lol经常卡退,开机也一直20多秒,
楼楼,我一月份入的720。这几天感觉有点不对劲,看视频看网页突然卡死,,鼠标可以动页面卡死或者无线网卡没有网络只有重启才可以。然后这几天关机屏幕熄了风扇还要转好久才停。
前段时间玩吃鸡不卡
可是更新完驱动之后变的贼卡怎么办
我也不知道是不是驱动的事情 显卡我也设置了独显大神求支招
拯救者r720,然后好像i5,1050ti,装了校园10m的宽带,为什么打个lol那么卡啊求问是网的问题还是电脑的问题还是我没设置好啊
拯救者Y520就是下午玩游戏忘记插电了,然后后来插上了还是没办法的掉帧,之前的开机时间都是6秒,现在要10秒,反正就是掉帧掉帧,插电lol都上不了60,而且也应该是不是网路问题,单机游戏试了也是掉
楼主能推荐个8g的内存条吗?不知道买哪个牌子好。
拯救者r720,自带键盘有个别几个键按不出字是怎么回事?而且最近有发现几个键盘不灵敏
几年前,iPhone6s的存储模块,出现过用两种技术的情况,16g的小容量用的好的mlc,64和128的大容量用的不好的tlc。有对比就会有伤害嘛,所以一些买到tlc的,就开始声讨了,一样花钱凭什么给我用不好的。不过我理智分析一波,mlc的擦写次数,大概次。tlc大概500-1000次。以64g的手机为例,擦写累计达到64g,算一次。tlc网上说实际测试可以超过1000次擦写,我们以500次算。64g*500次=累计32000g ,假如我们每天会擦写10g,够我们用将近9年!!而128g的比这个数字还多一倍。而谁能平均每天都用上10g,每天都下载好几部超清电影?绝大部分人,平均每天能用几百兆都应该算是重度使用了吧。。。所以我说你买一个差不多的就行。就是这个道理。和机器同品牌同型号的就好。甚至2手的都没问题。毕竟这东西,不严格的讲,也不算是什么消耗品。都一样用。当然,上当受骗的除外。
实在不好意思,刚看到这么好的码字帖子,加精晚了。
你好,我所在的地区在境外,所以无定法使用网络购买,我去实体店看到,只有这一款,没别的选择, 但是唯一纠结一i按是I7,据说会降频, 所以一直在纠结,可以指点一下,这一款是否会有降频情况存在呢,还有需要自己买一块内存插进去嘛?
I5的也有,但是1050,没有TI, 所以直接被我否定了。。哎
楼主,你的550m还能打lol啊?我之前的y430p打lol都老是跳帧,无法忍受,最近才换的y520(我也是y系列老用户了,从上大学时的y470,没错显卡和你一样550m,到后来换的y430p,显卡gtx850m,再到现在的拯救者y520)
联想笔记本驱动去哪里找,官网吗?联想驱动管理一键下载可以不?
R720开合盖子转轴有滋滋声,
R720浏览网页电池一个半小时正常吗,我看别人都比我的时间长
忽然觉得自己玩鹰被啄了眼。
还帮这个告诉那个的呢。
***给电脑装了win10得有半年了。
刚刚才发现
独显驱动一直没正确安装,控制面板里都打不开。。。一直没发现。
请问楼主我联想拯救者网络显示红叉怎么办
拯救者15isk进取版 i5加固态的话,大佬有好点的推荐吗,120g左右就行
楼主楼主,我去年11月入的i5 1060maxq那款,以前玩游戏一直都最高画质,这几天突然发现同样的游戏现在玩卡的不行不行了,刚才鲁大师性能测试发现显卡评分才一万多,刚开始都是十几万的,这是怎么回事啊?!是显卡崩了吗?
联想电脑管家建议更新因特尔核显驱动需要更新吗大神?
楼主,本小白平时只玩玩lol,偶尔吃吃鸡,想用个4年左右,目前在下面两款中选择,我只玩游戏,有必要等8代u吗
我的拯救者玩吃鸡就是进不去出生点,每次进去飞机已经飞一半了,怎么办
为什么我昨天打游戏的时候fps还能达到120+,今天就是八九十,怎么回事呢?还有就是打游戏的时候就是有大概两秒左右的卡顿现象,求解,麻烦楼主了
楼主,今天逛商场,看到这款,好像是暗影骑士,没了解过,帮看下,靠不靠谱
登录百度帐号数学对于编程来说重要吗?编程大佬眼里的线性代数-学路网-学习路上 有我相伴
数学对于编程来说重要吗?编程大佬眼里的线性代数
来源:SOHU &责任编辑:小易 &
线性代数是什么?
在大学数学学科中
线性代数是最为抽象的一门课
从初等数学到线性代数
思维跨度比微积分和概率统计要大得多
大多数小伙伴学过以后一直停留在
知其然不知其所以然的阶段
若干年之后接触图形编等领域
才发现线性代数的应用无处不在
但又苦于不能很好地理解和掌握
多数人很容易理解初等数学的各种概念
函数、方程、数列
一切都那么的自然
但是一进入线性代数的世界
就好像来到了另一个陌生的世界
在各种奇怪的符号和运算里迷失了
在初接触线性代数的时候
简直感觉这是一门天外飞仙的学科
一个疑问在脑子里浮现出来
线性代数到底是一种客观的自然规律还是人为的设计?
如果看到这个问题
小伙伴的反应是
“这还用问,数学当然是客观的自然规律了”
一点儿都不觉得奇怪
我也曾这样认为
从中学的初等数学和初等物理一路走来
很少人去怀疑一门数学学科是不是自然规律
当学习微积分、概率统计时
也从来没有怀疑过
唯独线性代数让我产生了怀疑
因为它的各种符号和运算规则太抽象 太奇怪
完全对应不到生活经验
引发了我去思考一门数学学科的本质
不止是学生
包括很多数学老师
都不清楚线性代数到底是什么 有什么用
不仅国内如此
国外也是这样
国内的孟岩写过《理解矩阵》
国外的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用Java写了一个虚拟机,把Linux跑在Java虚拟机上,这就是把机器模型往Java模型上映射。
建立新模型肯定依赖于现有的模型,但这是建模的手段而不是目的,任何一种新模型的目的都为了更简单地分析和解决某一类问题。
线性代数在建立的时候,它的各种概念和运算规则依赖于初等数学的知识,但是一旦建立起来这层抽象模型之后,我们就应该习惯于直接利用高层次的抽象模型去分析和解决问题。
说到线性代数是为了比初等数学更容易地分析和解决问题,下面我们通过一个例子来实际感受一下它的好处:
给定三角形的顶点(x1, y1), (x2, y2), (x3, y3),求三角形的面积:
初等数学中三角形面积最著名的计算公式是area = 1/2 * base * height
当三角形有一条边恰好在坐标轴上时我们就很容易算出它的面积。
但是,假如同样一个三角形我们把坐标轴旋转一下,让它的边不在坐标轴上,怎么办?我们还能得到它的底和高吗?
答案肯定是可以的,但是就明显复杂了,而且还要分很多种情况去分别讨论。
相反,如果我们用线性代数知识来解决这个问题就非常轻松。
在线性代数中两个向量a,b的叉积(Cross Product)是一个向量,其方向与a,b垂直,其大小等于a,b构成的平行四边形的面积:
我们可以把三角形的边视为向量,所以三角形的面积等于两个边向量的叉积向量的长度除以二:
area = 1/2 * length(cross_product((x2 - x1, y2 - y1), (x3 - x1, y3 - y1)))
注:length表示取向量长度,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)这个运算:
点积概念的提出属于设计,有发挥创造的余地;一旦设计定了,具体公式就不能随意发挥了,必须符合逻辑,保证它映射到初等数学模型的正确性。
这就像一门高级语言可以定义很多概念,什么高阶函数、闭包等等,但是它必须保证映射到底层实现时在执行产生的效果符合其定义的规范。
线性代数好在哪里?
上面说了,线性代数是一种高层次抽象模型,我们可以采用学习一门程序语言的方法去学习它的语法和语义,但是这一认识不只针对线性代数,它是对每一门数学学科通用的,可能有人会有疑问。
微积分、概率论也是高层次抽象,那么线性代数这种高层次抽象的特点在哪里呢?
这就问到了根本上,线性代数的核心:向量模型。
我们在初等数学中学习的坐标系属于笛卡尔所提出的解析模型,这个模型很有用,但同时也有很大的缺点。
坐标系是人为加上的虚拟参考系,但是我们要解决的问题,比如求面积,图形旋转、拉伸等应用都是和坐标系无关的,建立一个虚拟的坐标系往往无助于解决问题,刚才三角形面积的例子就是这样。
向量模型很好地克服了解析模型的缺点,如果说解析模型代表了某种“绝对性”的世界观,那么向量模型就代表了某种“相对性”的世界观,我推荐把向量模型和解析模型看作对立的两种模型。
向量模型中定义了向量和标量的概念。向量具有大小和方向,满足线性组合法则;标量是只有大小没有方向的量(注:标量的另一种更深刻的定义是在旋转变换下保持不变的量)。
向量模型的优点之一是其坐标系无关性,也就是相对性,它在定义向量和运算规则的时候从一开始就抛开了坐标系的束缚,不管坐标轴怎么旋转,我都能适应,向量的线性组合、内积、叉积、线性变换等等运算全部都是坐标系无关的。
注意,所谓坐标系无关性不是说就没有坐标系了,还是有的,刚才三角形例子的顶点就是用坐标表示的,只是在解决问题的时候不同的坐标系不会构成影响。
用一个比喻,Java号称平台无关,不是说Java就是空中楼阁,而是说小伙伴用Java编程时底层是Linux还是Windows往往对自身没有影响。
向量模型有什么好处呢?
除了刚才三角形面积问题是一个例子,下面再举一个几何的例子:
给定三维坐标系中的一点(x0, y0, z0)和一个平面a*x + b*y + c*z + d = 0,求点到平面的垂直距离?
这个问题如果是要从解析几何的角度去解决几乎复杂到没法下手,除非是平面恰好是过坐标轴的特殊情况,但是如果从向量模型考虑就很简单:
根据平面方程,平面的法向量(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"https:,只需要用旋转变换矩阵(Rotation Matrix)去乘v0就可以了。
除了旋转变换,拉伸变换也是一种常见的变换,比如,我们可以通过一个拉伸矩阵把向量沿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的递推变换矩阵:
并进一步得到:
这样就把线性递推问题转化为了矩阵的n次幂经典问题,在O(log n)时间复杂度内解决。除了线性递推数列,初等数学中著名的n元一次方程组问题也可以转化为矩阵和向量乘法形式更容易地解决。
这个例子是想说明,凡是满足线性关系的系统都是向量模型的用武之地,我们往往可以把它转化为线性代数得到简洁高效的解决方案。
本文提出了一种观点:从应用的角度,我们可以把线性代数视为一门特定领域的程序语言。线性代数在初等数学基础上建立了向量模型,定义了一套语法和语义,符合程序语言的语言契约。
向量模型具有坐标系无关性和线性性,它是整个线性代数的核心,是解决线性空间问题的最佳模型。向量的概念、性质、关系、变换是掌握和运用线性代数的重点。
对于编程来说,学好数学是必不可少的。对于线性代数而言,用编程的方式来思考可以帮助理解。
∑编辑 | Gemini
责任编辑:
本文相关:
- Copyright & 2018 www.xue63.com All Rights Reserved

我要回帖

更多关于 合作了一年的大佬说他喜欢我 的文章

 

随机推荐