Ticket #8276: trac_8276-fix_zero_matrix_creation-fh.patch

File trac_8276-fix_zero_matrix_creation-fh.patch, 3.7 KB (added by hivert, 11 years ago)
  • sage/matrix/matrix_double_dense.pyx

    # HG changeset patch
    # User Florent Hivert <Florent.Hivert@univ-rouen.fr>
    # Date 1266659574 -3600
    # Node ID f44b7356a44d6df371dfa0725e3fc320557e159a
    # Parent  360d66ecfed64153f7a9e293ed7d89bce2239d4a
    8276: Optimized the creation of zero matrix and overloaded zero method.
    The later was provided by the abelian monoid category as mutable.
    
    diff --git a/sage/matrix/matrix_double_dense.pyx b/sage/matrix/matrix_double_dense.pyx
    a b cdef class Matrix_double_dense(matrix_de 
    504504            sage: b[0,0] = 3
    505505            sage: a[0,0] # note that a hasn't changed
    506506            1.0
     507
     508         TESTS::
     509
     510            sage: copy(MatrixSpace(RDF,0,0,sparse=False).zero_matrix())
     511            []
    507512        """
    508513        if self._nrows == 0 or self._ncols == 0:
    509             return self.new_matrix(self._nrows, self._ncols)
     514            # Create a brand new empy matrix. This is needed to prevent a
     515            # recursive loop: a copy of zero_matrix is asked otherwise.
     516            return self.__class__(self.parent(), [], self._nrows, self._ncols)
    510517
    511518        cdef Matrix_double_dense A
    512519        A = self._new(self._nrows, self._ncols)
  • sage/matrix/matrix_space.py

    diff --git a/sage/matrix/matrix_space.py b/sage/matrix/matrix_space.py
    a b class MatrixSpace_generic(parent_gens.Pa 
    342342            sage: MS(g)
    343343            [1 1]
    344344            [0 1]
     345
     346        TESTS::
     347
     348            sage: MS = MatrixSpace(ZZ,2,2, sparse=True)
     349            sage: mat = MS(); mat
     350            [0 0]
     351            [0 0]
     352            sage: mat.is_mutable()
     353            True
     354            sage: mat2 = mat.change_ring(QQ); mat2.is_mutable()
     355            True
    345356        """
    346         if entries is None:
    347             entries = 0
    348 
    349         if entries == 0 and hasattr(self, '__zero_matrix'):
    350             if copy:
     357        if entries is None or entries == 0:
     358            if self.__is_sparse: # faster to create a new one than copy.
     359                return self.__matrix_class(self, {}, coerce=coerce, copy=copy)
     360            else:
    351361                return copy_module.copy(self.zero_matrix())
    352             else:
    353                 return self.zero_matrix()
    354362
    355363        if isinstance(entries, (list, tuple)) and len(entries) > 0 and \
    356364           sage.modules.free_module_element.is_FreeModuleElement(entries[0]):
    class MatrixSpace_generic(parent_gens.Pa 
    10281036        z[r,c] = 1
    10291037        return z
    10301038
     1039    @cached_method
    10311040    def zero_matrix(self):
    10321041        """
    10331042        Returns the zero matrix in ``self``.
    class MatrixSpace_generic(parent_gens.Pa 
    10371046
    10381047        EXAMPLES::
    10391048
    1040             sage: MatrixSpace(GF(7),2,4).zero_matrix()
     1049            sage: z = MatrixSpace(GF(7),2,4).zero_matrix(); z
    10411050            [0 0 0 0]
    10421051            [0 0 0 0]
     1052            sage: z.is_mutable()
     1053            False
    10431054
    10441055        TESTS::
    10451056
     1057            sage: MM = MatrixSpace(RDF,1,1,sparse=False); mat = MM.zero_matrix()
     1058            sage: copy(mat)
     1059            [0.0]
    10461060            sage: MM = MatrixSpace(RDF,0,0,sparse=False); mat = MM.zero_matrix()
    10471061            sage: copy(mat)
    10481062            []
     1063            sage: mat.is_mutable()
     1064            False
     1065            sage: MM.zero().is_mutable()
     1066            False
    10491067        """
    1050         try:
    1051             z = self.__zero_matrix
    1052         except AttributeError:
    1053             z = self(0)
    1054             z.set_immutable()
    1055             self.__zero_matrix = z
    1056         return z
    1057    
     1068        res = self.__matrix_class(self, 0, coerce=False, copy=False)
     1069        res.set_immutable()
     1070        return res
     1071
     1072    zero = zero_matrix
     1073
    10581074    def ngens(self):
    10591075        """
    10601076        Return the number of generators of this matrix space, which is the