public MyMatrix Clone()
        {
            MyMatrix newmatrix = new MyMatrix(n, m);

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    newmatrix[i, j] = values[i, j].Clone();
                }
            }
            return(newmatrix);
        }
        public static MyMatrix operator *(Rational a, MyMatrix B)
        {
            MyMatrix aB = B.Clone();

            for (int i = 0; i < B.n; i++)
            {
                for (int j = 0; j < B.m; j++)
                {
                    aB[i, j] *= a;
                }
            }
            return(aB);
        }
        public static MyMatrix operator -(MyMatrix A, MyMatrix B)
        {
            if (A.n != B.n || A.m != B.m)
            {
                throw new InvalidOperationException("Dimension mismatch!");
            }
            MyMatrix subt = new MyMatrix(A.n, A.m);

            for (int i = 0; i < subt.n; i++)
            {
                for (int j = 0; j < subt.m; j++)
                {
                    subt[i, j] = A[i, j] - B[i, j];
                }
            }
            return(subt);
        }
        public MyMatrix Adjunct()
        {
            if (n != m)
            {
                throw new InvalidOperationException("Dimension mismatch!");
            }
            MyMatrix adjunct = new MyMatrix(n);

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    adjunct[i, j] = Adjunct(i, j);
                }
            }
            return(adjunct);
        }
        public MyMatrix Apply(MyMatrix vector)
        {
            MyMatrix output = new MyMatrix(n, 1);

            if (vector.N != n || vector.M != 1)
            {
                throw new InvalidOperationException("Dimension mismatch!");
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    output[i, 0] += values[i, j] * vector[j, 0];
                }
            }
            return(output);
        }
Beispiel #6
0
        public static MyMatrix FromWolfram(string input)
        {
            string[] lines = input.Replace("\n", "").Replace("\r", "").Replace(" ", "").Split(new string[] { "},{" }, StringSplitOptions.None);
            lines[0] = lines[0].Replace("{", "");
            lines[lines.Length - 1] = lines.Last().Replace("}", "");
            MyMatrix tmp = new MyMatrix(lines.Length, lines[0].Split(',').Length);

            for (int i = 0; i < lines.Length; i++)
            {
                string[] args = lines[i].Split(',');
                for (int j = 0; j < args.Length; j++)
                {
                    tmp[i, j] = new Rational(args[j]);
                }
            }
            return(tmp);
        }
 public bool Equals(MyMatrix other)
 {
     if (n != other.n || m != other.m)
     {
         return(false);
     }
     for (int i = 0; i < n; i++)
     {
         for (int j = 0; j < m; j++)
         {
             if (values[i, j] != other[i, j])
             {
                 return(false);
             }
         }
     }
     return(true);
 }
        public string KerBasis()
        {
            MyMatrix    row_echelon = Clone();
            string      output      = row_echelon.GaussLaTeX() + '\n';
            LaTeXExport export      = new LaTeXExport(1, ",", 1, false, "$$\\ker\\ \\text{basis}:\\ ");
            List <int>  pivots      = new List <int>();

            for (int i = 0; i < n; i++)
            {
                int j_s = 0;
                for (; j_s < m && row_echelon[i, j_s] == 0; j_s++)
                {
                    ;
                }
                if (j_s >= m)
                {
                    break;
                }
                pivots.Add(j_s);
            }
            int j_free = 0;

            for (int j = 0; j < m - pivots.Count; j++, j_free++)
            {
                for (; pivots.Contains(j_free); j_free++)
                {
                    ;
                }
                MyMatrix basis_el = new MyMatrix(m, 1);
                basis_el[j_free, 0] = 1;
                for (int i = 0; i < pivots.Count; i++)
                {
                    basis_el[pivots[i], 0] = -row_echelon[i, j_free];
                }
                export.Add(basis_el.GetLaTeX());
            }
            if (export.Empty)
            {
                export.Add(new MyMatrix(m, 1).GetLaTeX());
            }
            return(output + export.Result);
        }
        public static MyMatrix operator *(MyMatrix A, MyMatrix B)
        {
            if (A.m != B.n)
            {
                throw new InvalidOperationException("Dimension mismatch!");
            }
            MyMatrix AB = new MyMatrix(A.n, B.m);

            for (int i = 0; i < AB.n; i++)
            {
                for (int j = 0; j < AB.m; j++)
                {
                    for (int l = 0; l < A.m; l++)
                    {
                        AB[i, j] += A[i, l] * B[l, j];
                    }
                }
            }
            return(AB);
        }
Beispiel #10
0
        public static MyMatrix FromLaTeX(string input)
        {
            string[] lines = input.Replace("\n", "").Replace("\r", "").Replace(" ", "").Split(new string[] { "\\\\" }, StringSplitOptions.None);
            if (lines[0].Contains("begin"))
            {
                lines[0] = lines[0].Substring(lines[0].IndexOf('}') + 1);
                if (lines[0][0] == '{')
                {
                    lines[0] = lines[0].Substring(lines[0].IndexOf('}') + 1);
                }
            }
            if (lines.Last().Contains("end"))
            {
                lines[lines.Length - 1] = lines.Last().Substring(0, lines.Last().IndexOf("\\end"));
            }
            int end_empty = 0;

            if (lines.Last().Length == 0)
            {
                end_empty = 1;
            }
            MyMatrix tmp = new MyMatrix(lines.Length - end_empty, lines[0].Split('&').Length);

            for (int i = 0; i < tmp.N; i++)
            {
                string[] args = lines[i].Split('&');
                for (int j = 0; j < args.Length; j++)
                {
                    if (args[j].Contains("frac"))
                    {
                        tmp[i, j] = ParseFrac(args[j]);
                    }
                    else
                    {
                        tmp[i, j] = new Rational(args[j]);
                    }
                }
            }
            return(tmp);
        }
Beispiel #11
0
        public static Rational ScalarProduct(MyMatrix a, MyMatrix b)
        {
            MyMatrix a_n, b_n;

            if (a.m == 1)
            {
                a_n = a.Transposed();
            }
            else
            {
                a_n = a;
            }
            if (b.m == 1)
            {
                b_n = b;
            }
            else
            {
                b_n = b.Transposed();
            }
            return((a_n * b_n).Sum());
        }
Beispiel #12
0
        public string InverseLaTeX()
        {
            if (!IsSquare)
            {
                throw new InvalidOperationException("Matrix is not square!");
            }
            if (Determinant == 0)
            {
                throw new DivideByZeroException("Determinant zero!");
            }
            MyMatrix tmp = new MyMatrix(n, n * 2);

            tmp.Set(this);
            for (int i = 0; i < n; i++)
            {
                tmp[i, i + n] = 1;
            }
            string output = tmp.GaussLaTeX(n);

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    tmp[i, j] = tmp[i, j + n];
                }
            }
            tmp.M = n;

            /*try
             * {
             *  if (!(tmp * this).Equals(Id))
             *      throw new Exception();
             * }
             * catch { throw new ArithmeticException("Cannot find inverse matrix!"); }*/
            values = tmp.values;
            return(output);
        }