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

How can solve SVD from row-major matrix using cusolver gesvd function

我是 cuda 的初学者。我想尝试使用 cusolver API 求解行主矩阵的 svd。但我对矩阵 A 的前导维度感到困惑。

我有一个行主矩阵 100x10。(例如,我有 100 个 10 维 space 的数据。) 作为 CUDA 文档,cusolverDnDgesvd 函数需要 lda 参数(矩阵 A 的前导维度)。我的矩阵是行优先的,所以我给了 10 给 cusolver gesvd 函数。但是功能不起作用。这个函数表明我的 lda 参数错误。 好的,我给 cusolver gesvd 函数 100。功能正常,但功能 (U、S、Vt) 的结果似乎是错误的。我的意思是,我无法从 USVt.

得到矩阵 A

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

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

Row-major、col-major和leading dimension是与存储相关的概念。矩阵可以存储在任一方案中,同时表示相同的数学矩阵。

为了获得正确的结果,您可以使用 cublasDgeam() 将行优先的 100x10 矩阵更改为列优先的 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

你应该 google 他们。