R: Unique (Sorted) TsparseMatrix Representations

uniqTsparse {Matrix} | R Documentation

## Unique (Sorted) TsparseMatrix Representations

### Description

Detect or “unify” (or “standardize”) non-unique `TsparseMatrix` matrices, prducing unique (i,j,x) triplets which are sorted, first in j, then in i (in the sense of `order(j,i)`).

Note that `new(.)`, `spMatrix` or `sparseMatrix` constructors for `"dgTMatrix"` (and other `"TsparseMatrix"` classes) implicitly add x_k's that belong to identical (i_k, j_k) pairs.

`anyDuplicatedT()` reports the index of the first duplicated pair, or `0` if there is none.

`uniqTsparse(x)` replaces duplicated index pairs (i,j) and their corresponding `x` slot entries by the triple (i,j, sx) where `sx = sum(x [<all pairs matching (i,j)>])`, and for logical `x`, addition is replaced by logical or.

### Usage

    uniqTsparse(x, class.x = c(class(x)))
    anyDuplicatedT(x, di = dim(x))

### Arguments

`x` | a sparse matrix stored in triplet form, i.e., inheriting from class `TsparseMatrix`.
`class.x` | optional character string specifying `class(x)`.
`di` | the matrix dimension of `x`, `dim(x)`.

### Value

`uniqTsparse(x)` returns a `TsparseMatrix` “like x”, of the same class and with the same elements, just internally possibly changed to “unique” (i,j,x) triplets in sorted order.

`anyDuplicatedT(x)` returns an `integer` as `anyDuplicated`, the index of the first duplicated entry (from the (i,j) pairs) if there is one, and `0` otherwise.

### See Also

`TsparseMatrix`, for uniqueness, notably `dgTMatrix`.

### Examples

    example("dgTMatrix-class", echo=FALSE)
    ## -> 'T2'  with (i,j,x) slots of length 5 each
    T2u <- uniqTsparse(T2)
    stopifnot(## They "are" the same (and print the same):
              all.equal(T2, T2u, tol=0),
              ## but not internally:
              anyDuplicatedT(T2)  == 2,
              anyDuplicatedT(T2u) == 0,
              length(T2 @x) == 5,
              length(T2u@x) == 3)

    ## is 'x' a "uniq Tsparse" Matrix ?  [requires x to be TsparseMatrix!]
    non_uniqT <- function(x, di = dim(x))
      is.unsorted(x@j) || anyDuplicatedT(x, di)
    non_uniqT(T2 ) # TRUE
    non_uniqT(T2u) # FALSE

    T3 <- T2u
    T3[1, c(1,3)] <- 10; T3[2, c(1,5)] <- 20
    T3u <- uniqTsparse(T3)
    str(T3u) # sorted in 'j', and within j, sorted in i
    stopifnot(!non_uniqT(T3u))

    ## Logical l.TMatrix and n.TMatrix :
    (L2 <- T2 > 0)
    validObject(L2u <- uniqTsparse(L2))
    (N2 <- as(L2, "nMatrix"))
    validObject(N2u <- uniqTsparse(N2))
    stopifnot(N2u@i == L2u@i, L2u@i == T2u@i,  N2@i == L2@i, L2@i == T2@i,
              N2u@j == L2u@j, L2u@j == T2u@j,  N2@j == L2@j, L2@j == T2@j)
    # now with a nasty NA  [partly failed in Matrix 1.1-5]:
    L2.N <- L2; L2.N@x[2] <- NA; L2.N
    validObject(L2.N)
    (m2N <- as.matrix(L2.N)) # looks "ok"
    iL <- as.integer(m2N)
    stopifnot(identical(10L, which(is.na(match(iL, 0:1)))))
    symnum(m2N)

[Package Matrix version 1.4-1 Index]