From b8a38a325e81390353518c7be3ca5488b4577505 Mon Sep 17 00:00:00 2001 From: Michael Friendly Date: Fri, 2 Aug 2024 21:43:13 -0400 Subject: [PATCH] clean up --- dev/symbolicMatrix.R | 2 +- dev/symbolicMatrix2.R | 232 ------------------------------------ dev/test-symbolic-matrix.R | 9 +- man/figures/symbMat-SVD.png | Bin 0 -> 30163 bytes 4 files changed, 6 insertions(+), 237 deletions(-) delete mode 100644 dev/symbolicMatrix2.R create mode 100644 man/figures/symbMat-SVD.png diff --git a/dev/symbolicMatrix.R b/dev/symbolicMatrix.R index 43b5061f..be5b47b8 100644 --- a/dev/symbolicMatrix.R +++ b/dev/symbolicMatrix.R @@ -94,7 +94,7 @@ #' str(mat) #' cat(mat) #' # copy to clipboard -#' clipr::write_clip(mat) +#' #clipr::write_clip(mat) # can't be done in non-interactive mode #' #' # numeric rows/cols #' symbolicMatrix(ncol=3) diff --git a/dev/symbolicMatrix2.R b/dev/symbolicMatrix2.R deleted file mode 100644 index c3e4af68..00000000 --- a/dev/symbolicMatrix2.R +++ /dev/null @@ -1,232 +0,0 @@ -#' Create a Symbolic Matrix for LaTeX -#' -#' @description -#' Constructs the latex code for a symbolic matrix, like: -#' \preformatted{ -#' \\begin{pmatrix} -#' x_{11} & x_{12} & \\dots & x_{1m} \\ -#' x_{21} & x_{22} & \\dots & x_{2m} \\ -#' \\vdots & \\vdots & \\ddots & \\vdots \\ -#' x_{n1} & x_{n2} & \\dots & x_{nm} -#' \\end{pmatrix} -#' } -#' -#' Alternatively, the number of rows and/or columns can be integers, generating a matrix of given size. -#' -#' The function prints the resulting code to the console, or, using \code{\link[clipr]{write_clip}}, can be copied to the console, -#' or can be used used in a markdown chunk in a \code{Rmd} or \code{qmd} document, e.g, -#' \preformatted{ -#' ```{r results = "asis"} -#' symbolicMatrix("\\lambda", nrow=3, ncol=3, -#' diag=TRUE, -#' lhs = "\\boldsymbol{\\Lambda}") -#' ``` -#' } -#' -#' @details -#' This implementation assumes that the LaTeX \code{amsmath} package will be available because it uses the shorthands -#' \code{\\begin{pmatrix}}, ... rather than \code{\\left( \\begin{array} ... \\end{array} \\right)}. -#' -#' This function is experimental. Other features may be added. E.g., it would be nice to -#' -#' * Specify exponents for the matrix elements, e.g, a diagonal matrix of square roots of eigenvalues, \code{\\lambda_i^{1/2}} -#' * Specify "accents" for the symbols, e.g., when you want the elements to be \code{\\widehat{\\beta}_{ij}}. -#' -#' @param symbol name for matrix elements, character string. For LaTeX symbols, the backslash must be escaped, e.g, \code{\\beta}. -#' @param nrow Number of rows, a single character representing rows symbolically, or an integer, generating -#' that many rows. -#' @param ncol Number of columns, a single character representing columns symbolically, or an integer, generating -#' that many columns. -#' @param matrix Character string giving the LaTeX matrix environment used in \code{\\begin{}}, \code{\\end{}}. Typically one of -#' \code{"pmatrix"} (uses parentheses \code{"(", ")"}); -#' \code{"bmatrix"} (uses square brackets \code{"[", "]"}); -#' \code{"Bmatrix"} (uses braces \code{"{", "}"};), -#' \code{"vmatrix"} (uses vertical bars \code{"|", "|"}); -#' \code{"Vmatrix"} (uses doublevertical bars \code{"||", "||"}); -#' \code{"matrix"} (generates a plain matrix without delimeters). -#' -#' @param diag logical; if \code{TRUE}, off-diagonal elements are all 0 (and \code{nrow} must == \code{ncol}) -#' @param comma logical; if \code{TRUE}, commas are inserted between row and column subscripts -#' @param exponent if specified, e.g., "-1", or "1/2", the exponent is applied to the matrix -#' @param transpose if TRUE, the transpose symbol "\\top" is appended to the matrix; may -#' also be a character string, e.g., \code{"T"}, \code{"\\prime"}, \code{"\textsf{T}"} -#' @param lhs optional LaTeX expression, e.g, "\\boldsymbol{\\Lamda}", for left-hand side of an equation -#' with the matrix on the right-hand side. -#' @param print logical; print the LaTeX code for the matrix on the console?; default: \code{TRUE} -#' -#' @returns Returns invisibly the LaTeX representation of the matrix as a character sting. -#' Use \code{cat()} to display it at the console, or \code{clipr::write_clip()} to copy it to the clipboard -#' -#' @author John Fox -#' @export -#' @examples -#' symbolicMatrix() -#' -#' # return value -#' mat <- symbolicMatrix(print = FALSE) -#' str(mat) -#' cat(mat) -#' # copy to clipboard -#' clipr::write_clip(mat) -#' -#' # numeric rows/cols -#' symbolicMatrix(ncol=3) -#' symbolicMatrix(nrow=4) -#' symbolicMatrix(nrow=4, ncol=4) -#' -#' # diagonal matrices -#' symbolicMatrix(nrow=3, ncol=3, diag=TRUE) -#' symbolicMatrix(nrow="n", ncol="n", diag=TRUE) -#' -#' # commas, exponents, transpose -#' symbolicMatrix("\\beta", comma=TRUE, exponent="-1") -#' symbolicMatrix("\\beta", comma=TRUE, transpose=TRUE) -#' symbolicMatrix("\\beta", comma=TRUE, exponent="-1", transpose=TRUE) - -symbolicMatrix <- function( - symbol="x", - nrow="n", - ncol="m", - matrix="pmatrix", - diag=FALSE, - comma=FALSE, - exponent, - transpose=FALSE, - lhs, - print=TRUE){ - - # Args: - # symbol: for matrix elements, character string - # nrow: number of rows, can be a character - # ncol: number of columns, can be a character - # matrix: LaTeX matix environment - # diag: if TRUE, off-diagonal elements are all 0 (and nrow must == ncol) - # comma: if TRUE, commas are inserted between row and column subscripts - # exponent: if specified, e.g., "-1", the exponent is applied to the matrix - # transpose: if TRUE, the transpose symbol "\\top" is appended to the - # matrix; may also be a character, e.g., "T". - # lhs: optional LaTeX expression, e.g, "\\boldsymbol{\\Lamda}", for - # left-hand side of an equation with the matrix on the right-hand side. - # print: print the LaTeX code for the matrix on the console - - if (is.numeric(nrow)){ - if (round(nrow) != nrow || nrow <= 0) - stop("nrow is not a positive whole number") - } - - if (is.numeric(ncol)){ - if (round(ncol) != ncol || ncol <= 0) - stop("ncol is not a positive whole number") - } - - comma <- if (comma) "," else "" - if (isTRUE(transpose)) transpose <- "\\top" - if (!missing(exponent) && !isFALSE(transpose)){ - exponent <- paste0("{", exponent, "^", transpose, "}") - transpose <- FALSE - } - - row.elements <- c(symbol, symbol, "\\cdots", symbol) - col.subscripts <- c("1", "2", "", ncol) - left.sub <- c("_{", "_{", "", "_{") - right.sub <- c("}", "}", "", "}") - post.element <- c(" & ", " & ", " & ", " \\\\ \n") - - result <- paste0(if (!missing(lhs)) paste0(lhs, " = "), - "\\begin{", matrix, "} \n") - - if (diag){ - zero <- paste0("0", paste(rep(" ", nchar(symbol) + 3), collapse="")) - if (nrow != ncol) stop("nrow and ncol must be the same if diag = TRUE") - if (is.numeric(nrow)){ - mat <- matrix(zero, nrow, nrow) - diag(mat) <- paste0(symbol, "_{", 1:nrow, "}") - } else { - mat <- matrix(zero, 4, 4) - mat[3, ] <- paste0("\\vdots", - paste0(paste(rep(" ", max(0, nchar(symbol) - 2)), - collapse = ""))) - mat[, 3] <- paste0("\\cdots", - paste0(paste(rep(" ", max(0, nchar(symbol) - 2)), - collapse = ""))) - mat[3, 3] <- paste0("\\ddots", - paste0(paste(rep(" ", max(0, nchar(symbol) - 2)), - collapse = ""))) - mat[cbind(c(1, 2, 4), c(1, 2, 4))] <- - paste0(symbol, c("_{1}", "_{2}", paste0("_{", nrow, "}"))) - } - if (is.character(nrow)) nrow <- 4 - for (i in 1:nrow){ - result <- paste0(result, " ") - for (j in 1:nrow){ - result <- paste0(result, mat[i, j], - if (j == nrow) " \\\\ \n" else " & ") - } - } - } else if (is.character(nrow)){ - vdots <- paste0("\\vdots", - paste0(paste(rep(" ", nchar(symbol) - 1), collapse = ""), - if (comma == ",") " ")) - row.subscripts <- c("1", "2", "", nrow) - if (is.character(ncol)){ - vdots <- paste0(vdots, " & ", vdots, " & ", - if (nrow != ncol) " & " else "\\ddots & ", - vdots, " \\\\ \n") - for (i in 1:4){ - result <- paste0(result, " ") - if (i == 3){ - result <- paste0(result, vdots) - next - } - for (j in 1:4){ - result <- paste0(result, row.elements[j], left.sub[j], - if (j !=3) paste0(row.subscripts[i], comma), - col.subscripts[j], - right.sub[j], post.element[j]) - } - } - } else { - vdots <- paste0(paste(rep(vdots, ncol), collapse = " & "), " \\\\ \n") - for (i in 1:4){ - result <- paste0(result, " ") - if (i == 3){ - result <- paste0(result, vdots) - next - } - for (j in 1:ncol){ - result <- paste0(result, - paste0(symbol, "_{", row.subscripts[i], - if (ncol > 1) paste0(comma, j), "}", - if (j == ncol) " \\\\ \n" else " & ") - ) - } - } - } - } else if (is.character(ncol)){ - for (i in 1:nrow){ - result <- paste0(result, " ") - for (j in 1:4){ - result <- paste0(result, row.elements[j], left.sub[j], - if (j !=3 && nrow > 1) paste0(i, comma), - col.subscripts[j], - right.sub[j], post.element[j]) - } - } - } else { - for (i in 1:nrow){ - result <- paste0(result, " ") - for (j in 1:ncol){ - result <- paste0(result, symbol, "_{", if (nrow > 1) i, - if (nrow > 1 && ncol > 1) comma, - if (ncol > 1) j, "}", - if (j == ncol) " \\\\ \n" else " & ") - } - } - } - result <- paste0(result, "\\end{", matrix, "}", - if (!missing(exponent)) paste0("^{", exponent, "}"), - if (!isFALSE(transpose)) paste0("^", transpose), - "\n") - if (print) cat(result) - invisible(result) -} diff --git a/dev/test-symbolic-matrix.R b/dev/test-symbolic-matrix.R index f4dcf90a..d5a1d2d8 100644 --- a/dev/test-symbolic-matrix.R +++ b/dev/test-symbolic-matrix.R @@ -50,10 +50,11 @@ symbolicMatrix(nrow=3.1, ncol=3) # SVD -X <- symbolicMatrix("x", "n", "p") -U <- symbolicMatrix("u", "n", "k") -D <- symbolicMatrix("\\lambda", "k", "k", diag=TRUE) -V <- symbolicMatrix("v", "k", "p", transpose = TRUE) +X <- symbolicMatrix("x", "n", "p", print=FALSE) +U <- symbolicMatrix("u", "n", "k", print=FALSE) +D <- symbolicMatrix("\\lambda", "k", "k", diag=TRUE, print=FALSE) +V <- symbolicMatrix("v", "k", "p", transpose = TRUE, print=FALSE) cat("\\mathrm{SVD:}\n", X, "=\n", U, D, V) + #cat("SVD:\n", X, "=\n", U, "\n", D, "\n", V) diff --git a/man/figures/symbMat-SVD.png b/man/figures/symbMat-SVD.png new file mode 100644 index 0000000000000000000000000000000000000000..1731c01455d2620bd7fd1f27694a99a266a7f84f GIT binary patch literal 30163 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 literal 0 HcmV?d00001