線性代數學習

青穗黃發表於2018-11-08

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

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的向量

線性代數學習

線性代數學習

線性代數學習

線性代數學習

線性代數學習

矩陣

矩陣是向量的擴充,就像向量是數的擴充

矩陣的基本運算:

線性代數學習

相關文章