double[,] Rotate(ProcrustedDataset p, ProcrustedDataset p_reference)
{
// Rotation calculus per Amy Ross, Procrustes Analysis : http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.119.2686&rep=rep1&type=pdf
SingularValueDecomposition svd = new SingularValueDecomposition(p_reference.Dataset.TransposeAndDot(p.Dataset));
double[,] Q = svd.RightSingularVectors.TransposeAndDot(svd.LeftSingularVectors);
p.RotationMatrix = Q;
return p.Dataset.Dot(Q);
}