我试图在CUDA中找到非方阵的Moore-Penrose伪逆。
今天,我使用以下代码作为Moore-Penrose伪逆的实现。
问题是我试图找到伪逆的非方矩阵是相当大的,所以我想用CUDA解决它来利用GPU的力量。
我基本上是在寻找此代码的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();
}
任何帮助将不胜感激。
P.S。我想知道使用可部署的GPU解决非方形矩阵的Moore-Penrose伪逆的其他方法。
答案 0 :(得分:-1)
好的,我使用CUDA的SVD函数实现了Moore-Penrose伪启发
http://docs.nvidia.com/cuda/cusolver/#svd-example1
唯一的问题是CUD版本的SVD比原生MKL版本慢得多!在解决1000 x 1000的矩阵尺寸时,CUDA的SVD功能几乎比MKL库的SVD功能慢4倍。
另一方面,我看到有人声称CULA曾经快得多,但不再受支持了。 CULA仍然在商业上提供,但许可证每年约25,000美元。