Rev 5010 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
- Check for DimNames propagation in coercion and other operations.- Report the problem in the Linux ldexp manual page. The second andthird calls in the Synopsis should be to ldexpf and ldexpl.- provide methods for "dspMatrix" and "dppMatrix"!- implement (more) methods for supporting "packed" (symmetric / triangular)matrices; particularly something like pack() and unpack() [to/from ourclasses from/to "numeric"] --- have already man/unpack.Rd but no method yet!(have some dtr* <-> dtp*)- combine the C functions for multiplication by special forms andsolution wrt special forms by using a 'right' argument and a'classed' argument.[done with dgeMatrix_matrix_mm(); not yet for other classes;and for _crossprod()]------ "Math2" , "Math", "Arith":keep triangular and symmetric Matrices when appropriate:particularly desirable for "Math2": round(), signif()For triangular matrices, more specifically make sure the four rules of"triangular matrix algebra" (Golub+Van Loan 1996, 3.1.8, p.93) arefulfilled; now(2008-03-06) ok for Csparse; not yet for <dtr> %*% <dtr>- "d" <-> "l" coercion for all "[TCR]" sparse matrices is really trivial:"d" -> "l" : drops the 'x' slot"l" -> "d" : construct an 'x' slot of all '1'We currently have many of these conversions explicitly, e.g.setAs("dsTMatrix", "lsTMatrix",function(from) new("lsTMatrix", i = from@i, j = from@j, uplo = from@uplo,Dim = from@Dim, Dimnames = from@Dimnames))but I would rather want to automatically construct all these coercionmethods at once by a ``method constructor'', i.e.,for all "dsparse*" -> "lsparse*" and vice versa.How can one do this {in a documented way} ?- Think of constructing setAs(...) calls automatically in order tobasically enable all ``sensible'' as(fromMatrix, toMatrix) calls,possibly using canCoerce(.)- setAs(<Mcl>, "[dln]Matrix") for <Mcl> in {Matrix or denseMatrix + sparseMatrix}- When we have a packed matrix, it's a waste to go through "full" to "sparse":==> implementsetAs("dspMatrix", "sparseMatrix")setAs("dppMatrix", "sparseMatrix")setAs("dtpMatrix", "sparseMatrix")and the same for "lsp" , "ltp" and "nsp" , "ntp" !- tcrossprod(x, y) : do provide methods for y != NULLcalling Lapack's DGEMM for "dense"[2005-12-xx: done for dgeMatrix at least]- BUGlet: Shouldn't lose factorization here:h6 <- Hilbert(6); chol(h6) ; str(h6) # has factorstr(H6 <- as(h6, "dspMatrix")) # has lost factor## and the same in a similar situation involving "dpo", "dpp"- Factorizations: LU done; also Schur() for *sparse* Matrices.- is.na() method for all our matrices [ ==> which(*, arr.ind=TRUE) might work ]- use .Call(Csparse_drop, M, tol) in more places,both with 'tol = 0.' to drop "values that happen to be 0" and forzapsmall() methods for Csparse*- implement .Call(Csparse_scale, ....) interfacing to cholmod_scale()in src/CHOLMOD/Include/cholmod_matrixops.h : for another functionspecifically for multiplying a cholmod_sparse object by a diagonal matrix.Use it in %*% and [t]crossprod methods.- chol() and determinant() should ``work'': proper result or "good" errormessage.- make sure *all* group methods have (maybe "bail-out") setMethod for "Matrix".e.g. zapsmall(<pMatrix>) fails "badly"- sum(): implement methods which work for *all* our matrices.- Implement expand(.) for the Cholesky() results"dCHMsimpl" and "dCHMsuper" -- currently have no *decent* way to get atthe matrix factors of the corresponding matrix factorization !!- rbind2(<sparse>, <dense>) does not work (e.g. <dgC>, <dge>)- <sparse> %*% <dense> {also in crossprod/tcrossprod} currently alwaysreturns <dense>, since --> Csparse_dense_prod --> cholmod_sdmultand that does only return dense.When the sparse matrix is very sparse, i.e. has many rows with only zeroentries, it would make much sense to return sparse.- sparse-symmetric + diagonal should stay sparse-symmetric(only stays sparse): Matrix(0, 4, 4) + Diagonal(4, 1:4)--> R/diagMatrix.R ('FIXME')but also R/Ops.R to ensure sp-sym. + sp-sym. |-> sp-sym. etc- Diagonal(n) %*% A --- too slow!! --> ~/R/MM/Pkg-ex/Matrix/diag-Tamas-ex.R- ! <symmetricMatrix> loses symmetry, both for dense and sparse matrices.!M where M is "sparseMatrix", currently always gives dense. This onlymakes sense when M is ``really sparse''.- msy <- as(matrix(c(2:1,1:2),2), "dsyMatrix"); str(msy)shows that the Cholesky factorization is computed ``too quickly''.Can be a big pain for largish matrices, when it is unneeded.- example(Cholesky, echo=FALSE) ; cm <- chol(mtm); str(cm); str(mtm)shows that chol() does not seems to make use of an alreadypresent factorization and rather uses one with more '0' in x slot.- diag(m) <- val currently automatically works via m[cbind(i,i)] <- valThis (`[<-` method) is now "smart" for diagonalMatrix, but needs also tobe for triangularMatrix, and probably also "dense*general*Matrix" since theabove currently goes via "matrix" and back instead of using the 'x' slotdirectly; in particular, the triangular* "class property" is lost!- image(M, ..): Think about an optional smart option which keeps"0 |-> transparent" and allows colors to differentiate negative andpositive entries.- examples for solve( Cholesky(.), b, system = c("A", "LDLt"....))probably rather in man/CHMfactor-class.Rd than man/Cholesky.Rd- LDL(<CHMsimpl>) looks relatively easy; via "tCsparse_diag()"{diagonal entries of *triangular* Csparse}--> see comment in determinant(<dsC>) in R/dsCMatrix.R, will givefaster determinant- tr(A %*% B) {and even tr(A %*% B %*% C) ...} are also neededfrequently in some computations {conditional normal distr. ...}.Since this can be done faster than bysum(diag(A %*% B)) even for traditional matrices, e.g.sum(A * t(B)) or {even faster for "full" mat}crossprod(as.vector(A), as.vector(B))and even more so for, e.g. <sparse> %*% <dense>{used in Soeren's 'gR' computations},we should also provide a generic and methods.- qr.R(qr(x)) may differ for the "same" matrix, depending on it beingsparse or dense:"qr.R(<sparse>) may differ from qr.R(<dense>) because of permutations"This is not really acceptable and currently influences rcond() as well.- eigen() should become generic, and get a method at least for diagonal,but also for symmetric -> dsyMatrix [LAPACK dsyev() uses UPLO !],but also simply for dgeMatrix (without going via tradition matrices).What about Sparse? There's fill-in, but it may still be sensible, e.g.mlist <- list(1, 2:3, diag(x=5:3), 27, cbind(1,3:6), 100:101)ee <- eigen(tcrossprod(bdiag(lapply(mlist, as.matrix))))Matrix( signif(ee$vectors, 3) )- facmul() has no single method defined; it looks like a good idea though(instead of the infamous qr.qy, qr.qty,.... functions)- symmpart() and skewpart() for *sparse* matrices still use (x +/- t(x))/2and could be made more efficient.Consider going via asTuniq() or something very close to.Arith.Csparse() in R/Ops.R- many setAs(*, "[dl]..Matrix") are still needed, as long as e.g.replCmat() uses as_CspClass() and drop0(.) which itself callas_CspClass() quite a bit. --> try to replace these byas(*, "CsparseMatrix"); forceSymmetric, etc.- implement fast diag(<triangularCsparse>) via calling newsrc/Csparse.c's diag_tC_ptr()- add examples (and tests!) for update(<CHMfactor>, ..) andCholesky(......, Imult), also tests for hidden {hence no examples}ldetL2up() { R/CHMfactor.R }- data(CAex); determinant(CAex) -- says"Ask the package authors to implement the missing feature."- chol(<nsCMatrix>) gives "temporarily disabled"but should give the *symbolic* factorization;similarly Cholesky(.) is not enabled