public void Add(IntegerMatrix other)
 {
     for (int i = 0; i < RowSize; i++)
     {
         for (int j = 0; j < ColumnSize; j++)
         {
             Replace(i, j, Get(i, j) + other.Get(i, j));
         }
     }
 }
        //TODO: classify multiplications to have the products be as explicit as possible.
        //im sure theres a better way to do this lol
        public SquareIntegerMatrix Multiply(SquareIntegerMatrix other)
        {
            IntegerMatrix       product = Multiply(other as IntegerMatrix);
            SquareIntegerMatrix ret     = new SquareIntegerMatrix(other.RowSize);

            for (int i = 0; i < RowSize; i++)
            {
                for (int j = 0; j < RowSize; j++)
                {
                    ret.Replace(i, j, product.Get(i, j));
                }
            }
            return(ret);
        }
        //TODO: Be able to cast a nxn as a squareintegermatrix or a 1xn as a row vector etc.

        public static IntegerMatrix Sum(IntegerMatrix obj1, IntegerMatrix obj2)
        {
            if (!SizeParity(obj1, obj2))
            {
                throw new ArgumentException("The matrices were not in the same dimension.");
            }
            else
            {
                IntegerMatrix ret = new IntegerMatrix(obj1.RowSize, obj1.ColumnSize);
                ret.Add(obj1);
                ret.Add(obj2);
                return(ret);
            }
        }
 //TODO: Test this. Pretty sure it works?
 public IntegerMatrix Multiply(IntegerMatrix other)
 {
     if (!CanMultiply(other))
     {
         throw new MultiplicationDimensionMismatchException();                      //todo
     }
     else
     {
         IntegerMatrix ret = new IntegerMatrix(RowSize, other.ColumnSize);
         for (int i = 0; i < RowSize; i++)
         {
             for (int j = 0; j < other.ColumnSize; j++)
             {
                 int[]               ro = GetRow(i).ToArray <int>();
                 int[]               co = other.GetColumn(j).ToArray <int>();
                 IntegerRowVector    v  = new IntegerRowVector(ro);
                 IntegerColumnVector w  = new IntegerColumnVector(co);
                 ret.Replace(i, j, VectorMath.DotProduct <int>(v, w));
             }
         }
         return(ret);
     }
 }