四时宝库

程序员的知识宝库

026 《编程&数学》 向量基本运算

继续学习向量,上节课构出来一个基础的向量类,这节课就来学习一下向量的几种基础的运算方法。一种是加法,一种减法,还有一种叫数量乘法。注意看,它叫做数量乘法,是用标量乘以项量或者是用项量乘以标量,并不是直接用项量乘以项量,所以叫数量乘法。

代码已经都学好了,一起来分析一下。可以看到这些代码写的这些函数都是什么函数?都是魔法函数。魔法函数的格式是固定的,都是两个下滑线开头,两个下滑线结尾。自己声明一个普通函数,不是这样的,这是自己声明一个普通函数,颜色就不一样对不对?

像这种魔法函数怎么去理解?这里简单的说一下,这属于是拍成的技术知识,可以这么去理解,就是自己生命的每一个类其实都有一个负类,就是继承之某一个负类真实。假设这个负类叫发的,就是父亲,这个负类其实是一个隐藏的类,这里看不到,是这个拍摄,开发者帮我们学好了一个负类。

当学好这个类的时候就会自动的继承这个负类,然后这个负类里面就有这些魔法方法或者叫魔法函数,就帮我们写好了这些魔法函数。所以继承过来之后就可以重新复写这个函数,因为它有,因为父亲里面有,所以作为子类就可以直接去复写。

复写之后就可以对原有了这个负类里面的函数的功能进行改造,让它满足需求。就像上节课说的这个epr,对它进行改造以后,在打印输出的时候就可以按照自己预设的格式进行排版,大致就这么个意思,可以这么去简单理解。

来看这个项链类,出水化的时候给它做一个加工,用这个list对它做一次类型转换。这样的转换的好处就是可以对传入数据做一次拷贝,这样操作的时候就不是直接传入传入数据本身的,操作的是它的副本,这样就避免了原始数据被篡改。

这三个函数是上节课讲过了,这就不再催数了。来看这个魔法函数add,它可以传入一个参数叫啊的,然后这个函数就是用来做加法运算的。传入另外一个项链,然后返回一个新的项链。这里有个关键词设置,它是干嘛的?是用来判断前面这个条件是否成立,如果成立代码就继续往后执行,否则就抛出一个错误,这个错误的内容可以自己指令。

这里判断什么?判断自身这个项量,和做加法运算的对象项量,它们的长度也就是维度是否相同。如果相同才能够做运算两个项量,它们之间做加法或者做乘法都需要判断它们的维度或者长度是否一致,不一致项链是无法做加减的。

如果它们长度一致就返回一个新的项链,项链里面的值用了一个列表推导式对不对?但如果忘了什么是列班老师,就看一下这个专题,前面有一集讲的是平均数,在平均数这一集里面详细讲解列班老师步骤一步一步是怎么来的,这里就不做赘述了。

前面讲平均数的时候列表上表示它的格式是不是和这里差不多,几乎就是一模一样。返回的结果就是把项链两个里面的值进行一对一的相加,然后重新压缩,重新打包,再返回一个新的项链,就这样。后面就是减法,减法和加法就改个符号就行了,把加号改减号就行了,没什么好说的。

继续来看乘法,看乘法这里传了一个参数,不是向量,前面加法和减法运算传了另外个参数,其实都是另外一个向量,这有说明看见没有?的是另外一个向量。这里传参数k只是一个标量,是用标量乘以向量里面的每一个值,然后把这个值重新作为数据传到新的向量类里面去。

这个乘法还写了两个函数,一个是m、u、l,还一个是r、m、u、l,为什么要写两个?后面再说,这个函数写的很简单,直接返回c、f乘以k,因为前面已经是现在乘法运算,所以在这里用self乘以k其实就可以怎么样,其实就可以去调用这个函数。

调用m、u、l函数这么说可能不大好理解,先不要着急,先往后看,后面这两个魔法还说一个pos,一个aeg,它们分别代表什么?代表在于项量本身做取证和取负操作的时候会返回个什么结果?取证就是在项量前面写个加号,取负就写个负号。

最后还有一个inter迭代器,迭代器是一个非常特殊的魔法函数,在复循环便利某个数据结构的时候会自动调用该数据结构的应用方法。如果这里的返回数据结构是可迭代的,复循环会自动调用该数据结构的next的方法。如果这里返回数据结构是不可迭代的,则会用该数据结构的getitem方法。

这里简单解释一下,一般用负循环便利列表。为什么可以便利?像这样,每个列表假如有个列表等于一、二、三,用废话怎么变例?for is in list,就可以变例。

这样变例为什么可以变例?因为列表数据类型或者数据结构,我们的π乘π是帮他设计下这个方法的,就这个inter方法,有这个音的方法就是可迭代的。用复循环去辨别它的时候就会调用数据结构里面的next的方法。

在后面做加法运算的时候,这里有个列表推导式,有个复循环,在这里其实就对数据类型在做复循环便利。既然要便利就需要怎么样?就需要实现这个方法。只有给自己生命的累实现了这个方法之后,在便利的时候才会认为是可便利的对象。

讲的不是很好,如果还不是很明白可以去搜索一下迭代器,看一下相关的学习资料。这里先把后面的代码删掉,这里申明了两个项链,一个项链一,一个项链二。项链一是二、三,项链二是五、八。

来看一下相加和相减分别可以得到什么结果?相加就是二加五七,三加八十一,这很直观。二减五,负三,三减八,负五对不对?相加相减没什么好说的,比较简单。

再看乘法运算,一乘以三,看结果,就是二乘以三等于六,三乘以三等于九。选项意见为什么乘法会有结果?因为前面复习下函数m、u、l,这里把代码给注视掉,写个pass,看结果还有没有?没有了是吧?如果把代码给恢复,把下面乘法注视掉,来看有没有影响?没有影响,还是一样有结果。

如果把标量放前面,把项量放后面,有结果吗?就没有结果了。为什么?因为项量和标量相乘,顺序不同,需要实现的距离方法其实是不同的。只有同时实现了r、m、u、l和m、u、l这两个魔法函数才可以满足向量和标量相乘的时候,顺序无论前后都可以得到想要的结果,就这个意思。

所以这里需要实现两个乘法函数。最后是向量的取正和取负,用这两个向量相减,给它取正,取正就返回向量本身,取负就是返回负一乘向量结果。来看一下结果,最后两个是先取正,然后再取正。取负,这个相减,相量一减去相量二,它的结果是负数,负三和负五,取正返回的向量本身,所以符号并不会被改变。

·最后一个四乘以向量二,四乘向量二,结果就是二十和三十二,原本都是正数,前面加个负号就可以怎么样,也可以取相反数。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接