Пример #1
0
        public Matrix(params Vector <F>[] columns)
        {
            N = columns.Length;

            var height = columns.First().Size;

            for (int i = 1; i < N; ++i)
            {
                if (columns[i].Size != height)
                {
                    throw new ArgumentException($"All columns must have the same length. The first column has length {height}, but column {i} has length {columns[i].Size}.");
                }
            }

            var result = new MatrixRow <F> [columns.First().Size];

            for (int j = 0; j < height; ++j)
            {
                var row = new F[N];
                for (int i = 0; i < N; ++i)
                {
                    row[i] = columns[i][j];
                }
                result[j] = new MatrixRow <F>(row);
            }
            Rows = result;
        }
Пример #2
0
 public Vector(MatrixRow <F> mr)
 {
     vector = new F[mr.Length];
     for (int i = 0; i < mr.Length; ++i)
     {
         vector[i] = mr[i];
     }
 }
Пример #3
0
        public Matrix <F> RemoveRow(int m)
        {
            var result = new MatrixRow <F> [M - 1];

            for (int j = 0; j < M - 1; ++j)
            {
                result[j] = j < m ? this[j] : this[j + 1];
            }
            return(new Matrix <F>(result));
        }
Пример #4
0
        public MatrixRow <F> Add(MatrixRow <F> mr)
        {
            if (Length != mr.Length)
            {
                throw new ArgumentException("In order to add two rows, they must have the same length.");
            }
            var result = new F[Length];

            for (int i = 0; i < Length; ++i)
            {
                result[i] = Data[i].Add(mr[i]);
            }
            return(new MatrixRow <F>(result));
        }
Пример #5
0
        public static Matrix <F> UnitMatrix(int dim)
        {
            var result = new MatrixRow <F> [dim];

            for (int j = 0; j < dim; ++j)
            {
                var row = new F[dim];
                for (int i = 0; i < dim; ++i)
                {
                    row[i] = i == j ? new F().ONE : new F();
                }
                result[j] = new MatrixRow <F>(row);
            }
            return(new Matrix <F>(result));
        }
Пример #6
0
        public Matrix <F> Transpose()
        {
            var result = new MatrixRow <F> [N];

            for (int i = 0; i < N; ++i)
            {
                var row = new F[M];
                for (int j = 0; j < M; ++j)
                {
                    row[j] = this[j][i];
                }
                result[i] = new MatrixRow <F>(row);
            }
            return(new Matrix <F>(result));
        }
Пример #7
0
        public static Matrix <F> operator *(F d, Matrix <F> m)
        {
            var result = new MatrixRow <F> [m.M];

            for (int j = 0; j < m.M; ++j)
            {
                var row = new F[m.N];
                for (int i = 0; i < m.N; ++i)
                {
                    row[i] = m[j][i].Multiply(d);
                }
                result[j] = new MatrixRow <F>(row);
            }
            return(new Matrix <F>(result));
        }
Пример #8
0
        public LEMatrix Transpose()
        {
            var result = new MatrixRow[N];

            for (int i = 0; i < N; ++i)
            {
                var row = new double[M];
                for (int j = 0; j < M; ++j)
                {
                    row[j] = this[j][i];
                }
                result[i] = new MatrixRow(row);
            }
            return(new LEMatrix(result));
        }
Пример #9
0
        public static LEMatrix UnitMatrix(int dim)
        {
            var result = new MatrixRow[dim];

            for (int j = 0; j < dim; ++j)
            {
                var row = new double[dim];
                for (int i = 0; i < dim; ++i)
                {
                    row[i] = i == j ? 1 : 0;
                }
                result[j] = new MatrixRow(row);
            }
            return(new LEMatrix(result));
        }
Пример #10
0
        public static LEMatrix operator *(double d, LEMatrix m)
        {
            var result = new MatrixRow[m.M];

            for (int j = 0; j < m.M; ++j)
            {
                var row = new double[m.N];
                for (int i = 0; i < m.N; ++i)
                {
                    row[i] = m[j][i] * d;
                }
                result[j] = new MatrixRow(row);
            }
            return(new LEMatrix(result));
        }
Пример #11
0
        public static Matrix <F> operator*(Matrix <F> m1, Matrix <F> m2)
        {
            if (m1.N != m2.M)
            {
                throw new ArgumentException("m1.N must equal m2.N.");
            }
            var result = new MatrixRow <F> [m1.M];

            for (int j = 0; j < m1.M; ++j)
            {
                var row = new F[m2.N];
                for (int i = 0; i < m2.N; ++i)
                {
                    row[i] = m1[j].ToVector().Zip(m2.Column(i), (a, b) => (a, b)).Aggregate(new F(), (a, f) => a.Add(f.a.Multiply(f.b)));
                }
                result[j] = new MatrixRow <F>(row);
            }
            return(new Matrix <F>(result));
        }
Пример #12
0
        public static Matrix <F> operator -(Matrix <F> m1, Matrix <F> m2)
        {
            if (m1.M != m2.M || m1.N != m2.N)
            {
                throw new ArgumentException("In order to add to matrixes, they must have the same dimensions.");
            }
            var result = new MatrixRow <F> [m1.M];

            for (int j = 0; j < m1.M; ++j)
            {
                var row = new F[m1.N];
                for (int i = 0; i < m1.N; ++i)
                {
                    row[i] = m1[j][i].Subtract(m2[j][i]);
                }
                result[j] = new MatrixRow <F>(row);
            }
            return(new Matrix <F>(result));
        }
Пример #13
0
        public static LEMatrix operator*(LEMatrix m1, LEMatrix m2)
        {
            if (m1.N != m2.M)
            {
                throw new ArgumentException("m1.N must equal m2.N.");
            }
            var result = new MatrixRow[m1.M];

            for (int j = 0; j < m1.M; ++j)
            {
                var row = new double[m2.N];
                for (int i = 0; i < m2.N; ++i)
                {
                    row[i] = m1[j].ToLEVector().DotSum(m2.Column(i));
                }
                result[j] = new MatrixRow(row);
            }
            return(new LEMatrix(result));
        }
Пример #14
0
        public static LEMatrix operator -(LEMatrix m1, LEMatrix m2)
        {
            if (m1.M != m2.M || m1.N != m2.N)
            {
                throw new ArgumentException("In order to add to matrixes, they must have the same dimensions.");
            }
            var result = new MatrixRow[m1.M];

            for (int j = 0; j < m1.M; ++j)
            {
                var row = new double[m1.N];
                for (int i = 0; i < m1.N; ++i)
                {
                    row[i] = m1[j][i] - m2[j][i];
                }
                result[j] = new MatrixRow(row);
            }
            return(new LEMatrix(result));
        }
Пример #15
0
        public Matrix(IEnumerable <F> values, int rows)
        {
            if (values.Count() % rows != 0)
            {
                throw new ArgumentException($"The number of values({values.Count()}) must be divisible by the number of rows({rows}).");
            }
            N = values.Count() / rows;
            var result = new MatrixRow <F> [rows];

            int j   = -1;
            int i   = 0;
            var row = new F[N];

            foreach (var value in values)
            {
                row[i] = value;
                if (++i >= N)
                {
                    i          -= N;
                    result[++j] = new MatrixRow <F>(row);
                }
            }
            Rows = result;
        }