2016-07-05 114 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矩陣也是列主要的。 –