Пример #1
0
        public ObjectMatrix2D ComposeDiagonal(ObjectMatrix2D A, ObjectMatrix2D B, ObjectMatrix2D C)
        {
            ObjectMatrix2D diag = Make(A.Rows + B.Rows + C.Rows, A.Columns + B.Columns + C.Columns);

            diag.ViewPart(0, 0, A.Rows, A.Columns).Assign(A);
            diag.ViewPart(A.Rows, A.Columns, B.Rows, B.Columns).Assign(B);
            diag.ViewPart(A.Rows + B.Rows, A.Columns + B.Columns, C.Rows, C.Columns).Assign(C);
            return(diag);
        }
Пример #2
0
        public ObjectMatrix2D ComposeDiagonal(ObjectMatrix2D A, ObjectMatrix2D B)
        {
            int            ar = A.Rows; int ac = A.Columns;
            int            br = B.Rows; int bc = B.Columns;
            ObjectMatrix2D sum = Make(ar + br, ac + bc);

            sum.ViewPart(0, 0, ar, ac).Assign(A);
            sum.ViewPart(ar, ac, br, bc).Assign(B);
            return(sum);
        }
Пример #3
0
        public ObjectMatrix2D AppendRows(ObjectMatrix2D A, ObjectMatrix2D B)
        {
            // force both to have maximal shared number of columns.
            if (B.Columns > A.Columns)
            {
                B = B.ViewPart(0, 0, B.Rows, A.Columns);
            }
            else if (B.Columns < A.Columns)
            {
                A = A.ViewPart(0, 0, A.Rows, B.Columns);
            }

            // concatenate
            int            ar     = A.Rows;
            int            br     = B.Rows;
            int            c      = A.Columns;
            ObjectMatrix2D matrix = Make(ar + br, c);

            matrix.ViewPart(0, 0, ar, c).Assign(A);
            matrix.ViewPart(ar, 0, br, c).Assign(B);
            return(matrix);
        }
Пример #4
0
        public ObjectMatrix2D AppendColumns(ObjectMatrix2D A, ObjectMatrix2D B)
        {
            // force both to have maximal shared number of rows.
            if (B.Rows > A.Rows)
            {
                B = B.ViewPart(0, 0, A.Rows, B.Columns);
            }
            else if (B.Rows < A.Rows)
            {
                A = A.ViewPart(0, 0, B.Rows, A.Columns);
            }

            // concatenate
            int            ac     = A.Columns;
            int            bc     = B.Columns;
            int            r      = A.Rows;
            ObjectMatrix2D matrix = Make(r, ac + bc);

            matrix.ViewPart(0, 0, r, ac).Assign(A);
            matrix.ViewPart(0, ac, r, bc).Assign(B);
            return(matrix);
        }
Пример #5
0
        /**
         * C = A||A||..||A; Constructs a new matrix which is duplicated both along the row and column dimension.
         * Example:
         * <pre>
         * 0 1
         * 2 3
         * repeat(2,3) -->
         * 0 1 0 1 0 1
         * 2 3 2 3 2 3
         * 0 1 0 1 0 1
         * 2 3 2 3 2 3
         * </pre>
         */
        public ObjectMatrix2D Repeat(ObjectMatrix2D A, int rowRepeat, int columnRepeat)
        {
            int            r      = A.Rows;
            int            c      = A.Columns;
            ObjectMatrix2D matrix = Make(r * rowRepeat, c * columnRepeat);

            for (int i = rowRepeat; --i >= 0;)
            {
                for (int j = columnRepeat; --j >= 0;)
                {
                    matrix.ViewPart(r * i, c * j, r, c).Assign(A);
                }
            }
            return(matrix);
        }
Пример #6
0
        public void Decompose(ObjectMatrix2D[][] parts, ObjectMatrix2D matrix)
        {
            CheckRectangularShape(parts);
            int rows    = parts.Length;
            int columns = 0;

            if (parts.Length > 0)
            {
                columns = parts.GetLength(1);
            }
            if (rows == 0 || columns == 0)
            {
                return;
            }

            // determine maximum column width of each column
            int[] maxWidths = new int[columns];
            for (int column = columns; --column >= 0;)
            {
                int maxWidth = 0;
                for (int row = rows; --row >= 0;)
                {
                    ObjectMatrix2D part = parts[row][column];
                    if (part != null)
                    {
                        int width = part.Columns;
                        if (maxWidth > 0 && width > 0 && width != maxWidth)
                        {
                            throw new ArgumentException("Different number of columns.");
                        }
                        maxWidth = System.Math.Max(maxWidth, width);
                    }
                }
                maxWidths[column] = maxWidth;
            }

            // determine row height of each row
            int[] maxHeights = new int[rows];
            for (int row = rows; --row >= 0;)
            {
                int maxHeight = 0;
                for (int column = columns; --column >= 0;)
                {
                    ObjectMatrix2D part = parts[row][column];
                    if (part != null)
                    {
                        int height = part.Rows;
                        if (maxHeight > 0 && height > 0 && height != maxHeight)
                        {
                            throw new ArgumentException("Different number of rows.");
                        }
                        maxHeight = System.Math.Max(maxHeight, height);
                    }
                }
                maxHeights[row] = maxHeight;
            }


            // shape of result parts
            int resultRows = 0;

            for (int row = rows; --row >= 0;)
            {
                resultRows += maxHeights[row];
            }
            int resultCols = 0;

            for (int column = columns; --column >= 0;)
            {
                resultCols += maxWidths[column];
            }

            if (matrix.Rows < resultRows || matrix.Columns < resultCols)
            {
                throw new ArgumentException("Parts larger than matrix.");
            }

            // copy
            int r = 0;

            for (int row = 0; row < rows; row++)
            {
                int c = 0;
                for (int column = 0; column < columns; column++)
                {
                    ObjectMatrix2D part = parts[row][column];
                    if (part != null)
                    {
                        part.Assign(matrix.ViewPart(r, c, part.Rows, part.Columns));
                    }
                    c += maxWidths[column];
                }
                r += maxHeights[row];
            }
        }
        public ObjectMatrix2D Compose(ObjectMatrix2D[][] parts)
        {
            CheckRectangularShape(parts);
            int rows    = parts.Length;
            int columns = 0;

            if (parts.Length > 0)
            {
                columns = parts.GetLength(1);
            }
            ObjectMatrix2D empty = Make(0, 0);

            if (rows == 0 || columns == 0)
            {
                return(empty);
            }

            // determine maximum column width of each column
            int[] maxWidths = new int[columns];
            for (int column = columns; --column >= 0;)
            {
                int maxWidth = 0;
                for (int row = rows; --row >= 0;)
                {
                    ObjectMatrix2D part = parts[row][column];
                    if (part != null)
                    {
                        int width = part.Columns;
                        if (maxWidth > 0 && width > 0 && width != maxWidth)
                        {
                            throw new ArgumentException(Cern.LocalizedResources.Instance().Exception_DifferentNumberOfColumns);
                        }
                        maxWidth = System.Math.Max(maxWidth, width);
                    }
                }
                maxWidths[column] = maxWidth;
            }

            // determine row height of each row
            int[] maxHeights = new int[rows];
            for (int row = rows; --row >= 0;)
            {
                int maxHeight = 0;
                for (int column = columns; --column >= 0;)
                {
                    ObjectMatrix2D part = parts[row][column];
                    if (part != null)
                    {
                        int height = part.Rows;
                        if (maxHeight > 0 && height > 0 && height != maxHeight)
                        {
                            throw new ArgumentException(Cern.LocalizedResources.Instance().Exception_DifferentNumberOfRows);
                        }
                        maxHeight = System.Math.Max(maxHeight, height);
                    }
                }
                maxHeights[row] = maxHeight;
            }


            // shape of result
            int resultRows = 0;

            for (int row = rows; --row >= 0;)
            {
                resultRows += maxHeights[row];
            }
            int resultCols = 0;

            for (int column = columns; --column >= 0;)
            {
                resultCols += maxWidths[column];
            }

            ObjectMatrix2D matrix = Make(resultRows, resultCols);

            // copy
            int r = 0;

            for (int row = 0; row < rows; row++)
            {
                int c = 0;
                for (int column = 0; column < columns; column++)
                {
                    ObjectMatrix2D part = parts[row][column];
                    if (part != null)
                    {
                        matrix.ViewPart(r, c, part.Rows, part.Columns).Assign(part);
                    }
                    c += maxWidths[column];
                }
                r += maxHeights[row];
            }

            return(matrix);
        }