我们在小学的时候,学完了什么是数字之后,接下来学习的是什么呢?
答:数字的加、减、乘、除的基本运算
同理,上一篇学习了什么是向量之后,我们接着来学习向量的基本运算
我们先来看一个东西,如下图
相信,很多人都不会陌生,我们高中学习物理的时候,都学习过平行四边形定则。两个力合成时,以表示这两个力的线段为邻边作平行四边形,这个平行四边形的对角线就表示合力的大小和方向,这就叫做平行四边形定则(Parallelogram law)。
但是为什么会这样啊?大家想过没有??
虽然可以从不同的角度,不同的学科来解释,但是这里数学的几何来直观的解释:
我们知道力是矢量,也就是向量,既有大小又有方向
我们使用下面数学的这个例子来说明平行四边形法则:
我们可以理解为:
从原点出发,先走到(5,2)这个位置,再从(5,2)这个位置出发,再走(2,5)这个向量所对应的这么多的位移,最终我们到达的这个位置就是向量加法的结果最终的结果相当于从(0,0)这个位置到达了(7,7)这个位置的位移
连接起点(0,0)和终点(7,7)就有一个三角形的形状,这不就是我们物理中学习的三角形定则吗?
其实;三角形定则是平行四边形定则的简化。平行四边形定则的实质是一样的 ,都是矢量运算法则的表述方式。
如果我们在三角形的另外一侧相应的补上和这两个向量平行的两条边的话,就出现了平行四边形
总结这个过程:
从原点(0,0)出发,先向x轴方向移动了5个单位,再向y轴移动了2个单位,这个就是(5,2)这个向量表示的含义
接着,从(5,2)这个坐标点,先向x轴移动2个单位,再向y轴移动5个单位,(2,5)向量表示的含义
最终我们从原点(0,0),总共向x轴移动了7个单位,总共向y轴移动了7个单位,这就是我们得到的向量(7,7)
总结出结论:
抽象,从2维扩展到3维:
同样扩展到n维:
这里向量的减法就不做说明和演示了,因为减法的本质其实可以理解为加法,因为“减去一个数相当于加上这个数的相反数”
向量的数量乘法:
总结:
下面使用Python来实现向量的基本运算:
class Vector:
def __init__(self, lst):
self._values = list(lst)
def __add__(self, another):
"""向量加法,返回结果向量"""
assert len(self) == len(another), \
"Error in adding. Length of vectors must be same."
# return Vector([a + b for a, b in zip(self._values, another._values)])
return Vector([a + b for a, b in zip(self, another)])
def __sub__(self, another):
"""向量减法,返回结果向量"""
assert len(self) == len(another), \
"Error in subtracting. Length of vectors must be same."
return Vector([a - b for a, b in zip(self, another)])
def __mul__(self, k):
"""返回数量乘法的结果向量:self * k"""
return Vector([k * e for e in self])
def __rmul__(self, k):
"""返回数量乘法的结果向量:k * self"""
return self * k
def __pos__(self):
"""返回向量取正的结果向量"""
return 1 * self
def __neg__(self):
"""返回向量取负的结果向量"""
return -1 * self
def __iter__(self):
"""返回向量的迭代器"""
return self._values.__iter__()
def __getitem__(self, index):
"""取向量的第index个元素"""
return self._values[index]
def __len__(self):
"""返回向量长度(有多少个元素)"""
return len(self._values)
def __repr__(self):
return "Vector({})".format(self._values)
def __str__(self):
return "({})".format(", ".join(str(e) for e in self._values))
测试代码:
from playLA.Vector import Vector
if __name__ == "__main__":
vec = Vector([5, 2])
print(vec)
print("len(vec) ={}".format(len(vec)))
print("vec[0] ={}, vec[1] ={}".format(vec[0], vec[1]))
vec2 = Vector([3, 1])
print("{}+{}={}".format(vec, vec2, vec + vec2))
print("{}-{}={}".format(vec, vec2, vec - vec2))
print("{}*{}={}".format(vec, 3, vec * 3))
print("{}*{}={}".format(3, vec, 3 * vec))
print("+{}={}".format(vec, +vec))
print("-{}={}".format(vec, -vec))
运行结果:
向量运算的基本性质:
回忆我们⼩学时学习的数的运算,我们也要先有数的运算的相关性质,之后才敢进⾏更加复杂的运算
⽐如:加法交换律,乘法交换律,加法结合律,乘法结合律,等等
对于向量运算,我们也要这么做
零向量
Python实现零向量:
只需要在我们的Vector方法中添加一个这样的类方法:
@classmethod
def zero(cls, dim):
"""返回一个dim维的零向量"""
return cls([0] * dim)
测试效果:
总结:
两个视角看待了向量:有向的线段
高维空间中的数据点
两个视角可以相互转换