public void RandomUnitVector() { var epsilon = 0.0001; // unit vector should have length 1 Assert.AreEqual(1, V.Magnitude(ThinSvd.RandomUnitVector(10)), epsilon); // unit vector with single element should be [-1] or [+1] Assert.AreEqual(1, Math.Abs(ThinSvd.RandomUnitVector(1)[0]), epsilon); // two randomly generated unit vectors should not be equal Assert.AreNotEqual(ThinSvd.RandomUnitVector(10), ThinSvd.RandomUnitVector(10)); }
public void CheckSvd(double[,] testMatrix) { var epsilon = 1E-5; double[,] u; double[,] v; double[] s; (u, s, v) = ThinSvd.Decompose(testMatrix, 1E-8, 1000); for (var i = 1; i < s.Length; i++) { // singular values should be arranged from greatest to smallest Assert.GreaterOrEqual(s[i - 1], s[i]); } for (var i = 0; i < u.GetLength(1); i++) { double[] extracted = new double[u.GetLength(0)]; // extract a column of u for (var j = 0; j < extracted.Length; j++) { extracted[j] = u[j, i]; } if (s[i] > epsilon) { // if the singular value is non-zero, then the basis vector in u should be a unit vector Assert.AreEqual(1, V.Magnitude(extracted), epsilon); } else { // if the singular value is zero, then the basis vector in u should be zeroed out Assert.AreEqual(0, V.Magnitude(extracted), epsilon); } } for (var i = 0; i < v.GetLength(1); i++) { double[] extracted = new double[v.GetLength(0)]; // extract column of v for (var j = 0; j < extracted.Length; j++) { extracted[j] = v[j, i]; } if (s[i] > epsilon) { // if the singular value is non-zero, then the basis vector in v should be a unit vector Assert.AreEqual(1, V.Magnitude(extracted), epsilon); } else { // if the singular value is zero, then the basis vector in v should be zeroed out Assert.AreEqual(0, V.Magnitude(extracted), epsilon); } } // convert singular values to a diagonal matrix double[,] expanded = new double[s.Length, s.Length]; for (var i = 0; i < s.Length; i++) { expanded[i, i] = s[i]; } // matrix = U * S * V^t, definition of Singular Vector Decomposition AssertMatrixEqual(testMatrix, u.Multiply(expanded).Multiply(M.Transpose(v)), epsilon); AssertMatrixEqual(testMatrix, u.Multiply(expanded.Multiply(M.Transpose(v))), epsilon); }