GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1177|回复: 25
收起左侧

[技术交流] 【python】【原创】常用线性代数矩阵运算函数的函数库

[复制链接] |关注本帖

邪恶的面具海盗弯钩神秘的红茶冒险用绷带魔法石碑箭术卷轴质量效应三部曲咆哮诅咒

     楼主| 白冥 发表于 2025-1-20 05:58:38 | 显示全部楼层 |阅读模式 <
    本帖最后由 白冥 于 2025-1-23 22:08 编辑

            本贴将详细介绍一组用于矩阵计算和线性代数运算的Python函数。函数库的函数都是自己尝试实现的,包含了一些经典的线性代数算法,包括QR分解、特征值求解、线性方程组求解、行列式计算、矩阵求逆、基变换、矩阵变换和矩阵收缩。所有函数均采用高效的算法,并且通过模块化设计,每个算法的实现和使用都尽可能简洁明了。




    ### 目录

    1. **QR 分解** (`QR` 函数)
    2. **特征值和特征向量计算** (`eig` 函数)
    3. **线性方程组求解** (`solve_linear_system` 函数)
    4. **行列式计算** (`det` 函数)
    5. **矩阵求逆** (`inverse_matrix` 函数)
    6. **基变换** (`basis_transform` 函数)
    7. **矩阵变换** (`transform` 函数)
    8. **矩阵收缩** (`contract_matrix` 函数)
    9. **代码实现和数学背景**

    ---





    ### 1. **QR 分解** (QR函数)

        QR分解是将一个矩阵 ( A ) 分解为正交矩阵 ( Q ) 和上三角矩阵 ( R ) 的过程。此函数实现了经典的Gram-Schmidt正交化方法。

    1. def QR(A):
    2.     # 内部函数:转置矩阵
    3.     def trans(matrix):
    4.         return list(zip(*matrix))
    5.    
    6.     # 内部函数:计算向量的模
    7.     def mod(v):
    8.         return sum([x ** 2 for x in v]) ** 0.5
    9.    
    10.     # 内部函数:归一化向量
    11.     def unit(v):
    12.         return [x / mod(v) for x in v]
    13.    
    14.     # 内部函数:向量点积
    15.     def dot(v_0, v_1):
    16.         return sum([x * y for x, y in zip(v_0, v_1)])
    17.    
    18.     # 内部函数:计算向量的投影
    19.     def proj(v_0, v_1):
    20.         return [(x * dot(v_0, v_1)) / mod(v_1) ** 2 for x in v_1]
    21.    
    22.     # 内部函数:正交化
    23.     def orthogonalize(v, Q_T):
    24.         return [x - y for x, y in zip(v, *[proj(v, p) for p in Q_T])]
    25.    
    26.     A_T = trans(A)  # 获取矩阵A的转置
    27.     if any(mod(v) == 0 for v in A_T):  # 如果A的某一列全为零,则返回None
    复制代码


    (放过来只是为了吐槽本帖用不了用不了markdown)

    (然后吐槽本帖上面不能用样式,排版还经常会乱)

    _(:з」∠)__(:з」∠)_手动分割线_(:з」∠)__(:з」∠)_

    QR分解是一种将一个矩阵分解为两个矩阵的方法,通常用于线性代数中的数值计算。它将一个给定的矩阵 A 分解为两个矩阵的乘积:A = QR

    其中, Q 是一个正交矩阵,即 Q^T Q = I,其中  I  是单位矩阵),而  R 是一个上三角矩阵。

    QR分解的主要应用包括:
    1. **求解线性方程组**:通过分解矩阵,可以更有效地求解线性方程组。
    2. **最小二乘问题**:当需要拟合数据时,QR分解可以用来解最小二乘问题。
    3. **特征值计算**:QR分解是计算矩阵特征值的一种重要方法。

    QR分解的常见方法包括**格拉姆-施密特过程**、**豪斯霍尔德变换**和**吉文斯旋转**等。

    这里用的Gram-Schmidt就是工程线代课程里教的格拉姆-施密特正交化。

    **函数解释:**

    - **输入:** 矩阵 \( A \)(任意形状的二维数组)
    - **输出:** 矩阵 \( Q \) 和矩阵 \( R \),其中 \( A = QR \)
    - **功能:** 该函数使用Gram-Schmidt方法将矩阵 \( A \) 分解为正交矩阵 \( Q \) 和上三角矩阵 \( R \)。正交矩阵的列是单位向量,且互相正交。上三角矩阵 \( R \) 存储了矩阵 \( A \) 中列之间的线性关系。




    ### 2. **特征值和特征向量计算** (`eig` 函数)

    1. def eig(A, max_iter, tol):
    2.     def trans(matrix):
    3.         return list(zip(*matrix))
    4.    
    5.     def dot(v_0, v_1):
    6.         return sum([x * y for x, y in zip(v_0, v_1)])
    7.    
    8.     def multiplication(M, N):
    9.         return [[dot(row, col) for col in trans(N)] for row in M]
    10.    
    11.     def converges(next_A):
    12.         squares = sum([next_A[i][j] ** 2 for i in range(len(A)) for j in range(len(A)) if i != j])
    13.         return squares < tol
    14.    
    15.     next_A = trans(trans(A))  # 初始化矩阵A
    16.     for _ in range(max_iter):
    17.         Q, R = QR(next_A)  # QR分解
    18.         next_A = multiplication(R, Q)  # 计算新的矩阵A
    19.         if converges(next_A):  # 判断是否收敛
    20.             break
    21.     eigenvalue = [next_A[i][i] for i in range(len(A))]  # 提取对角线上的特征值
    22.     return eigenvalue, trans(Q)  # 返回特征值和特征向量
    复制代码


    _(:з」∠)__(:з」∠)_手动分割线_(:з」∠)__(:з」∠)_

            QR算法是一种用于计算矩阵特征值的数值算法。它通过迭代方式将一个方阵逐渐转化为一种更容易分析的形式,通常是上三角矩阵,从而使得其特征值容易计算。

    ### QR算法的基本步骤:
    1. **分解**:给定一个方阵 \( A \),首先进行QR分解,即将矩阵 \( A \) 分解为 \( A = QR \),其中 \( Q \) 是正交矩阵,\( R \) 是上三角矩阵。
    2. **重构**:然后构造新的矩阵 \( A' = RQ \)。
    3. **迭代**:重复执行QR分解和重构的过程,得到一系列矩阵 \( A^{(k)} \),每一次的分解结果都接近于一个上三角矩阵。

        随着迭代的进行,矩阵 \( A^{(k)} \) 会逐渐接近一个上三角矩阵,其对角线上的元素就是原矩阵 \( A \) 的特征值。

    ### QR算法的特点:
    - **收敛性**:QR算法通常是收敛的,尤其是在没有特殊结构的矩阵下。它的收敛速度较快,通常几次迭代后就能得到良好的近似特征值。
    - **稳定性**:QR算法在数值计算中较为稳定,适用于大多数实对称矩阵和一般矩阵的特征值计算。

    ### 应用:
    QR算法广泛用于特征值问题的求解,尤其是在需要计算大规模矩阵的特征值时。例如,它被用于谱分解、主成分分析(PCA)、控制系统分析等领域。

    说这些是因为大家都知道特征值和特征向量,但是不知道QR算法。QR算法这东西用一句话说就是,近似。就像五次方程没有根式解一样,因为求特征值本质上就是要解多项式,QR算法近似特征值算是很精准的了。





    ### 3. **线性方程组求解**

    1. def solve_linear_system(A, b):
    2.     def trans(matrix):
    3.         return list(zip(*matrix))
    4.    
    5.     A_T = trans(A)  # 转置矩阵A
    6.     solution = [0] * len(A_T)  # 初始化解向量
    7.    
    8.     Q, R = QR(A)  # 进行QR分解
    9.     if not Q:
    10.         return None
    11.    
    12.     b = [sum([x * y for y in row]) for row, x in zip(trans(Q), b)]  # 转换b向量
    13.     for i in range(len(A) - 1, -1, -1):
    14.         terms = []
    15.         for j in range(i + 1, len(A)):
    16.             terms.append(R[i][j] * solution[j])
    17.         solution[i] = (b[i] - sum(terms)) / R[i][i]  # 使用回代法解线性方程
    18.     return solution  # 返回解向量
    复制代码


    希望论坛不要吞代码(

    **函数解释:**

    - **输入:** 矩阵 \( A \) 和向量 \( b \)(线性方程组 \( A \times x = b \))
    - **输出:** 向量 \( x \),即线性方程组的解
    - **功能:** 通过QR分解将线性方程组转化为上三角形式,并使用回代法求解。首先对矩阵 \( A \) 进行QR分解,接着利用正交矩阵 \( Q \) 将右侧向量 \( b \) 转换,然后通过回代法求解得到解向量。

    这个其实没什么好说的了(
    解方程嘛(
    又不是高次的(

    其实本来想写一个处理最小二乘问题的函数,不过这样就显得QR分解疑似有点太常用了(
    不过雀食常用(

    有人问为什么解线性方程为什么提最小二乘,这也没有啊?

    最小二乘问题通常的形式是,给定一个矩阵 A 和一个向量 b,我们希望找到一个向量 x,使得 Ax ≈ b 的误差最小。换句话说,我们要最小化目标函数:||Ax ≈ b||²

    在这种情境下,QR分解被用来将矩阵 A分解为一个正交矩阵 Q和一个上三角矩阵 R,即:A = QR

    通过将最小二乘问题代入QR分解形式,可以将原问题转化为一个更容易求解的形式。具体来说,最小化 ||Ax - b||² 就变成了最小化 ||QRx - b||²,由于 Q是正交矩阵,我们可以通过左乘 Q^T来简化为:||Rx - Q^Tb||²

    接着,由于 R是上三角矩阵,问题变得易于通过回代法直接求解。

    裆燃啦,这里就没有写这个函数,只是解普通的线性方程组。∠( ᐛ 」∠)_




    ### 4. **行列式计算** (`det` 函数)
    1. def det(A):
    2.     _, R = QR(A)  # 获取QR分解
    3.     return math.prod([R[i][i] for i in range(len(R))])  # 计算行列式
    复制代码



    嘿咻咻,这里就不写解释了,应该没有人不知道行列式的值是上三角矩阵主对角线元素之积吧(莫名狗头

    _(:з」∠)__(:з」∠)_哎,就是分割_(:з」∠)__(:з」∠)_
    哎,分割个寂寞~





    ### 5. **矩阵求逆** (`inverse_matrix` 函数)

    1. def inverse_matrix(A):
    2.     def multiply(num, M):
    3.         return [[x * num for x in r] for r in M]
    4.    
    5.     def cof(M, i, j):
    6.         return ((-1) ** (i + j + 2)) * det((M[:i] + M[i + 1:])[:i] + (M[:i] + M[i + 1:])[j + 1:])
    7.    
    8.     def adj(M):
    9.         return [[cof(M, i, j) for j in range(len(M))] for i in range(len(M))]
    10.    
    11.     d = det(A)
    12.     if d == 0:
    13.         return None
    14.     adj_A = adj(A)  # 计算伴随矩阵
    15.     return multiply(1 / d, adj_A)  # 通过伴随矩阵计算逆矩阵
    复制代码


    **函数解释:**

    - **输入:** 矩阵 \( A \)
    - **输出:** 矩阵 \( A \) 的逆矩阵
    - **功能:** 通过伴随矩阵法计算矩阵的逆。如果矩阵的行列式为零,则返回 `None`,表示矩阵不可逆。

    嗯,是的,不用增广矩阵求,主要是太麻烦了∠( ᐛ 」∠)_





    ### 6. **基变换** (`basis_transform` 函数)
        (这个其实没什么好说的)
    1. def basis_transform(bvgroup_0, bvgroup_1):
    2.     def trans(M):
    3.         return list(zip(*M))
    4.    
    5.     A = trans(bvgroup_0)  # 转置矩阵
    6.     B = trans(bvgroup_1)  # 转置矩阵
    7.     B_r = inverse_matrix(B)  # 计算B的逆
    8.     return multiplication(B_r, A)  # 返回基变换矩阵
    复制代码


    看吧~

    怎么说呢?

    保险起见,把7安排上

    ### 7. **矩阵变换** (`transform` 函数)

    1. def transform(A, bvgroup_0, bvgroup_1):
    2.     def trans(M):
    3.         return list(zip(*M))
    4.    
    5.     P = basis_transform(bvgroup_0, bvgroup_1)  # 获取基变换矩阵
    6.     P_r = inverse_matrix(P)  # 获取基变换矩阵的逆
    7.     return multiplication(multiplication(P_r, A), P)  # 执行矩阵变换
    复制代码
    好了,其实放代码你不一定看得懂,数学原理:

    若A是一个n阶方阵,y₁是一个n维向量,那么A对y的映射结果为Ay₁,设这个映射结果为y'₁,y'₁=Ay₁
    这个结果默认是以(α₁,α₂,…,αₙ)作为线性空间的一组基
    由于向量在线性空间中是客观存在的,则以任何基的同一线性空间中,都有:
    y₀=(α₁,α₂,…,αₙ)y₁,y'₀=(α₁,α₂,…,αₙ)y'₁
    把y'₀用已知量y₁表示:
    y'₀=(α₁,α₂,…,αₙ)y'₁=(α₁,α₂,…,αₙ)Ay₁
    假设以{β₁,β₂,…,βₙ}作为线性空间的一组基,也有y₀=(β₁,β₂,…,βₙ)y₂,已知对于的从(β₁,β₂,…,βₙ)到(α₁,α₂,…,αₙ)的基变换矩阵K=(β₁,β₂,…,βₙ)⁻¹(α₁,α₂,…,αₙ)
    由于以{β₁,β₂,…,βₙ}作为线性空间的一组基时,y₀在线性空间中的坐标不再是y₁,因此对应的变换矩阵不再是A,设这个未知变换矩阵为B,即y'₀=(β₁,β₂,…,βₙ)By₂,有y₂=Ky₁
    通过基变换,有(α₁,α₂,…,αₙ)=(β₁,β₂,…,βₙ)K,(β₁,β₂,…,βₙ)=(α₁,α₂,…,αₙ)K⁻¹
    y'₀=(β₁,β₂,…,βₙ)By₂=(α₁,α₂,…,αₙ)K⁻¹BKy₁,又y'₀=(α₁,α₂,…,αₙ)Ay₁,则A=K⁻¹BK
    再经过运算,有:
    A=K⁻¹BK
    KA=(KK⁻¹)BK=BK
    KAK⁻¹=B
    综上所述,若已知在以(α₁,α₂,…,αₙ)为基时,变换矩阵为A,要求同一线性空间下,以(β₁,β₂,…,βₙ)为基时,新的未知变换矩阵B,引入基变换矩阵K,有:
    B=KAK⁻¹,K=(β₁,β₂,…,βₙ)⁻¹(α₁,α₂,…,αₙ)

    哎!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 5血液 +8 追随 +5 堕落 +2 收起 理由
    Kaicneg + 1 赞一个!
    咕咕咕的起司 + 1
    三分春色描来易 + 3 + 1 + 1 是数学大佬!
    kasimaki + 1
    Morphyus + 5 + 1 + 1

    查看全部评分

      收起(4)
    • 白冥 白冥 :啊!怎么帖子还有字数限制
      2025-01-20 05:59 回复
    • 白冥 白冥 :真吞字啦
      2025-01-20 06:00 回复
    • 白冥 白冥 :源代码:

      import math
      def QR(A):
          def trans(matrix):
              return list(zip(*matrix))
          def mod(v):
              return sum([x ** 2 for x in v]) ** 0.5
          def unit(v):
              return [x / mod(v) for x in v]
          def dot(v_0,v_1):
              return sum([x*y for x,y in zip(v_0,v_1)])
          def proj(v_0,v_1):
              return [(x * dot(v_0, v_1)) / mod(v_1) ** 2 for x in v_1]
          def orthogonalize(v,Q_T):
              return [x - y for x, y in zip(v, *[proj(v, p) for p in Q_T])]
          A_T=trans(A)
          if any(mod(v)==0 for v in A_T):
              return None,None
          Q_T = [unit(orthogonalize(v, Q_T)) for v in A_T]
          Q = trans(Q_T)
          R = [[dot(A_T[k], Q_T) for k in range(i, len(A))] for i in range(len(A))]
          return Q, R

      def eig(A,max_iter,tol):
          def trans(matrix):
              return list(zip(*matrix))
          def dot(v_0,v_1):
              return sum([x*y for x,y in zip(v_0,v_1)])
          def multiplication(M,N):
              return [[dot(row,col) for col in trans(N)] for row in M]
          def converges(next_A):
              squares=sum([next_A[j] ** 2 for i in range(len(A)) for j in range(len(A)) if i != j])
              return squares < tol
          next_A = trans(trans(A))
          for _ in range(max_iter):
              Q,R = QR(next_A)
              next_A=multiplication(R,Q)
              if converges(next_A):
                  break
          eigenvalue=[next_A for i in range(len(A))]
          return eigenvalue,trans(Q)

      def solve_linear_system(A, b):
          def trans(matrix):
              return list(zip(*matrix))
          A_T=trans(A)
          solution=[0]*len(A_T)
          Q, R=QR(A)
          if not Q:
              return None
          b=[sum([x * y for y in row]) for row, x in zip(trans(Q), b)]
          for i in range(len(A) - 1, -1, -1):
              terms=[]
              for j in range(i + 1, len(A)):
                  terms.append(R[j] * solution[j])
              solution = (b - sum(terms)) / R
          return solution

      def det(A):
          _, R = QR(A)
          return math.prod([R for i in range(len(R))])

      def inverse_matrix(A):
          def multiply(num,M):
              return [[x*num for x in r] for r in M]
          def cof(M,i,j):
              return ((-1) ** (i+j+2)) * det((M[:i] + M[i+1:])[:i] + (M[:i] + M[i+1:])[j+1:])
          def adj(M):
              return [[cof(M,i,j) for j in range(len(M))] for i in range(len(M))]
          d=det(A)
          if d==0:
              return None
          adj_A=adj(A)
          return multiply(1/d,adj_A)

      def basis_transform(bvgroup_0,bvgroup_1):
          def trans(M):
              return list(zip(*M))
          def dot(v_0,v_1):
              return sum([x*y for x,y in zip(v_0,v_1)])
          def multiplication(M,N):
              return [[dot(row,col) for col in trans(N)] for row in M]
          A=trans(bvgroup_0)
          B=trans(bvgroup_1)
          B_r=inverse_matrix(B)
          return multiplication(B_r,A)

      def transform(A,bvgroup_0,bvgroup_1):
          def trans(M):
              return list(zip(*M))
          def dot(v_0,v_1):
              return sum([x*y for x,y in zip(v_0,v_1)])
          def multiplication(M,N):
              return [[dot(row,col) for col in trans(N)] for row in M]
          P=basis_transform(bvgroup_0,bvgroup_1)
          P_r=inverse_matrix(P)
          return multiplication(multiplication(P_r,A),P)

      def contract_matrix(A):
          def trans(M):
              return list(zip(*M))
          eigvals,eigvecs=eig(A,100,1e-6)
          P,_=QR(trans(eigvecs))
          D=[[(eigvals if j==i else 0) for j in range(len(A))] for i in range(len(A))]
          P_r=inverse_matrix(P)
          return P,D,P_r
      2025-01-20 06:01 回复
    • 白冥 白冥 :求一求免费的追随
      2025-01-20 06:02 回复
    • 我也说一句

    回复

    使用道具 举报

    牧羊人吉姆‧雷诺猫化弩哥街头霸王莱戈拉斯龙鳞石瑞雪兆丰年,生灵万物新

      Y0ungN1ck 发表于 2025-1-20 07:45:24 | 显示全部楼层 <
      啊啊啊,我瞎了,向量什么的,矩阵什么的,相乘什么的,分解什么的,放过我吧,本可已经被你们轰到外翻了
      回复

      举报

      永远的克叔裸体克里斯保卫领土【新春限定】果体 隆生金蛋的鹅金钱马车和你一起飞行的皮卡丘亚瑟‧摩根業火死鬥史莱姆牧场

        大河内太 发表于 2025-1-20 08:29:12 | 显示全部楼层 <
        靴靴有点像在看天书惹
        知识轰炸了我的大脑
        炸翻天惹
        回复

        举报

        艾德尔牧羊人森林羊男亚瑟·库瑞(海王)

          lijindcf 发表于 2025-1-20 08:32:17 | 显示全部楼层 <
          回复

          举报

            崽仔狼 发表于 2025-1-20 08:34:38 | 显示全部楼层 <
            回复

            举报

            裸体克里斯【新春限定】果体 隆内森·德雷克安德森‧戴维斯未散的宴席

              Morphyus 发表于 2025-1-20 08:55:27 | 显示全部楼层 <
              回复

              举报

              瑞雪兆丰年,生灵万物新荒野大镖客:救赎 II质量效应三部曲森林羊男牧羊人石鬼面贝优妮塔

                kasimaki 发表于 2025-1-20 09:38:48 | 显示全部楼层 <
                以前在学校的时候我们专业只需要学一部分线性代数,考试还得手算,学得头疼
                回复

                举报

                永亘环小狮欢舞『搓粉团珠』黄粱一梦【新春限定】果体 隆死灵之书永远的克叔業火死鬥实现梦想官复原职

                  娱乐法师火布偶 发表于 2025-1-20 09:48:55 | 显示全部楼层 <
                  回复

                  举报

                  百鬼夜行『不败之花』【圣诞限定】心心念念小雪人『眼榴』冬之歌『搓粉团珠』『落樱缤纷』小狮欢舞黄粱一梦

                    三分春色描来易 发表于 2025-1-20 10:07:51 | 显示全部楼层 <
                    天哪,本来还想着要不要重新学一下高中数学拓展业务的,看了两眼楼主帖子,决定去复习物理了。。
                    回复

                    举报

                    诺克提斯·路西斯·伽拉姆克莱夫・罗兹菲尔德岛田源氏保加利亚妖王杰森‧斯坦森月光骑士刀锋女王 - 归宿诺曼底号史莱姆牧场男巫之歌

                      万俟 发表于 2025-1-20 10:32:36 | 显示全部楼层 <
                      这个也可以吗?感觉我也可以把我上课的课件上传,保证原创
                        收起(3)
                      回复

                      举报

                      岛田半藏英雄联盟守护者三角头王者之盾传说的黑道-桐生一马霍格沃兹特快列车开心到旋转的罗罗圣诞寻铃萨勒芬妮

                        Raven_gambler 发表于 2025-1-20 10:38:08 | 显示全部楼层 <
                        回复

                        举报

                        枕套幽灵『不败之花』组成家庭吃饱金币的Doge夏日柯基诺克提斯·路西斯·伽拉姆未来的黎明不朽之恋史莱姆牧场男巫之歌

                          phillipé 发表于 2025-1-20 10:46:05 | 显示全部楼层 <
                          回复

                          举报

                          法卡斯『冰雕马拉橇』牧羊人【新手友好】昆進龙腾世纪:审判街头霸王黑龙幼崽

                            cjamno 发表于 2025-1-20 11:07:15 | 显示全部楼层 <
                            所以我为啥不直接用包装好的函数而是学底层?
                            回复

                            举报

                            『搓粉团珠』『不败之花』永亘环小狮欢舞诺曼底号和你一起飞行的皮卡丘『落樱缤纷』枕套幽灵诺克提斯·路西斯·伽拉姆巴哈姆特

                              2674820557 发表于 2025-1-20 11:29:29 | 显示全部楼层 <
                              回复

                              举报

                              40x43 隐形➀『搓粉团珠』16x43 隐形➀兴奋的小伯炼金之心月影狼

                                SweetUncle 发表于 2025-1-20 11:51:32 | 显示全部楼层 <
                                感觉不太想研究算法原理,要用到就用呢,调用一下matlab的库
                                  收起(1)
                                回复

                                举报

                                史蒂芬·斯特兰奇GM論壇初心者畢業證書念念往日士官盔牧羊人【新手友好】昆進寻觅

                                  天逸0 发表于 2025-1-20 12:57:33 | 显示全部楼层 <
                                  回复

                                  举报

                                    不睡觉的猫。 发表于 2025-1-20 17:42:35 | 显示全部楼层 <
                                    啊?不是,虽然博主很厉害。但我是真的想不到能在这看到如此高知识含量的帖子
                                    回复

                                    举报

                                    『冰雕马拉橇』裸体克里斯亭亭如盖暗影烈焰『搓粉团珠』人鱼之泪蒂法·洛克哈特官复原职

                                      Kaicneg 发表于 2025-1-20 17:55:51 | 显示全部楼层 <
                                      回复

                                      举报

                                      近地夜航风物长宜玄生万物云上之光永亘环龙鳞石红心玉

                                        cdcai 发表于 2025-1-20 19:00:05 | 显示全部楼层 <
                                        强烈要求线性代数考试的时候可以带电脑
                                        回复

                                        举报

                                        腐化龙蛋鬼王酒吞童子永亘环

                                          追光 发表于 2025-1-20 20:53:14 | 显示全部楼层 <
                                          又来学习了U•ェ•*U应该先这样然后再这样然后结论就出来(胡言乱语ing)
                                          大佬太厉害了,继续膜拜大佬٩(๑•̀ω•́๑)۶
                                          回复

                                          举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2025-2-23 09:48 , Processed in 0.147010 second(s), 145 queries , Redis On.

                                          Copyright © 2013-2025 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表