CUDA中非矩形矩阵的计算机逆矩阵
问题描述:
我正在尝试在CUDA中找到Moore-Penrose矩阵中的非矩形矩阵。CUDA中非矩形矩阵的计算机逆矩阵
今天,我使用下面的代码作为Moore-Penrose伪逆的实现。
的问题是,我想找到伪逆非方阵的大小是相当大的,所以我想解决它使用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伪非矩阵矩阵的其他方法。
答
好吧,我没有使用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。
该代码不计算矩阵逆。它计算一个Moore-Penrose伪逆。没有这样的东西作为非矩阵的逆矩阵。根据定义,它们不存在。但是,无论因为这个问题是否是[SO]的话题,我已经投票决定关闭它 – talonmies
http://docs.nvidia.com/cuda/cusolver/index.html#cuds-lt-t-gt-gesvd – tera
这个问题是[SO]的话题,不应该重新开放。 – talonmies