如何使用cusolver gesvd函数从行主矩阵求解SVD

时间:2016-07-05 09:52:31

标签: cuda svd

我是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。

是的,我遇到了麻烦。我该如何解决这个问题?

1 个答案:

答案 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)

以及领先维度

http://www.ibm.com/support/knowledgecenter/SSFHY8_5.3.0/com.ibm.cluster.essl.v5r3.essl100.doc/am5gr_leaddi.htm

你应该谷歌他们。