Exemple #1
0
        public MatrisBase <object> MinorMatris(MatrisBase <object> A,
                                               int row,
                                               int col,
                                               int based = 0)
        {
            if (!A.IsSquare())
            {
                throw new Exception(CompilerMessage.MAT_NOT_SQUARE);
            }

            CompilerUtils.AssertMatrixValsAreNumbers(A);

            List <List <object> > newlis = new List <List <object> >();
            List <List <object> > vals   = A.GetValues();

            row -= based;
            col -= based;

            if (row < 0 || row >= A.Row)
            {
                throw new Exception(CompilerMessage.MAT_OUT_OF_RANGE_INDEX("satır", based, A.Row - based));
            }

            if (col < 0 || col >= A.Col)
            {
                throw new Exception(CompilerMessage.MAT_OUT_OF_RANGE_INDEX("sütun", based, A.Col - based));
            }

            int rowindex = 0;

            for (int i = 0; i < row; i++)
            {
                newlis.Add(new List <object>());
                for (int j = 0; j < col; j++)
                {
                    newlis[rowindex].Add(vals[i][j]);
                }
                for (int j = col + 1; j < A.Col; j++)
                {
                    newlis[rowindex].Add(vals[i][j]);
                }
                rowindex++;
            }

            for (int i = row + 1; i < A.Row; i++)
            {
                newlis.Add(new List <object>());
                for (int j = 0; j < col; j++)
                {
                    newlis[rowindex].Add(vals[i][j]);
                }
                for (int j = col + 1; j < A.Col; j++)
                {
                    newlis[rowindex].Add(vals[i][j]);
                }
                rowindex++;
            }

            return(new MatrisBase <object>(newlis));
        }
Exemple #2
0
        public MatrisBase <object> Abs(MatrisBase <object> A)
        {
            if (!A.IsValid())
            {
                throw new Exception(CompilerMessage.MAT_INVALID_SIZE);
            }

            CompilerUtils.AssertMatrixValsAreNumbers(A);

            int m = A.Row;
            int n = A.Col;
            List <List <object> > vals    = A.GetValues();
            List <List <object> > newvals = new List <List <object> >();

            for (int i = 0; i < m; i++)
            {
                newvals.Add(new List <object>());
                for (int j = 0; j < n; j++)
                {
                    newvals[i].Add((dynamic)Math.Abs(float.Parse(vals[i][j].ToString())));
                }
            }

            return(A is Dataframe df
                ? new Dataframe(newvals,
                                df.Delimiter,
                                df.NewLine,
                                Dataframe.GetCopyOfLabels(df.GetRowLabels()),
                                Dataframe.GetCopyOfLabels(df.GetColLabels()),
                                df.GetRowSettings().Copy(),
                                df.GetColSettings().Copy())
                : new MatrisBase <object>(newvals));
        }
Exemple #3
0
        public MatrisBase <object> Adjoint(MatrisBase <object> A)
        {
            if (!A.IsSquare())
            {
                throw new Exception(CompilerMessage.MAT_NOT_SQUARE);
            }

            CompilerUtils.AssertMatrixValsAreNumbers(A);

            List <List <object> > adj = new List <List <object> >();
            int r = A.Row;
            int c = A.Col;

            for (int i = 0; i < r; i++)
            {
                adj.Add(new List <object>());
                for (int j = 0; j < c; j++)
                {
                    adj[i].Add((dynamic)(((i + j) % 2 == 1 ? -1 : 1) * Minor(A, i, j, 0)));
                }
            }

            return(A is Dataframe df
                ? new Dataframe(Transpose(new MatrisBase <object>(adj)).GetValues(),
                                df.Delimiter,
                                df.NewLine,
                                Dataframe.GetCopyOfLabels(df.GetRowLabels()),
                                Dataframe.GetCopyOfLabels(df.GetColLabels()),
                                df.GetRowSettings().Copy(),
                                df.GetColSettings().Copy())
                : Transpose(new MatrisBase <object>(adj)));
        }
Exemple #4
0
        public MatrisBase <object> RREchelon(MatrisBase <object> A)
        {
            // Bad dimensions
            if (!A.IsValid())
            {
                throw new Exception(CompilerMessage.MAT_INVALID_SIZE);
            }

            // Zero matrix
            if (A.IsZero((float)0.0))
            {
                return(A);
            }

            if (A is Dataframe df)
            {
                CompilerUtils.AssertMatrixValsAreNumbers(A);

                Dataframe result = df.Copy();
                InnerRREchelon(df, result);
                return(result);
            }
            else
            {
                MatrisBase <object> result = A.Copy();
                InnerRREchelon(A, result);
                return(result);
            }
        }
Exemple #5
0
        public MatrisBase <object> MatrisMul(MatrisBase <object> A,
                                             MatrisBase <object> B)
        {
            CompilerUtils.AssertMatrixValsAreNumbers(A);
            CompilerUtils.AssertMatrixValsAreNumbers(B);

            return(A is Dataframe df
                ? new Dataframe(CompilerUtils.MatrisMul(A, B).GetValues(),
                                df.Delimiter,
                                df.NewLine,
                                null,
                                null,
                                df.GetRowSettings().Copy(),
                                df.GetColSettings().Copy())
                : CompilerUtils.MatrisMul(A, B));
        }
Exemple #6
0
        public float Determinant(MatrisBase <object> A)
        {
            if (!A.IsSquare())
            {
                throw new Exception(CompilerMessage.MAT_NOT_SQUARE);
            }

            if (A.IsZero((float)0.0))
            {
                CompilerUtils.AssertMatrixValsAreNumbers(A);
                return((float)0.0);
            }

            if (A.Row == 1)
            {
                CompilerUtils.AssertMatrixValsAreNumbers(A);
                return(float.Parse(A.GetValues()[0][0].ToString()));
            }

            if (A.Row == 2)
            {
                CompilerUtils.AssertMatrixValsAreNumbers(A);
                return((float.Parse(A.GetValues()[0][0].ToString()) * float.Parse(A.GetValues()[1][1].ToString()))
                       - (float.Parse(A.GetValues()[0][1].ToString()) * float.Parse(A.GetValues()[1][0].ToString())));
            }

            using MatrisBase <object> ech = Echelon(A.Copy());

            float det = float.Parse(ech.GetValues()[0][0].ToString());

            if (ech.SwapCount % 2 == 1)
            {
                det *= -1;
            }

            int dim = A.Row;

            for (int i = 1; i < dim; i++)
            {
                det *= float.Parse(ech.GetValues()[i][i].ToString());
            }
            return(det);
        }
Exemple #7
0
        public MatrisBase <object> Round(MatrisBase <object> A,
                                         int n = 0)
        {
            if (!A.IsValid())
            {
                throw new Exception(CompilerMessage.MAT_INVALID_SIZE);
            }

            CompilerUtils.AssertMatrixValsAreNumbers(A);

            return(n < 0
                ? throw new Exception(CompilerMessage.ARG_INVALID_VALUE("n", " Sıfırdan büyük olmalı."))
                : A is Dataframe df
                ? new Dataframe(A.Round(n).GetValues(),
                                df.Delimiter,
                                df.NewLine,
                                Dataframe.GetCopyOfLabels(df.GetRowLabels()),
                                Dataframe.GetCopyOfLabels(df.GetColLabels()),
                                df.GetRowSettings().Copy(),
                                df.GetColSettings().Copy())
                : A.Round(n));
        }
Exemple #8
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);
                }
            }
        }