Ticket #11715: trac_11715_matrix_set_row_column_docs_fixed.patch

File trac_11715_matrix_set_row_column_docs_fixed.patch, 6.4 KB (added by hds, 8 years ago)

Updated set_row() and set_column for better error handling / reporting

  • sage/matrix/matrix1.pyx

    # HG changeset patch
    # User Rob Beezer <beezer@ups.edu>
    # Date 1314041023 25200
    # Node ID 6fef0646d3851fd5a909cdaa492f480f917b794f
    # Parent  ca877a1fdc06f49f74e422f648ed5c05fea1a570
    11715: upgrade matrix set_row() and set_column() for better error handling / reporting.
    
    diff --git a/sage/matrix/matrix1.pyx b/sage/matrix/matrix1.pyx
    a b  
    18001800
    18011801
    18021802    def set_row(self, row, v):
    1803         """
    1804         Sets the entries of row ``row`` in self to be the entries of
    1805         ``v``.
     1803        r"""
     1804        Sets the entries of row ``row`` to the entries of ``v``.
     1805       
     1806        INPUT:
     1807       
     1808        - ``row`` - index of row to be set.
     1809       
     1810        - ``v`` - a list or vector of the new entries.
     1811       
     1812        OUTPUT:
     1813       
     1814        Changes the matrix in-place, so there is no output.
    18061815
    1807         EXAMPLES::
     1816        EXAMPLES:
     1817       
     1818        New entries may be contained in a vector.::
     1819       
     1820            sage: A = matrix(QQ, 5, range(25))
     1821            sage: u = vector(QQ, [0, -1, -2, -3, -4])
     1822            sage: A.set_row(2, u)
     1823            sage: A
     1824            [ 0  1  2  3  4]
     1825            [ 5  6  7  8  9]
     1826            [ 0 -1 -2 -3 -4]
     1827            [15 16 17 18 19]
     1828            [20 21 22 23 24]
    18081829
    1809             sage: A = matrix([[1,2],[3,4]]); A
     1830        New entries may be in any sort of list.::
     1831
     1832            sage: A = matrix([[1, 2], [3, 4]]); A
    18101833            [1 2]
    18111834            [3 4]
    1812             sage: A.set_row(0, [0,0]); A
     1835            sage: A.set_row(0, [0, 0]); A
    18131836            [0 0]
    18141837            [3 4]
    1815             sage: A.set_row(1, [0,0]); A
     1838            sage: A.set_row(1, (0, 0)); A
    18161839            [0 0]
    18171840            [0 0]
    1818             sage: A.set_row(2, [0,0]); A
     1841
     1842        TESTS::
     1843
     1844            sage: A = matrix([[1, 2], [3, 4]])
     1845            sage: A.set_row(2, [0, 0]); A
    18191846            Traceback (most recent call last):
    18201847            ...
    1821             IndexError: index out of range
     1848            ValueError: row number must be between 0 and 1 (inclusive), not 2
    18221849
    1823         ::
    1824 
    1825             sage: A.set_row(0, [0,0,0])
     1850            sage: A.set_row(0, [0, 0, 0])
    18261851            Traceback (most recent call last):
    18271852            ...
    1828             ValueError: v must be of length 2
     1853            ValueError: list of new entries must be of length 2 (not 3)
     1854
     1855            sage: A = matrix(2, [1, 2, 3, 4])
     1856            sage: A.set_row(0, [1/3, 1]); A
     1857            Traceback (most recent call last):
     1858            ...
     1859            TypeError: Cannot set row with Rational Field elements over Integer Ring, use change_ring first.
    18291860        """
    18301861        if len(v) != self._ncols:
    1831             raise ValueError, "v must be of length %s"%self._ncols
     1862            msg = "list of new entries must be of length {0} (not {1})"
     1863            raise ValueError(msg.format(self._ncols, len(v)))
     1864        if (row < 0) or (row >= self._nrows):
     1865            msg = "row number must be between 0 and {0} (inclusive), not {1}"
     1866            raise ValueError(msg.format(self._nrows-1, row))
    18321867
    1833         for j in range(self._ncols):
    1834             self[row,j] = v[j]
     1868        try:
     1869            for j in range(self._ncols):
     1870                self[row, j] = v[j]
     1871        except TypeError:
     1872            msg = "Cannot set row with {0} elements over {1}, use change_ring first."
     1873            raise TypeError(msg.format(v[j].parent(), self.base_ring()))
    18351874
    18361875    def set_column(self, col, v):
    1837         """
    1838         Sets the entries of column ``col`` in self to be the entries of
    1839         ``v``.
     1876        r"""
     1877        Sets the entries of column ``col`` to the entries of ``v``.
     1878       
     1879        INPUT:
     1880       
     1881        - ``col`` - index of column to be set.
     1882       
     1883        - ``v`` - a list or vector of the new entries.
     1884       
     1885        OUTPUT:
     1886       
     1887        Changes the matrix in-place, so there is no output.
    18401888
    1841         EXAMPLES::
     1889        EXAMPLES:
     1890       
     1891        New entries may be contained in a vector.::
     1892       
     1893            sage: A = matrix(QQ, 5, range(25))
     1894            sage: u = vector(QQ, [0, -1, -2, -3, -4])
     1895            sage: A.set_column(2, u)
     1896            sage: A
     1897            [ 0  1  0  3  4]
     1898            [ 5  6 -1  8  9]
     1899            [10 11 -2 13 14]
     1900            [15 16 -3 18 19]
     1901            [20 21 -4 23 24]
    18421902
    1843             sage: A = matrix([[1,2],[3,4]]); A
     1903        New entries may be in any sort of list.::
     1904
     1905            sage: A = matrix([[1, 2], [3, 4]]); A
    18441906            [1 2]
    18451907            [3 4]
    1846             sage: A.set_column(0, [0,0]); A
     1908            sage: A.set_column(0, [0, 0]); A
    18471909            [0 2]
    18481910            [0 4]
    1849             sage: A.set_column(1, [0,0]); A
     1911            sage: A.set_column(1, (0, 0)); A
    18501912            [0 0]
    18511913            [0 0]
    1852             sage: A.set_column(2, [0,0]); A
     1914
     1915        TESTS::
     1916
     1917            sage: A = matrix([[1, 2], [3, 4]])
     1918            sage: A.set_column(2, [0, 0]); A
    18531919            Traceback (most recent call last):
    18541920            ...
    1855             IndexError: index out of range
     1921            ValueError: column number must be between 0 and 1 (inclusive), not 2
    18561922
    1857         ::
    1858 
    1859             sage: A.set_column(0, [0,0,0])
     1923            sage: A.set_column(0, [0, 0, 0])
    18601924            Traceback (most recent call last):
    18611925            ...
    1862             ValueError: v must be of length 2
     1926            ValueError: list of new entries must be of length 2 (not 3)
     1927
     1928            sage: A = matrix(2, [1, 2, 3, 4])
     1929            sage: A.set_column(0, [1/4, 1]); A
     1930            Traceback (most recent call last):
     1931            ...
     1932            TypeError: Cannot set column with Rational Field elements over Integer Ring, use change_ring first.
    18631933        """
    18641934        if len(v) != self._nrows:
    1865             raise ValueError, "v must be of length %s"%self._nrows
     1935            msg = "list of new entries must be of length {0} (not {1})"
     1936            raise ValueError(msg.format(self._nrows, len(v)))
     1937        if (col < 0) or (col >= self._ncols):
     1938            msg = "column number must be between 0 and {0} (inclusive), not {1}"
     1939            raise ValueError(msg.format(self._ncols-1, col))
    18661940
    1867         for i in range(self._nrows):
    1868             self[i,col] = v[i]
     1941        try:
     1942            for i in range(self._nrows):
     1943                self[i, col] = v[i]
     1944        except TypeError:
     1945            msg = "Cannot set column with {0} elements over {1}, use change_ring first."
     1946            raise TypeError(msg.format(v[i].parent(), self.base_ring()))
    18691947
    18701948
    18711949    ####################################################################################