我是cuda的初学者。我想尝试使用cusolver API解决行主矩阵的svd问题。但我对矩阵A的引导维度感到困惑。
我有一个行主矩阵100x10。(例如,我有100个数据,它位于10维空间中。) 作为CUDA文档,cusolverDnDgesvd函数需要lda参数(矩阵A的前导尺寸)。我的矩阵是行主,所以我给了cusolver gesvd函数10。但功能不起作用。此函数表明我的lda参数错误。 好的,我给了cusolver gesvd函数100。功能正常,但功能(U,S,Vt)的结果似乎是错误的。我的意思是,我无法从U S Vt获得矩阵A.
据我所知,cuSolver API假设所有矩阵都是列专业。 如果我将矩阵更改为column-major,则m小于n(10x100)。但是gesvd功能仅适用于m> = n。
是的,我遇到了麻烦。我该如何解决这个问题?
答案 0 :(得分:1)
Row-major,col-major和leading维度是与存储相关的概念。矩阵可以存储在任一方案中,同时表示相同的数学矩阵。
要获得正确的结果,您可以使用cublasDgeam()
将行主要100x10矩阵更改为col-major 100x10矩阵,这相当于在调用cusolver之前保持存储顺序的矩阵转置。
有许多消息来源谈论存储排序,
https://en.wikipedia.org/wiki/Row-major_order
https://fgiesen.wordpress.com/2012/02/12/row-major-vs-column-major-row-vectors-vs-column-vectors/
https://eigen.tuxfamily.org/dox-devel/group__TopicStorageOrders.html
Confusion between C++ and OpenGL matrix order (row-major vs column-major)
以及领先维度
你应该谷歌他们。