public MatrisBase <object> PseudoInverse(MatrisBase <object> A, int side = -1) { if (Rank(A) != Math.Min(A.Row, A.Col)) { throw new Exception(CompilerMessage.MAT_PSEINV_NOT_FULL_RANK); } if (side != -1 && side != 1) { throw new Exception(CompilerMessage.MAT_PSEINV_BAD_SIDE); } CompilerUtils.AssertMatrixValsAreNumbers(A); string sidename = side == -1 ? "sol" : "sağ"; // Left inverse if (side == -1) { try { return(A is Dataframe df ? new Dataframe(MatrisMul(Inverse(MatrisMul(Conjugate(A), A)), Conjugate(A)).GetValues(), df.Delimiter, df.NewLine, Dataframe.GetCopyOfLabels(df.GetRowLabels()), Dataframe.GetCopyOfLabels(df.GetColLabels()), df.GetRowSettings().Copy(), df.GetColSettings().Copy()) : MatrisMul(Inverse(MatrisMul(Conjugate(A), A)), Conjugate(A))); } catch (Exception err) { if (err.Message == CompilerMessage.MAT_DET_ZERO_NO_INV) { throw new Exception(CompilerMessage.MAT_PSEINV_DET_ZERO(sidename)); } throw new Exception("Genelleştirilmiş ters matris hatası:\n", err); } } else // Right inverse { try { return(A is Dataframe df ? new Dataframe(MatrisMul(Conjugate(A), Inverse(MatrisMul(A, Conjugate(A)))).GetValues(), df.Delimiter, df.NewLine, Dataframe.GetCopyOfLabels(df.GetRowLabels()), Dataframe.GetCopyOfLabels(df.GetColLabels()), df.GetRowSettings().Copy(), df.GetColSettings().Copy()) : MatrisMul(Conjugate(A), Inverse(MatrisMul(A, Conjugate(A))))); } catch (Exception err) { if (err.Message == CompilerMessage.MAT_DET_ZERO_NO_INV) { throw new Exception(CompilerMessage.MAT_PSEINV_DET_ZERO(sidename)); } throw new Exception("Genelleştirilmiş ters matris hatası:\n", err); } } }