線性代數學習

向量:一組數的基本表示方法 和向量相對應,一個數字,成爲標量 向量是線性代數研究的基本元素bash

import math
from ._global import EPSILON


class Vector:
    def __init__(self, lst):
        self._values = list(lst)  # 至關於複製了一次lst,使得這個類更符合不可更改類型

    @classmethod
    def zero(cls, dim):
        """返回一個dim維的零向量"""
        return cls([0] * dim)

    def norm(self):
        """返回向量的模"""
        return math.sqrt(sum(e ** 2 for e in self))

    def normalize(self):
        """返回向量的單位向量"""
        # if self.norm() == 0:
        if self.norm() < EPSILON:
            raise ZeroDivisionError("Normalize error! norm is zero!")
        # return Vector([e / self.norm() for e in self])
        return 1 / self.norm() * Vector(self._values)

    def __add__(self, another):
        """向量加法,返回結果向量"""
        assert len(self) == len(another), \
            "Error in adding. Length of vectors must be same."
        # 由於實現了__iter__,就不這樣寫了
        # 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, other):
        assert len(self) == len(other), \
            "Error in adding. Length of vectors must be same."
        return Vector([a - b for a, b in zip(self, other)])

    def __mul__(self, k):
        """返回數量乘法的結果向量:self * k"""
        return Vector([k * e for e in self])

    def dot(self, another):
        """向量點乘,返回結果標量"""
        assert len(self) == len(another), \
            "Error in adding. Length of vectors must be same."
        return sum(a * b for a, b in zip(self, another))

    def __rmul__(self, k):
        """返回數量乘法的結果向量:k * self"""
        return self * k

    def __truediv__(self, k):
        """返回梳理出發的結果向量: self / k """
        return (1 / k) * self

    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))

複製代碼

在實現這個向量類時,學習到不少實現細節:向量類設計爲不可更改類(在加法運算時,返回新的類,而不是對原有的self._values進行更改)。 那在構造函數中,傳入一個list,當list變化時,便會影響self._values的值。因此用list(lst)方式進行了一次複製。函數

向量的模:即向量的大小學習

單位向量:長度保持爲1的向量ui

矩陣

矩陣是向量的拓展,就像向量是數的拓展spa

矩陣的基本運算:設計

相關文章
相關標籤/搜索