Exemple #1
0
        /// <summary>Performs an element-wise binary operation (involving two matricies),
        /// returning the result in a new matrix instance</summary>
        /// <param name="matrix1">First matrix</param>
        /// <param name="matrix2">Second matrix</param>
        /// <param name="operation">Binary operation delegate</param>
        /// <returns>Matrix instance containing the result of the binary operation</returns>
        public static MatrixBase <T> ElementWiseOperation(
            MatrixBase <T> matrix1,
            MatrixBase <T> matrix2,
            ElementBinaryOperationDelegate operation)
        {
            if (MatrixBase <T> .IsNull(matrix1))
            {
                throw new ArgumentNullException("matrix1");
            }
            if (MatrixBase <T> .IsNull(matrix2))
            {
                throw new ArgumentNullException("matrix2");
            }
            if (matrix1.ColumnCount != matrix2.ColumnCount)
            {
                throw new DimensionMismatchException("The number of columns in matrix1 does not equal the number of columns in matrix2");
            }
            if (matrix1.RowCount != matrix2.RowCount)
            {
                throw new DimensionMismatchException("The number of rows in matrix1 does not equal the number of rows in matrix2");
            }

            MatrixBase <T> result = new MatrixBase <T>(matrix1.ColumnCount, matrix1.RowCount);

            for (Int32 i = 0; i < result.ColumnCount; i++)
            {
                for (Int32 j = 0; j < result.RowCount; j++)
                {
                    result[i, j] = operation(matrix1[i, j], matrix2[i, j]);
                }
            }
            return(result);
        }
Exemple #2
0
        /// <summary>Performs an element-wise unary operation involving a single matrix,
        /// returning the result in a new matrix instance</summary>
        /// <param name="matrix">Matrix</param>
        /// <param name="operation">Unary operation delegate</param>
        /// <returns>Matrix instance containing the result of the unary operation</returns>
        public static MatrixBase <T> ElementWiseOperation(
            MatrixBase <T> matrix,
            ElementPositionalUnaryOperationDelegate operation)
        {
            if (MatrixBase <T> .IsNull(matrix))
            {
                throw new ArgumentNullException("matrix");
            }

            MatrixBase <T> result = new MatrixBase <T>(matrix.ColumnCount, matrix.RowCount);

            for (Int32 i = 0; i < result.ColumnCount; i++)
            {
                for (Int32 j = 0; j < result.RowCount; j++)
                {
                    result[i, j] = operation(matrix[i, j], i, j);
                }
            }
            return(result);
        }
Exemple #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="matricies"></param>
        /// <returns></returns>
        public static MatrixBase <T> JoinVertical(
            IEnumerable <MatrixBase <T> > matricies)
        {
            int?columnCount   = null;
            int totalRowCount = 0;

            foreach (MatrixBase <T> matrix in matricies)
            {
                if (MatrixBase <T> .IsNull(matrix))
                {
                    throw new ArgumentNullException();
                }
                if (columnCount == null)
                {
                    columnCount = matrix.ColumnCount;
                }
                else if ((int)columnCount != matrix.ColumnCount)
                {
                    throw new DimensionMismatchException();
                }
                totalRowCount += matrix.RowCount;
            }

            MatrixBase <T> resultMatrix = new MatrixBase <T>((int)columnCount, totalRowCount);

            int rowOffset = 0;

            foreach (MatrixBase <T> matrix in matricies)
            {
                MatrixBase <T> .ElementWiseCopy(matrix, resultMatrix, 0, rowOffset);

                rowOffset += matrix.RowCount;
            }

            return(resultMatrix);
        }
Exemple #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="matricies"></param>
        /// <returns></returns>
        public static MatrixBase <T> JoinHorizontal(
            IEnumerable <MatrixBase <T> > matricies)
        {
            int?rowCount         = null;
            int totalColumnCount = 0;

            foreach (MatrixBase <T> matrix in matricies)
            {
                if (MatrixBase <T> .IsNull(matrix))
                {
                    throw new ArgumentNullException();
                }
                if (rowCount == null)
                {
                    rowCount = matrix.RowCount;
                }
                else if ((int)rowCount != matrix.RowCount)
                {
                    throw new DimensionMismatchException();
                }
                totalColumnCount += matrix.ColumnCount;
            }

            MatrixBase <T> resultMatrix = new MatrixBase <T>(totalColumnCount, (int)rowCount);

            int columnOffset = 0;

            foreach (MatrixBase <T> matrix in matricies)
            {
                MatrixBase <T> .ElementWiseCopy(matrix, resultMatrix, columnOffset, 0);

                columnOffset += matrix.ColumnCount;
            }

            return(resultMatrix);
        }