Ticket #10628: 10628-stacked-matrix-creation.patch

File 10628-stacked-matrix-creation.patch, 4.0 KB (added by SimonKing, 11 years ago)

Allow mixed lists of lists/vectors/matrices in matrix creation

  • sage/matrix/matrix_space.py

    # HG changeset patch
    # User Simon King <simon.king@uni-jena.de>
    # Date 1311868828 -7200
    # Node ID 9515746f6375343bb7484170e44fc94ae285ae2a
    # Parent  f3a5230ecf13342bfa08f1d2a9669fc7e66c8a78
    #10628: Allow mixed lists of lists/vectors/matrices in matrix creation.
    
    diff --git a/sage/matrix/matrix_space.py b/sage/matrix/matrix_space.py
    a b  
    12381238         
    12391239          * a list of lists with each inner list being either a row or a column
    12401240            of the new matrix.
     1241
     1242          * a list of vectors or matrices
    12411243           
    12421244        - ``coerce`` -- (default: ``True``) whether to coerce ``x`` into self;
    12431245       
     
    12971299            [1 0]
    12981300            [0 0]
    12991301            [1 0]
     1302
     1303        Trac ticket #10628 enables to provide the data be lists of matrices::
     1304
     1305            sage: MS = MatrixSpace(ZZ,4,2)
     1306            sage: MS0 = MatrixSpace(ZZ,2)
     1307            sage: MS.matrix([MS0([1,2,3,4]), MS0([5,6,7,8])])
     1308            [1 2]
     1309            [3 4]
     1310            [5 6]
     1311            [7 8]
     1312
     1313        A mixed list of matrices and vectors is allowed as well::
     1314
     1315            sage: MS.matrix( [MS0([1,2,3,4])] + list(MS0([5,6,7,8])) )
     1316            [1 2]
     1317            [3 4]
     1318            [5 6]
     1319            [7 8]
     1320
     1321
     1322        TESTS:
     1323
     1324        The following corner cases were problematic while working on #10628::
     1325
     1326            sage: MS = MatrixSpace(ZZ,2,1)
     1327            sage: MS([[1],[2]])
     1328            [1]
     1329            [2]
     1330            sage: MS = MatrixSpace(CC,2,1)
     1331            sage: F = NumberField(x^2+1, name='x')
     1332            sage: MS([F(1),F(0)])
     1333            [1.00000000000000]
     1334            [               0]
     1335
    13001336        """
    13011337        if isinstance(x, (types.GeneratorType, xrange)):
    13021338            x = list(x)
     
    13141350                else:
    13151351                    raise ValueError("a matrix from %s cannot be converted to "
    13161352                                     "a matrix in %s!" % (x.parent(), self))
    1317         if isinstance(x, list) and len(x) > 0:
    1318             if isinstance(x[0], (list,tuple)) or hasattr(x[0], "is_vector"):# TODO: is this the best way to test is_vector?
    1319                 e = []
    1320                 for v in x:
    1321                     e.extend(v)
    1322                 x = e
    13231353
    1324 
    1325             if not rows:
    1326                 new_x = []
    1327                 for k in range(len(x)):
    1328                     i = k % self.__ncols
    1329                     j = k // self.__ncols
    1330                     new_x.append( x[ i*self.__nrows + j ] )
    1331                 x = new_x
    1332            
     1354        if isinstance(x, (list, tuple)):
     1355            lenx = len(x)
     1356            if lenx > 0:
     1357                if (self.__ncols == 1 or lenx < self.__ncols*self.__nrows):
     1358                    # If the list has less than the expected length, then
     1359                    # we are likely to have a list of lists or matrices or vectors.
     1360                    # Hence, we expand the entries of x.
     1361                    e = []
     1362                    for v in x:
     1363                        if isinstance(v,(list, tuple)):
     1364                            e.extend(v)
     1365                        elif hasattr(v,'row'):
     1366                            try:
     1367                                e.extend(v.list())
     1368                            except AttributeError:
     1369                                pass
     1370                        else:
     1371                            e.append(v)
     1372                    x = e
     1373                    # x is a new list, hence, copy=False is OK
     1374                    copy = False
     1375                # Now, x presumably is a list of ring elements.
     1376                if not rows:
     1377                    new_x = []
     1378                    for k in xrange(len(x)):
     1379                        i = k % self.__ncols
     1380                        j = k // self.__ncols
     1381                        new_x.append( x[ i*self.__nrows + j ] )
     1382                    x = new_x
     1383                    copy = False
    13331384        return self.__matrix_class(self, entries=x, copy=copy, coerce=coerce)
    13341385     
    13351386    def matrix_space(self, nrows=None, ncols=None, sparse=False):