The R Project SVN R-packages

Rev

Rev 4953 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4095 maechler 1
#### Methods for the virtual class 'triangularMatrix' of triangular matrices
2
#### Note that specific methods are in (8 different) ./?t?Matrix.R
3
 
4953 maechler 4
setAs("triangularMatrix", "symmetricMatrix",
5
      function(from) as(as(from, "generalMatrix"), "symmetricMatrix"))
6
 
4095 maechler 7
.tril.tr <- function(x, k = 0, ...) {  # are always square
8
    k <- as.integer(k[1])
9
    dd <- dim(x)
10
    stopifnot(-dd[1] <= k, k <= dd[1])  # had k <= 0
11
    if(k <= 0 && x@uplo == "L")
12
        x
4953 maechler 13
    else { ## more to do
4984 maechler 14
        if(x@diag == "U") x <- .diagU2N(x, class(x), checkDense = TRUE)
4095 maechler 15
        callNextMethod()
4953 maechler 16
    }
4095 maechler 17
}
18
 
19
.triu.tr <- function(x, k = 0, ...) {  # are always square
20
    k <- as.integer(k[1])
21
    dd <- dim(x)
22
    stopifnot(-dd[1] <= k, k <= dd[1])  # had k >= 0
23
    if(k >= 0 && x@uplo == "U")
24
        x
4953 maechler 25
    else { ## more to do
4984 maechler 26
        if(x@diag == "U") x <- .diagU2N(x, class(x), checkDense = TRUE)
4095 maechler 27
        callNextMethod()
4953 maechler 28
    }
4095 maechler 29
}
30
 
31
## In order to evade method dispatch ambiguity (with [CTR]sparse* and ddense*),
32
## but still remain "general"
4984 maechler 33
## we use this hack instead of signature  x = "triangularMatrix" :
4095 maechler 34
 
4953 maechler 35
trCls <- names(getClass("triangularMatrix")@subclasses)
36
trCls. <- trCls[grep(".t.Matrix", trCls)]  # not "*Cholesky", "*Kaufman" ..
37
for(cls in trCls.) {
38
    setMethod("tril", cls, .tril.tr)
39
    setMethod("triu", cls, .triu.tr)
40
}
4095 maechler 41
 
4953 maechler 42
## ditto here:
4095 maechler 43
 
4953 maechler 44
for(cls in trCls)
45
    setMethod("isTriangular", signature(object = cls),
46
              function(object, ...) TRUE)
47
## instead of just for ....   signature(object = "triangularMatrix")
48
 
49
rm(trCls)
50