2016-07-05 31 views
-2

我是cuda的初学者。我想尝试使用cusolver API来解决用于行主矩阵的svd。但我困惑有关领导维度矩阵A如何使用cusolver gesvd函数解决行主矩阵的SVD问题

我有一个行优先矩阵100×(例如,我有100个数据是在10维空间。) 随着CUDA文档,cusolverDnDgesvd功能需求lda参数(矩阵A的主导维数)。我的矩阵是行主,所以我给了cusolver gesvd函数10。但功能不起作用。这个函数表明我的lda参数是错误的。 好的,我给了cusolver gesvd函数100。函数正在工作,但函数(U,S,Vt)的结果似乎是错误的。我的意思是,我无法从U 获得矩阵A Vt。

据我所知,cuSolver API假定所有矩阵都是列主要的。 如果我将矩阵更改为列专业,m低于n(10x100)。但gesvd函数仅适用于m> = n。

是的,我有麻烦了。我怎么解决这个问题?

回答

1

行 - 主要,主要和主要维度是与存储有关的概念。矩阵可以存储在任一方案中,同时表示相同的数学矩阵。

为了获得正确的结果,您可以使用cublasDgeam()在调用cusolver之前将行主100x10矩阵更改为col-major 100x10矩阵,这相当于矩阵转置,同时保存存储顺序。

有许多来源谈论存储排序,

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

你应该谷歌他们。

+0

感谢您的意见。 –

+0

其实我只是用转置来解决这个问题。 据我所知,cuBLAS API假设所有输入/输出矩阵都是列主要的。所以我使用转置将我的行主矩阵(100x10)更改为列主(10x100)。我只是把这个柱主矩阵给了gesvd函数,但是我从行主矩阵中给出了其他参数,例如m,n,lda,ldu,ldvt。我的意思是,只需输入100到m中,10输入到n中,A是将行主矩阵换位,100为lda,100为ldu,10为ldvt。 功能运行良好。我可以从U * S * Vt得到原点矩阵A,当然,gesvd的U,Vt矩阵也是列主要的。 –