如何用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))
关键说明
- 维度顺序调整:若二分形式的张量维度对应关系与示例不同,需修改
A.reshape(4,4)前的permute操作,例如若A[a,c,b,d]对应原始矩阵行a2+b、列c2+d,需改为A.permute(0,2,1,3).reshape(4,4)。 - NumPy版本适配:将代码中的
torch替换为numpy,torch.linalg.svd替换为numpy.linalg.svd,torch.kron替换为numpy.kron即可实现NumPy版本。
内容的提问来源于stack exchange,提问作者Daniel Lomazov
相关产品推荐
相关产品推荐

