2017-02-16 251 views
0

我正在嘗試在CUDA中找到Moore-Penrose矩陣中的非矩形矩陣。CUDA中非矩形矩陣的計算機逆矩陣

今天,我使用下面的代碼作爲Moore-Penrose僞逆的實現。

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

的問題是,我想找到僞逆非方陣的大小是相當大的,所以我想解決它使用CUDA來利用GPU的強大功能。

我基本上找這個代碼

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穆爾 - 彭羅斯僞逆執行任何指針的CUDA版本。

任何幫助將不勝感激。

P.S.我想知道使用可部署的GPU來解決Moore-Penrose僞非矩陣矩陣的其他方法。

+1

該代碼不計算矩陣逆。它計算一個Moore-Penrose僞逆。沒有這樣的東西作爲非矩陣的逆矩陣。根據定義,它們不存在。但是,無論因爲這個問題是否是[SO]的話題,我已經投票決定關閉它 – talonmies

+0

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

+1

這個問題是[SO]的話題,不應該重新開放。 – talonmies

回答

-1

好吧,我沒有使用CUDA

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

唯一的問題是,SVD的CUDA版本比原始版本MKL慢得多的SVD功能實現穆爾 - 彭羅斯pseudoinvese!在求解1000 x 1000的矩陣大小時,CUDA的SVD函數比MKL函數庫的SVD函數慢4倍。

在附註中,我看到有人聲稱CULA過去速度更快但不再受支持。 CULA仍在商業上提供,但每年的授權費用約爲25K。