Matrix (version 1.2-7.1)

uniqTsparse: Unique TsparseMatrix Representations

Description

Detect or “unify” non-unique TsparseMatrix matrices.

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.

uniqTsparseT(x) replaces duplicated index pairs $(i,j)$ and their corresponding x slot entries by the triple $(i,j, sx)$ where sx = sum(x []), 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

Run this code
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

## 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)

Run the code above in your browser using DataLab