isSymmetric-methods.Rd
isSymmetric
tests whether its argument is a symmetric square
matrix, by default tolerating some numerical fuzz and requiring
symmetric [dD]imnames
in addition to symmetry in the
mathematical sense. isSymmetric
is a generic function in
base, which has a method for traditional
matrices of implicit class
"matrix"
.
Methods are defined here for various proper and virtual classes
in Matrix, so that isSymmetric
works for all objects
inheriting from virtual class "Matrix"
.
# S4 method for class 'denseMatrix'
isSymmetric(object, checkDN = TRUE, ...)
# S4 method for class 'CsparseMatrix'
isSymmetric(object, checkDN = TRUE, ...)
# S4 method for class 'RsparseMatrix'
isSymmetric(object, checkDN = TRUE, ...)
# S4 method for class 'TsparseMatrix'
isSymmetric(object, checkDN = TRUE, ...)
# S4 method for class 'diagonalMatrix'
isSymmetric(object, checkDN = TRUE, ...)
# S4 method for class 'indMatrix'
isSymmetric(object, checkDN = TRUE, ...)
# S4 method for class 'dgeMatrix'
isSymmetric(object, checkDN = TRUE, tol = 100 * .Machine$double.eps, tol1 = 8 * tol, ...)
# S4 method for class 'dgCMatrix'
isSymmetric(object, checkDN = TRUE, tol = 100 * .Machine$double.eps, ...)
a "Matrix"
.
a logical indicating whether symmetry of the
Dimnames
slot of object
should be checked.
numerical tolerances allowing approximate
symmetry of numeric (rather than logical) matrices. See also
isSymmetric.matrix
.
further arguments passed to methods
(typically methods for all.equal
).
The Dimnames
slot of object
, say dn
,
is considered to be symmetric if and only if
dn[[1]]
and dn[[2]]
are identical or
one is NULL
; and
ndn <- names(dn)
is NULL
or
ndn[1]
and ndn[2]
are identical or
one is the empty string ""
.
Hence list(a=nms, a=nms)
is considered to be symmetric,
and so too are list(a=nms, NULL)
and list(NULL, a=nms)
.
Note that this definition is looser than that employed by
isSymmetric.matrix
, which requires dn[1]
and
dn[2]
to be identical, where dn
is the dimnames
attribute of a traditional matrix.
forceSymmetric
;
symmpart
and skewpart
;
virtual class "symmetricMatrix"
and its subclasses.
isSymmetric(Diagonal(4)) # TRUE of course
#> [1] TRUE
M <- Matrix(c(1,2,2,1), 2,2)
isSymmetric(M) # TRUE (*and* of formal class "dsyMatrix")
#> [1] TRUE
isSymmetric(as(M, "generalMatrix")) # still symmetric, even if not "formally"
#> [1] TRUE
isSymmetric(triu(M)) # FALSE
#> [1] FALSE
## Look at implementations:
showMethods("isSymmetric", includeDefs = TRUE) # includes S3 generic from base
#> Function: isSymmetric (package base)
#> object="ANY"
#> function (object, ...)
#> UseMethod("isSymmetric")
#>
#>
#> object="CsparseMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> .Call(R_sparse_is_symmetric, object, checkDN)
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="RsparseMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> .Call(R_sparse_is_symmetric, object, checkDN)
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="TsparseMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> .Call(R_sparse_is_symmetric, object, checkDN)
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="denseMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> .Call(R_dense_is_symmetric, object, checkDN)
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="dgCMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, tol = 100 * .Machine$double.eps,
#> ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> if (tol <= 0)
#> return(.Call(R_sparse_is_symmetric, object, checkDN))
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> if (n == 0L)
#> return(TRUE)
#> Cj <- if (is.complex(object@x))
#> Conj
#> else identity
#> ae <- function(check.attributes, ...) {
#> all.equal(..., check.attributes = FALSE)
#> }
#> isTRUE(ae(target = .M2V(object), current = .M2V(Cj(t(object))),
#> tolerance = tol, ...))
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="dgRMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, tol = 100 * .Machine$double.eps,
#> ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> if (tol <= 0)
#> return(.Call(R_sparse_is_symmetric, object, checkDN))
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> if (n == 0L)
#> return(TRUE)
#> Cj <- if (is.complex(object@x))
#> Conj
#> else identity
#> ae <- function(check.attributes, ...) {
#> all.equal(..., check.attributes = FALSE)
#> }
#> isTRUE(ae(target = .M2V(object), current = .M2V(Cj(t(object))),
#> tolerance = tol, ...))
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="dgTMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, tol = 100 * .Machine$double.eps,
#> ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> if (tol <= 0)
#> return(.Call(R_sparse_is_symmetric, object, checkDN))
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> if (n == 0L)
#> return(TRUE)
#> Cj <- if (is.complex(object@x))
#> Conj
#> else identity
#> ae <- function(check.attributes, ...) {
#> all.equal(..., check.attributes = FALSE)
#> }
#> isTRUE(ae(target = .M2V(object), current = .M2V(Cj(t(object))),
#> tolerance = tol, ...))
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="dgeMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, tol = 100 * .Machine$double.eps,
#> tol1 = 8 * tol, ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> if (tol <= 0)
#> return(.Call(R_dense_is_symmetric, object, checkDN))
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> if (n == 0L)
#> return(TRUE)
#> object <- .M2gen(object)
#> Cj <- if (is.complex(object@x))
#> Conj
#> else identity
#> ae <- function(check.attributes, ...) {
#> all.equal.numeric(..., check.attributes = FALSE)
#> }
#> if (length(tol1)) {
#> i. <- if (n <= 4L)
#> 1L:n
#> else c(1L, 2L, n - 1L, n)
#> for (i in i.) if (!isTRUE(ae(target = object[i, ],
#> current = Cj(object[, i]), tolerance = tol1,
#> ...)))
#> return(FALSE)
#> }
#> isTRUE(ae(target = object@x, current = Cj(t(object))@x,
#> tolerance = tol, ...))
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="diagonalMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> if (ca(...) && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> }
#> .M.kind(object) != "z" || object@diag != "N" || {
#> x <- object@x
#> isTRUE(all.equal.numeric(x, Conj(x), ...))
#> }
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="dtCMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, tol = 100 * .Machine$double.eps,
#> ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> if (tol <= 0)
#> return(.Call(R_sparse_is_symmetric, object, checkDN))
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> if (n == 0L)
#> return(TRUE)
#> Cj <- if (is.complex(object@x))
#> Conj
#> else identity
#> ae <- function(check.attributes, ...) {
#> all.equal(..., check.attributes = FALSE)
#> }
#> isTRUE(ae(target = .M2V(object), current = .M2V(Cj(t(object))),
#> tolerance = tol, ...))
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="dtRMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, tol = 100 * .Machine$double.eps,
#> ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> if (tol <= 0)
#> return(.Call(R_sparse_is_symmetric, object, checkDN))
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> if (n == 0L)
#> return(TRUE)
#> Cj <- if (is.complex(object@x))
#> Conj
#> else identity
#> ae <- function(check.attributes, ...) {
#> all.equal(..., check.attributes = FALSE)
#> }
#> isTRUE(ae(target = .M2V(object), current = .M2V(Cj(t(object))),
#> tolerance = tol, ...))
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="dtTMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, tol = 100 * .Machine$double.eps,
#> ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> if (tol <= 0)
#> return(.Call(R_sparse_is_symmetric, object, checkDN))
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> if (n == 0L)
#> return(TRUE)
#> Cj <- if (is.complex(object@x))
#> Conj
#> else identity
#> ae <- function(check.attributes, ...) {
#> all.equal(..., check.attributes = FALSE)
#> }
#> isTRUE(ae(target = .M2V(object), current = .M2V(Cj(t(object))),
#> tolerance = tol, ...))
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="dtpMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, tol = 100 * .Machine$double.eps,
#> tol1 = 8 * tol, ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> if (tol <= 0)
#> return(.Call(R_dense_is_symmetric, object, checkDN))
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> if (n == 0L)
#> return(TRUE)
#> object <- .M2gen(object)
#> Cj <- if (is.complex(object@x))
#> Conj
#> else identity
#> ae <- function(check.attributes, ...) {
#> all.equal.numeric(..., check.attributes = FALSE)
#> }
#> if (length(tol1)) {
#> i. <- if (n <= 4L)
#> 1L:n
#> else c(1L, 2L, n - 1L, n)
#> for (i in i.) if (!isTRUE(ae(target = object[i, ],
#> current = Cj(object[, i]), tolerance = tol1,
#> ...)))
#> return(FALSE)
#> }
#> isTRUE(ae(target = object@x, current = Cj(t(object))@x,
#> tolerance = tol, ...))
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="dtrMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, tol = 100 * .Machine$double.eps,
#> tol1 = 8 * tol, ...)
#> {
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> checkDN <- ca(...)
#> }
#> if (tol <= 0)
#> return(.Call(R_dense_is_symmetric, object, checkDN))
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> if (n == 0L)
#> return(TRUE)
#> object <- .M2gen(object)
#> Cj <- if (is.complex(object@x))
#> Conj
#> else identity
#> ae <- function(check.attributes, ...) {
#> all.equal.numeric(..., check.attributes = FALSE)
#> }
#> if (length(tol1)) {
#> i. <- if (n <= 4L)
#> 1L:n
#> else c(1L, 2L, n - 1L, n)
#> for (i in i.) if (!isTRUE(ae(target = object[i, ],
#> current = Cj(object[, i]), tolerance = tol1,
#> ...)))
#> return(FALSE)
#> }
#> isTRUE(ae(target = object@x, current = Cj(t(object))@x,
#> tolerance = tol, ...))
#> }
#> .local(object, ...)
#> }
#>
#>
#> object="indMatrix"
#> function (object, ...)
#> {
#> .local <- function (object, checkDN = TRUE, ...)
#> {
#> d <- object@Dim
#> if ((n <- d[2L]) != d[1L])
#> return(FALSE)
#> if (checkDN) {
#> ca <- function(check.attributes = TRUE, ...) check.attributes
#> if (ca(...) && !isSymmetricDN(object@Dimnames))
#> return(FALSE)
#> }
#> perm <- object@perm
#> all(perm[perm] == seq_len(n))
#> }
#> .local(object, ...)
#> }
#>
#>
#>