2016-07-05 1 views
-2

私はcudaの初心者です。私は、cusolver APIを使用して行 - 主要な行列のsvdを解決しようとします。cusolver gesvd関数を使用して行主行列からSVDを解決する方法

私は行の主要な行列100x10を持っています(例えば、10次元の空間に100個のデータがあります)。 cusolverDnDgesvd関数が必要ですldaパラメータ(行列Aの先頭の次元)。私の行列は行主ですので、私は10をcusolver gesvd関数に与えました。しかし機能は機能しませんでした。この関数は私のldaパラメータが間違っていることを示しました。 [OK]を、私はcusolver gesvd関数に100を与えた。関数は機能していましたが、関数(U、S、Vt)の結果は間違っているようです。つまり、私は行列AをUから得ることができません。ベクトル

私の知る限り、cuSolver APIはすべての行列が列長であるとみなします。 行列を列メジャーに変更した場合、mはn(10x100)よりも小さくなります。しかし、gesvd関数はm> = nの場合にしか機能しません。

はい、困っています。どうすればこの問題を解決できますか?

答えて

1

行の主要な行頭および先頭の次元は、記憶域に関連する概念です。行列は、同じ数学的行列を表しながら、どちらの方式にも格納できます。

正しい結果を得るには、cublasDgeam()を使用して、行優先100x10行列をcol主要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する必要があります。

+0

ありがとうございます。 –

+0

実際に私はちょうど転置を使用してこの問題を解決しました。 cuBLAS APIは、すべての入出力行列が列メジャーであることを前提としています。そこで、転置を使用して、行優先行列(100x10)を列長(10x100)に変更しました。私は、行主要行列からm、n、lda、ldu、ldvtなどの他のパラメータを与えたところで、その列主行列をgesvd関数に与えました。つまり、mを100に、nを10に、Aを転置行行列に、100をldaに、100をlduに、10をldvtにそれぞれ入力します。 機能はうまくいきました。 U * S * Vtから元行列Aを得ることができます。もちろん、gesvdのU、Vt行列も列長です。 –

関連する問題