public void svdTest()
{
// Declare local matrices
mat u = _, s = _, v = _;
// Compute a new mat
mat M = magic(3) * 5;
// Compute the SVD
ret [u, s, v] = svd(M);
string str = u;
/*
0.577350269189626 -0.707106781186548 0.408248290463863
U = 0.577350269189626 -1.48007149071427E-16 -0.816496580927726
0.577350269189626 0.707106781186548 0.408248290463863
*/
double[,] expectedU =
{
{ 0.577350269189626, -0.707106781186548, 0.408248290463863 },
{ 0.577350269189626, -1.48007149071427E-16, -0.816496580927726 },
{ 0.577350269189626, 0.707106781186548, 0.408248290463863 },
};
double[,] expectedS =
{
{ 74.999999999999972, 0, 0 },
{ 0, 34.641016151377556, 0 },
{ 0, 0, 17.320508075688775 },
};
double[,] expectedV =
{
{ 0.57735026918962573, -0.4082482904638628, 0.70710678118654779 },
{ 0.57735026918962562, 0.81649658092772615, -0.000000000000000061130671974381729 },
{ 0.57735026918962584, -0.40824829046386324, -0.70710678118654757 },
};
Assert.IsTrue(expectedU.IsEqual(u, 1e-10));
Assert.IsTrue(expectedS.IsEqual(s, 1e-10));
Assert.IsTrue(expectedV.IsEqual(v, 1e-10));
}