如何通过给定形状的SVD分量重构原始三维矩阵?
三维数组SVD重构方法
原理说明
numpy.linalg.svd 对维度≥3的数组处理逻辑为:仅对最后两个维度执行二维SVD分解,前面的所有维度作为批量维度处理。
你输入的原始矩阵形状为(256, 256, 2),等价于批量处理256个形状为(256, 2)的二维矩阵,所以得到的分量形状完全符合full_matrices=True模式下的SVD输出规则:
- 批量维度为256,对应所有分量的第0维长度为256
- 每个二维
(256, 2)矩阵分解得到的U为(256, 256)、奇异值s长度为2、vh为(2, 2),合并批量维度后就是你拿到的分量形状。
重构步骤
重构逻辑和二维SVD一致,仅需通过批量矩阵乘法完成所有切片的并行计算即可,不需要额外调整维度逻辑:
- 先将每个一维奇异值转换为对应的二维对角矩阵,适配矩阵乘法要求
- 用批量矩阵乘法完成
U @ 奇异值对角矩阵 @ vh的计算
示例代码
import numpy as np # 将形状为(256, 2)的奇异值向量转换为形状(256, 2, 2)的对角矩阵数组 s_diag = np.apply_along_axis(np.diag, axis=1, arr=s) # 批量矩阵乘法直接重构,输出形状与原始矩阵完全一致为(256, 256, 2) reconstructed_mat = U @ s_diag @ vh
验证方法
你可以用如下代码验证重构精度,正常浮点计算误差会小于1e-10:
# 原始矩阵记为original_mat print(np.allclose(original_mat, reconstructed_mat))
内容的提问来源于stack exchange,提问作者Milan Odedra
相关产品推荐
相关产品推荐

