为什么Python和C++对同一矩阵进行SVD得到结果的V不同?

ThorKing01 2019-07-27 11:36:01
使用Pyhon对一个8*9的矩阵进行SVD得到的V是9*9的,但是为什么用C++的Eigen的SVD处理同一矩阵得到的V是9*8的?
Pyhon中:使用numpy中的SVD
[U,S,V] = np.linalg.svd(A)
C++中:使用的是Eigen中的SVD
Eigen::JacobiSVD<Eigen::MatrixXf> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);
cout<<svd.matrixV()<<endl;
...全文
426 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
JustSleep 2019-08-08
  • 打赏
  • 举报
回复
https://blog.csdn.net/ThorKing01/article/details/97512228
super_admi 2019-08-08
  • 打赏
  • 举报
回复
看到你的帖子,我突然想起了C#和JAVA加密解密的问题,它们俩默认的模式也是不一样的。
ThorKing01 2019-08-08
  • 打赏
  • 举报
回复
上周的时候解决了这个问题,今天才想起来结贴。 主要就是Python 和Eigen中进行奇异值分解函数的默认值不同。Eigen::JacobiSVD<Eigen::MatrixXf> svd(A, Eigen::ComputeFullU | Eigen::ComputeFullV); 详细见https://blog.csdn.net/ThorKing01/article/details/97512228
ThorKing01 2019-08-01
  • 打赏
  • 举报
回复
发现计算ATA的特征向量的矩阵得到的右奇异值,与Python中直接SVD得到的右奇异值也不同,自己在Python中使用np.linalg.eig(np.dot(A.T,A))来求ATA的特征向量,发现三者都不同。。。 这里的不同主要是中间有不定行会出现负值,最后几行出现不同的值,前几行是的值是相同的,但是有的行出现负值。 下图是Python中SVD分解得到值 下图是Python中求特征值的到的右奇异值
ThorKing01 2019-07-27
  • 打赏
  • 举报
回复
直接使用Eigen计算ATA的特征向量的矩阵得到右奇异值,不使用SVD来获得右奇异值了,但是希望有大神了解其中缘由的能分享一下。

24,857

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧