/// <summary> /// Recompose SVD to U*W*V'. /// </summary> /// <returns></returns> public MatrixFixed Recompose() { MatrixFixed W = new MatrixFixed(W_.Rows, W_.Columns); W.Fill(0); for (int i = 0; i < rank_; i++) { W[i, i] = W_[i, i]; } return(U_ * W * V_.ConjugateTranspose()); }
/// <summary> /// Calculate pseudo-inverse. /// </summary> /// <returns></returns> public MatrixFixed PseudoInverse() { MatrixFixed Winverse = new MatrixFixed(Winverse_.Rows, Winverse_.Columns); Winverse.Fill(0); for (int i = 0; i < rank_; i++) { Winverse[i, i] = Winverse_[i, i]; } return(V_ * Winverse * U_.ConjugateTranspose()); }