Ticket #5345: trac-5345-transpose-matrix-dense.patch

File trac-5345-transpose-matrix-dense.patch, 2.6 KB (added by ylchapuy, 13 years ago)
  • sage/matrix/matrix_dense.pyx

    # HG changeset patch
    # User Yann Laigle-Chapuy <yannlaiglechapuy@gmail.com>
    # Date 1235508820 -3600
    # Node ID 3261eb3e8ee23b9bd35e26021a3f5656ae7a8b90
    # Parent  05d19caf606f595a943b624b985424424bfce294
    optimize transpose for dense matrix
    
    diff -r 05d19caf606f -r 3261eb3e8ee2 sage/matrix/matrix_dense.pyx
    a b  
    176176            [---]
    177177            [2 4]
    178178        """
    179         f = []
    180         e = self.list()
    181179        (nc, nr) = (self.ncols(), self.nrows())
    182         for j in xrange(nc):       
    183             for i in xrange(nr):
    184                 f.append(e[i*nc + j])
     180        cdef Matrix_dense trans
    185181        trans = self.new_matrix(nrows = nc, ncols = nr,
    186                                 entries = f, copy=False,
    187                                 coerce=False)
     182                                copy=False, coerce=False)
     183
     184        cdef Py_ssize_t i, j
     185        for j from 0<= j < nc:
     186            for i from 0<= i < nr:
     187                trans.set_unsafe(j,i,self.get_unsafe(i,j))
     188
    188189        if self.subdivisions is not None:
    189190            row_divs, col_divs = self.get_subdivisions()
    190191            trans.subdivide(col_divs, row_divs)
    191192        return trans
    192    
    193193
    194194    def antitranspose(self):
    195195        """
     
    214214            [4|1]
    215215            [3|0]
    216216        """
    217         f = []
    218         e = self.list()
    219217        (nc, nr) = (self.ncols(), self.nrows())
    220         for j in reversed(xrange(nc)):
    221             for i in reversed(xrange(nr)):
    222                 f.append(e[i*nc + j])
    223         trans = self.new_matrix(nrows = nc, ncols = nr,
    224                                 entries = f, copy=False, coerce=False)
     218        cdef Matrix_dense atrans
     219        atrans = self.new_matrix(nrows = nc, ncols = nr,
     220                                 copy=False, coerce=False)
     221        cdef Py_ssize_t i,j
     222        cdef Py_ssize_t ri,rj # reversed i and j
     223        rj = nc
     224        for j from 0 <= j < nc:
     225            ri = nr
     226            rj = rj-1
     227            for i from 0 <= i < nr:
     228                ri = ri-1
     229                atrans.set_unsafe(j , i, self.get_unsafe(ri,rj))
     230
    225231        if self.subdivisions is not None:
    226232            row_divs, col_divs = self.get_subdivisions()
    227             trans.subdivide(list(reversed([nc - t for t in col_divs])),
    228                             list(reversed([nr - t for t in row_divs])))
    229         return trans
     233            atrans.subdivide([nc - t for t in reversed(col_divs)],
     234                             [nr - t for t in reversed(row_divs)])
     235        return atrans
    230236
    231237    def apply_morphism(self, phi):
    232238        """