You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现矩阵的算子Schmidt分解?

实现矩阵的Schmidt分解(从二分形式还原为原始矩阵展开)

问题背景

已将4×4矩阵转换为[2,2,2,2]的二分形式,需要编写函数将其分解为满足以下条件的三个列表:

  • s:包含4个系数
  • B:包含4个2×2矩阵
  • C:包含4个2×2矩阵
    使得原始4×4矩阵可表示为:
should_be_the_original_matrix_A = sum(s[i] * torch.kron(B[i], C[i]) for i in range(4))

解决方案(PyTorch实现)

核心思路是将二分形式张量转换回4×4矩阵,执行SVD分解后,将奇异向量重塑为对应2×2矩阵,即可得到所需的B和C列表:

import torch

def to_schmidt(A):
    # 将[2,2,2,2]的二分形式张量转换为4×4原始矩阵
    # 若二分形式定义为A[a,b,c,d]对应原始矩阵行a*2+b、列c*2+d,直接用reshape
    # 若维度顺序不同,需调整permute参数适配你的二分形式定义
    A_4x4 = A.reshape(4, 4)
    
    # 执行SVD分解
    U, S, Vh = torch.linalg.svd(A_4x4)
    
    # 提取Schmidt系数
    s = S.tolist()
    
    # 将左奇异向量转换为B矩阵列表:U的每一列重塑为2×2矩阵
    B = [U[:, i].reshape(2, 2) for i in range(4)]
    
    # 将右奇异向量的共轭转置转换为C矩阵列表:Vh的每一行重塑为2×2矩阵
    C = [Vh[i, :].reshape(2, 2) for i in range(4)]
    
    return [s, B, C]

验证方法

可以添加以下代码验证重构结果是否与原始矩阵一致:

# 示例:生成随机二分形式张量
A = torch.randn(2, 2, 2, 2)
s_list, B_list, C_list = to_schmidt(A)

# 重构原始矩阵
reconstructed = torch.zeros(4, 4)
for s, b, c in zip(s_list, B_list, C_list):
    reconstructed += s * torch.kron(b, c)

# 检查误差(浮点精度范围内一致即可)
print(torch.allclose(reconstructed, A.reshape(4, 4), atol=1e-6))

关键说明

  1. 维度顺序调整:若二分形式的张量维度对应关系与示例不同,需修改A.reshape(4,4)前的permute操作,例如若A[a,c,b,d]对应原始矩阵行a2+b、列c2+d,需改为A.permute(0,2,1,3).reshape(4,4)。
  2. NumPy版本适配:将代码中的torch替换为numpy,torch.linalg.svd替换为numpy.linalg.svd,torch.kron替换为numpy.kron即可实现NumPy版本。

内容的提问来源于stack exchange,提问作者Daniel Lomazov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:54:17