# Returns whether the given matrix is diagonal is_diagonal <- function(mat) { if (!is.matrix(mat)) { stop("Not a matrix") } for (i in 1:nrow(mat)) { for (j in 1:ncol(mat)) { if (i != j && mat[i,j] != 0) return(FALSE) } } return(TRUE) } is_diagonal2 <- function(mat) { if (!is.matrix(mat)) { stop("Not a matrix") } all(mat * diag(nrow(mat)) == mat) } is_diagonal3 <- function(mat) { if (!is.matrix(mat)) { stop("Not a matrix") } all(mat[!diag(nrow(mat))] == 0) } # Matrix summary # Inputs: matrix mat # Outputs: Basic properties od the matrix # E.g. Square? Diagonal? Symmetric? Rank, dimensions, # eigenvalues, inverse, Singular?, determinant matrix_summary <- function(mat) { output <- list() output$matrix <- mat output$dimensions <- dim(mat) library(Matrix) output$rank <- rankMatrix(mat) output$is_square <- diff(dim(mat)) == 0 if (output$is_square) { output$is_singular <- !(output$rank == dim(mat)[1]) if (!output$is_singular) { output$inverse <- solve(mat) } output$determinant <- det(mat) output$eigenvalues <- eigen(mat)$values output$is_symmetric <- all(mat == t(mat)) output$is_diagonal <- is_diagonal2(mat) } class(output) <- "matrixSummary" return(output) } summary.matrix <- matrix_summary # Prints out matrix description # E.g. "m by n matrix of rank r" # "n by n square, symmetric, nonsingular matrix of rank n" # "n by n square, singular matrix of rank 7" print_matrix_summary <- function(mat) { library(glue) mat_summary <- matrix_summary(mat) if (!mat_summary$is_square) { print( glue("{dim(mat)[1]} by {dim(mat)[2]} matrix of rank {mat_summary$rank}") ) } else { properties <- "" if (mat_summary$is_symmetric) properties <- glue(properties, ", symmetric") if (mat_summary$is_diagonal) properties <- glue(properties, ", diagonal") properties <- glue(properties, ifelse(mat_summary$is_singular, ", singular", ", nonsingular")) print( glue( "{dim(mat)[1]} by {dim(mat)[2]} square{properties}", " matrix of rank {mat_summary$rank}" ) ) } } print.matrixSummary <- function(mat_summary) { print_matrix_summary(mat_summary$matrix) }