2017-02-16 6 views
0

私はCUDAで非正方行列のMoore-Penrose擬似逆行列を見つけようとしています。CUDAの非正方行列のコンピュータ逆行列

今日、私はMoore-Penrose pseudoinverseの実装として次のコードを使用しています。

https://github.com/mathnet/mathnet-numerics/blob/75c3b9fbbfd3fa2def6780179006bde7ca343b08/src/Numerics/LinearAlgebra/Complex/Matrix.cs

問題は、私は擬似を見つけようとしています非正方行列のサイズはので、私はGPUのパワーを活用するためにCUDAを使用して、それを解決したいのではなく大きさであることです。私は基本的にこのコードのCUDAバージョン

public static Matrix PseudoInverse(this Matrix M) 
    { 
     Svd<double> D = M.Svd(true); 
     Matrix W = (Matrix)D.W; 
     Vector s = (Vector)D.S; 


     // The first element of W has the maximum value. 
     double tolerance = Precision.EpsilonOf(2) * Math.Max(M.RowCount, M.ColumnCount) * W[0, 0]; 

     for (int i = 0; i < s.Count; i++) 
     { 
      if (s[i] < tolerance) 
       s[i] = 0; 
      else 
       s[i] = 1/s[i]; 
     } 
     W.SetDiagonal(s); 

     // (U * W * VT)T is equivalent with V * WT * UT 
     return (Matrix)(D.U * W * D.VT).Transpose(); 

    } 
  • を探しています

    は、誰もがCUDAでのムーア・ペンローズの擬似実装上の任意のポインタを持ってい。

ご協力いただきますようお願い申し上げます。

P.S.私は展開可能なGPUを使って非正方行列のMoore-Penrose擬似逆行列を解くために他にどのような方法があるのか​​を知りたい。私はCUDA

http://docs.nvidia.com/cuda/cusolver/#svd-example1

のSVD機能を使って、ムーア・ペンローズpseudoinveseを実施しなかった

+1

そのコードは逆行列を計算しません。ムーア・ペンローズの擬似逆行列を計算します。非正方行列の逆行列などはありません。定義上、それらは存在しません。しかし、この質問は[SO]のトピック外であり、私はそれを閉じようと投票したので何と言っても – talonmies

+0

http://docs.nvidia.com/cuda/cusolver/index.html#cuds-lt-t-gt-gesvd – tera

+1

この質問は[SO]の話題ではないので、決して再開してはいけません。 – talonmies

答えて

-1

さて、唯一の問題は、SVDのCUDAバージョンはネイティブMKLのバージョンよりもはるかに遅いということです! 1000×1000の行列サイズを解くと、CUDAのSVD関数はMKLライブラリのSVD関数より約4倍遅くなります。

CULAの方がはるかに高速でしたが、もはやサポートされていないと主張する人がいました。 CULAはまだ商業的に提供されていますが、ライセンス費用は年間約25Kです。