1. 向量

image.png

在刻画房子的时候,可以用如上的五个维度。
所以就可以用(120,3,2,2,666)这个向量来表示。
向量里蕴含了方向和大小。因为(4,3),(8,6)是不同的向量。
方向和点是一一对应的。因为当坐标轴原点都取0的时候,就等价了。


image.png

理解向量可以从下面2个角度去理解。
一个是一个有向线段,一个是空间中的一个点。

image.png

我们在这里考虑向量是和起始点无关的。


image.png

实现自己的向量类

class Vector:

    def __init__(self, lst):
        self._values = lst

    def __getitem__(self, 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))

向量的加法

image.png

image.png

向量的数量乘法

本质是向量的加法,所以可以用加法的定义去得到公式。


image.png

image.png

实现自己的向量运算

    def __iter__(self):
        return self._values.__iter__()

    def __add__(self, another):
        assert len(self) == len(another), \
            "error in adding. length should 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 should be same"
        return Vector([a - b for a, b in zip(self, another)])

    def __mul__(self, k):
        return Vector([a * k for a in self])

    def __rmul__(self, k):
        return self * k
    
    def __pos__(self):
        return 1 * self
    
    def __neg__(self):
        return -1 * self

向量运算的基本性质

image.png

零向量

image.png

零向量没有方向。但是有维度。

向量的长度

image.png

image.png

image.png

image.png

向量的点乘

image.png

两个向量相乘,结果是一个数(标量)
2个向量的点乘,内积


image.png

image.png

image.png

image.png

应用可以算夹角,之后可以根据夹角来做推荐系统,角度越小,相似度越大。
求一个向量在另一个向量的投影点坐标。


image.png

最终代码

import math
from ._global import EPSILON
class Vector:

    def __init__(self, lst):
        self._values = list(lst)

    def __getitem__(self, 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))

    def __iter__(self):
        return self._values.__iter__()

    def __add__(self, another):
        assert len(self) == len(another), \
            "error in adding. length should 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 should be same"
        return Vector([a - b for a, b in zip(self, another)])

    def dot(self, another):
        assert len(self) == len(another), \
            "error in dot"
        return sum(a * b for a,b in zip(self,another))
    def __mul__(self, k):
        return Vector([a * k for a in self])

    def __rmul__(self, k):
        return self * k

    def __pos__(self):
        return 1 * self

    def __neg__(self):
        return -1 * self

    def __truediv__(self, k):
        return (1 / k) * self

    @classmethod
    def zero(cls, dim):
        return cls([0] * dim)

    def norm(self):
        return math.sqrt(sum(e ** 2 for e in self))

    def normalize(self):
        if self.norm() < EPSILON:
            raise  ZeroDivisionError("Normalize error! norm is zero")
        return Vector(self._values) / self.norm()
EPSILON = 1e-8
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.5、向量 一、平面向量 1、向量基础知识 向量概念:在数学中,把既有大小,又有方向的量叫做向量。判断一个量是否...
    椰子数学阅读 7,683评论 0 0
  • 向量 R^2中的向量 第一个数代表沿着X轴的方向正数代表向右移动,负数代表向左移动,第二个数代表沿着Y轴方向,正数...
    _羊羽_阅读 7,704评论 0 2
  • 最近翻到一个非常棒讲解线性代数本质的视频,而且居然是在B站翻到的。扫过一遍视频犹如醍醐灌顶,过程中不停发出“卧槽”...
    yimingLin阅读 8,219评论 1 18
  • 这只是基础的一些数学知识,后面会为大家整理一些,unity中如何使用向量,向量在unity中的各种算法及其运算法则...
    好怕怕阅读 8,325评论 0 6
  • 方式1:直接创建包含C++支持的项目 如下图所示,创建项目时,勾选“Include C++ Support”选项。...
    独毒火阅读 1,576评论 0 0

友情链接更多精彩内容