Python与Matlab svd分解的差异
1.差异说明
Matlab和Python的NumPy库中的SVD函数(np.linalg.svd)都是用来对矩阵进行奇异值分解(SVD)的函数,但它们在默认参数和返回结果方面有一些差异。
在Matlab中,SVD函数的默认行为是计算矩阵的完整SVD,即对于一个m×nm \times nm×n的矩阵AAA,Matlab返回三个矩阵UUU、SSS和VVV,其中UUU和VVV都是正交矩阵,SSS是一个大小为m×nm \times nm×n的矩阵,其非零元素(奇异值)按降序排列,并且在对角线上。这与NumPy中的默认行为略有不同。
在Python的NumPy中,np.linalg.svd函数的默认行为是计算矩阵的紧凑SVD,即对于一个m×nm \times nm×n的矩阵AAA,NumPy返回三个矩阵UUU、SSS和VTV^TVT(VVV的转置),其中UUU和VVV都是正交矩阵,SSS是一个大小为m×nm \times nm×n的矩阵,其非零元素(奇异值)按降序排列,并且在对角线上。请注意,NumPy返回的VVV与Matlab返回的VVV不同。
如果要在NumPy中获得完整的SVD,需要将参数full_matrices设置为True,这将导致NumPy返回与Matlab相同的三个矩阵UUU、SSS和VVV。但是请注意,这可能会导致存储开销很大,尤其是当mmm和nnn中的一个很大时。
因此,要注意在使用SVD函数时要注意这些差异,并根据需要正确设置参数。
2.使用举例:
要想使得二者一致,在MATLAB中:
[U2, S2, V2] = svd(Rs);
%Rs=U2*S2*V2'
python中:
U2, S2, V2 = np.linalg.svd(Rs, True)#注意一定要设置True这个参数
其中matlab的得到的V2与python得到的V2是转置关系。matlab得到的S2是对角阵,在python中S2写成了行向量。
参考资料:
1.https://blog.csdn.net/weixin_43917574/article/details/108193499
2.chatGPT