Beispiel #1
0
        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);
                }
            }
        }