什么是向量
-
向量是线性代数研究的基本元素
-
向量的起始点不重要,为方便起见,全部看做从原点出发
-
向量的顺序重要,不同的顺序是不同的向量
-
向量可以描述 n 纬的世界,不仅仅是平面或 3 维空间
比如刻画一个房子:
面积 |
卧室 |
卫生间 |
最近地铁站 |
价格 |
120 |
3 |
2 |
2 |
666 |
可用 (120,3,2,2,666) 来描述此房子,看似不表示方向,但却是高维空间中的点,在高维空间中表示方向,只是我们没办法直观理解高维空间中的点。
-
向量不仅仅是一组数,更是一个有向线段,更是空间中的一个点
向量的更多属于和表示法
向量更严格的定义:
- 一个数字是标量,一组数字是向量
- 向量上面画箭头或粗体,如:λ、λ,标量仅用代数,用符号代表数
- 行向量:(3,4)、列向量:(34),使用中更常见的把数字码成一列,也可以使用 (3,4)T 转置用行向量的方式表示列向量
实现自己的向量
在 python 中,我们使用数组来保存向量中的数字。
class Vector:
def __init__(self, lst): self._values = lst
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))
|
向量的基本运算
向量加法
如 (5,2)T+(2,5)T=(7,7)T
向量相加等于两个向量首尾相接构成的平行四边形的对角线。
数量乘法
如 2×(5,2)T=(10,4)T
数量相乘相当于 2 个 (5,2) 相加。
推广到 n 纬中:
k⋅⎝⎜⎜⎛v1v2…vn⎠⎟⎟⎞=⎝⎜⎜⎛k⋅v1k⋅v2…k⋅vn⎠⎟⎟⎞
实现向量的基本运算
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, 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))
|
向量基本运算的性质
- 交换律1:u+v=v+u
- 交换律2:(u+v)+w=v+(u+w)
- 结合律1:k(u+v)=ku+kv
- 结合律2:(k+c)u=ku+cu
- 交换律3:(kc)u=k(cu)
- 1u=u
举例证明:k(u+v)=ku+kv
k(u+v)=k⎝⎜⎜⎛u1u2⋯un⎠⎟⎟⎞+⎝⎜⎜⎛v1v2⋯vn⎠⎟⎟⎞=k⎝⎜⎜⎛u1+v1u2+v2⋯un+vn⎠⎟⎟⎞=⎝⎜⎜⎛ku1+kv1ku2+kv2⋯kun+kvn⎠⎟⎟⎞
ku+kv=k⎝⎜⎜⎛u1u2⋯un⎠⎟⎟⎞+k⎝⎜⎜⎛v1v2⋯vn⎠⎟⎟⎞=⎝⎜⎜⎛ku1ku2⋯kun⎠⎟⎟⎞+⎝⎜⎜⎛kv1kv2⋯kvn⎠⎟⎟⎞=⎝⎜⎜⎛ku1+kv1ku2+kv2⋯kun+kvn⎠⎟⎟⎞
左边等于右边,证明完毕。
零向量
零向量:对于任意一个向量 u,都存在一个向量 O ,满足 u+O=u。
证明:
因为
u+O=⎝⎜⎜⎛u1u2…un⎠⎟⎟⎞+⎝⎜⎜⎛o1o2…on⎠⎟⎟⎞=⎝⎜⎜⎛u1+o1u2+o2…un+on⎠⎟⎟⎞=⎝⎜⎜⎛u1u2…un⎠⎟⎟⎞
所以
⎩⎪⎪⎨⎪⎪⎧u1+o1=u1u2+o2=u2…un+on=un⇒⎩⎪⎪⎨⎪⎪⎧o1=0o2=0…on=0⇒O=⎝⎜⎜⎛00…0⎠⎟⎟⎞
注意:零向量不用箭头,零向量没有长度(不用定义有几个0)。
可以从零向量引申出负向量:对于任意一个向量 u,都存在一个向量 −u ,满足 u+−u=O,且上述 −u 唯一。此定理可用反证法证明。
代码实现零向量(在 class Vector
里添加):
@classmethod def zero(cls, dim): """返回一个dim维的零向量""" return cls([0] * dim)
|