matrixStats/0000755000175100001440000000000013074160622012614 5ustar hornikusersmatrixStats/inst/0000755000175100001440000000000013073627232013575 5ustar hornikusersmatrixStats/inst/benchmarking/0000755000175100001440000000000013073627232016225 5ustar hornikusersmatrixStats/inst/benchmarking/colRowAlls.md.rsp0000644000175100001440000000257413070644022021434 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colAlls"%> <%@string rowname="rowAlls"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-18"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + all() * colSums() == n or rowSums() == n ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "logical") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colAlls = colAlls(X), "apply+all" = apply(X, MARGIN = 2L, FUN = all), "colSums==n" = (colSums(X) == nrow(X)), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowAlls = rowAlls(X), "apply+all" = apply(X, MARGIN = 1L, FUN = all), "rowSums==n" = (rowSums(X) == ncol(X)), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-18 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/binMeans.md.rsp0000644000175100001440000000376213070644022021107 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="binMeans"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-04"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * binMeans_R() which is defined as ```r <%=withCapture({ binMeans_R <- function(y, x, bx, na.rm = FALSE, count = TRUE, right = FALSE) { B <- length(bx)-1L res <- double(B) counts <- integer(B) # For each bin... for (kk in seq_len(B)) { if (right) { idxs <- which(bx[kk] < x & x <= bx[kk+1L]) } else { idxs <- which(bx[kk] <= x & x < bx[kk+1L]) } yKK <- y[idxs] muKK <- mean(yKK) res[kk] <- muKK counts[kk] <- length(idxs) } # for (kk ...) if (count) attr(res, "count") <- counts res } # binMeans_R() })%> ``` ## Results ### Non-sorted simulated data ```r <%=withCapture({ nx <- 10e3 # Number of data points set.seed(0xBEEF) x <- runif(nx, min = 0, max = 1) y <- runif(nx, min = 0, max = 1) # Uniformely distributed bins nb <- 1e3 # Number of bins bx <- seq(from = 0, to = 1, length.out = nb+1L) bx <- c(-1, bx, 2) })%> ``` <% benchmark <- function() { %> <% dataLabel <- if (is.unsorted(x)) "unsorted" else "sorted" %> <% message(dataLabel) %> ```r <%=withCapture({ gc() stats <- microbenchmark( binMeans = binMeans(x = x, y = y, bx = bx, count = TRUE), binMeans_R = binMeans_R(x = x, y = y, bx = bx, count = TRUE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=dataLabel) %> <% } # benchmark() %> <% benchmark() %> ### Sorted simulated data ```r <%=withCapture({ x <- sort(x) })%> ``` <% benchmark() %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-02 o Restructured. 2014-05-25 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/x_OP_y.md.rsp0000644000175100001440000000404013070644022020536 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="x_OP_y"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-26"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * x_OP_y_R() as below ```r <%=withCapture({ x_OP_y_R <- function(x, y, OP, na.rm = FALSE) { if (na.rm) { xnok <- is.na(x) ynok <- is.na(y) anok <- xnok & ynok unit <- switch(OP, "+" = 0, "-" = NA_real_, "*" = 1, "/" = NA_real_, stop("Unknown 'OP' operator: ", OP) ) x[xnok] <- unit y[ynok] <- unit } ans <- switch(OP, "+" = x + y, "-" = x - y, "*" = x * y, "/" = x / y, stop("Unknown 'OP' operator: ", OP) ) if (na.rm) { ans[anok] <- NA_real_ } ans } # x_OP_y_R() })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector #### All elements ```r <%=withCapture({ x <- data[[.dataLabel.]] y <- x[, 1L] })%> ``` <% for (OP in c("+", "-", "*", "/")) { %> <% OPTag <- c("+" = "add", "-" = "sub", "*" = "mul", "/" = "div")[OP] gc() %> ```r <%=withCapture({ OP stats <- microbenchmark( "x_OP_y" = x_OP_y(x, y, OP = OP, na.rm = FALSE), "x_OP_y_R" = x_OP_y_R(x, y, OP = OP, na.rm = FALSE), unit = "ms" ) gc() })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel, OPTag)) %> <% } # for (OP ...) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-26 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowAlls_subset.md.rsp0000644000175100001440000000310113070644022023004 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colAlls"%> <%@string rowname="rowAlls"%> <%@string fcnname="colRowAlls_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "logical") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colAlls_X_S" = colAlls(X_S), "colAlls(X, rows, cols)" = colAlls(X, rows = rows, cols = cols), "colAlls(X[rows, cols])" = colAlls(X[rows, cols]), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowAlls_X_S" = rowAlls(X_S), "rowAlls(X, cols, rows)" = rowAlls(X, rows = cols, cols = rows), "rowAlls(X[cols, rows])" = rowAlls(X[cols, rows]), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowWeightedMeans_subset.md.rsp0000644000175100001440000000366113070644022024650 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colWeightedMeans"%> <%@string rowname="rowWeightedMeans"%> <%@string fcnname="colRowWeightedMeans_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] w <- runif(nrow(X)) w_S <- w[rows] gc() colStats <- microbenchmark( "colWeightedMeans_X_w_S" = colWeightedMeans(X_S, w = w_S, na.rm = FALSE), "colWeightedMeans(X, w, rows, cols)" = colWeightedMeans(X, w = w, rows = rows, cols = cols, na.rm = FALSE), "colWeightedMeans(X[rows, cols], w[rows])" = colWeightedMeans(X[rows, cols], w = w[rows], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowWeightedMeans_X_w_S" = rowWeightedMeans(X_S, w = w_S, na.rm = FALSE), "rowWeightedMeans(X, w, cols, rows)" = rowWeightedMeans(X, w = w, rows = cols, cols = rows, na.rm = FALSE), "rowWeightedMeans(X[cols, rows], w[rows])" = rowWeightedMeans(X[cols, rows], w = w[rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/varDiff.md.rsp0000644000175100001440000000243613070644022020731 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="varDiff"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-10"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * N/A <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) data <- data[1:4] })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector #### All elements ```r <%=withCapture({ x <- data[[.dataLabel.]] stats <- microbenchmark( "varDiff" = varDiff(x), "var" = var(x), "diff" = diff(x), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-10 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowMedians.md.rsp0000644000175100001440000000274713070644022022123 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colMedians"%> <%@string rowname="rowMedians"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + median() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colMedians = colMedians(X, na.rm = FALSE), "apply+median" = apply(X, MARGIN = 2L, FUN = median, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowMedians = rowMedians(X, na.rm = FALSE), "apply+median" = apply(X, MARGIN = 1L, FUN = median, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/mean2_subset.md.rsp0000644000175100001440000000310013070644022021724 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="mean2_subset"%> <%@string subname="mean2"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) ##data <- data[1:3] })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] gc() stats <- microbenchmark( "mean2_x_S" = mean2(x_S, refine = TRUE), "mean2_x_S_no_refine" = mean2(x_S, refine = FALSE), "mean2(x, idxs)" = mean2(x, idxs = idxs, refine = TRUE), "mean2_no_refine(x, idxs)" = mean2(x, idxs = idxs, refine = FALSE), "mean2(x[idxs])" = mean2(x[idxs], refine = TRUE), "mean2_no_refine(x[idxs])" = mean2(x[idxs], refine = FALSE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowCummins.md.rsp0000644000175100001440000000265313070644022022152 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colCummins"%> <%@string rowname="rowCummins"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-26"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + cummin() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colCummins = colCummins(X), "apply+cummin" = apply(X, MARGIN = 2L, FUN = cummin), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowCummins = rowCummins(X), "apply+cummin" = apply(X, MARGIN = 1L, FUN = cummin), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-26 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowCumsums.md.rsp0000644000175100001440000000265313070644022022173 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colCumsums"%> <%@string rowname="rowCumsums"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-26"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + cumsum() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colCumsums = colCumsums(X), "apply+cumsum" = apply(X, MARGIN = 2L, FUN = cumsum), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowCumsums = rowCumsums(X), "apply+cumsum" = apply(X, MARGIN = 1L, FUN = cumsum), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-26 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowProds_subset.md.rsp0000644000175100001440000000504313070644022023207 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colProds"%> <%@string rowname="rowProds"%> <%@string fcnname="colRowProds_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] })%> <% gc() %> <%=withCapture({ colStats <- microbenchmark( "colProds_X_S w/ direct" = colProds(X_S, method = "direct", na.rm = FALSE), "colProds_X_S w/ expSumLog" = colProds(X_S, method = "expSumLog", na.rm = FALSE), "colProds(X, rows, cols) w/ direct" = colProds(X, rows = rows, cols = cols, method = "direct", na.rm = FALSE), "colProds(X, rows, cols) w/ expSumLog" = colProds(X, rows = rows, cols = cols, method = "expSumLog", na.rm = FALSE), "colProds(X[rows, cols]) w/ direct" = colProds(X[rows, cols], method = "direct", na.rm = FALSE), "colProds(X[rows, cols]) w/ expSumLog" = colProds(X[rows, cols], method = "expSumLog", na.rm = FALSE), unit = "ms" ) })%> <%=withCapture({ X <- t(X) X_S <- t(X_S) })%> <% gc() %> <%=withCapture({ rowStats <- microbenchmark( "rowProds_X_S w/ direct" = rowProds(X_S, method = "direct", na.rm = FALSE), "rowProds_X_S w/ expSumLog" = rowProds(X_S, method = "expSumLog", na.rm = FALSE), "rowProds(X, cols, rows) w/ direct" = rowProds(X, rows = cols, cols = rows, method = "direct", na.rm = FALSE), "rowProds(X, cols, rows) w/ expSumLog" = rowProds(X, rows = cols, cols = rows, method = "expSumLog", na.rm = FALSE), "rowProds(X[cols, rows]) w/ direct" = rowProds(X[cols, rows], method = "direct", na.rm = FALSE), "rowProds(X[cols, rows]) w/ expSumLog" = rowProds(X[cols, rows], method = "expSumLog", na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowAnyMissings.md.rsp0000644000175100001440000000352113070644022022776 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colAnyMissings"%> <%@string rowname="rowAnyMissings"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * colAnyMissings() and rowAnyMissings() * apply() + anyMissing() * colSums() + is.na() and rowSums() + is.na() where ```r <%=withCapture({ colAnyMissings <- function(x, ...) colAnys(x, value = NA) })%> ``` and ```r <%=withCapture({ rowAnyMissings <- function(x, ...) rowAnys(x, value = NA) })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colAnyMissings = colAnyMissings(X), "apply+anyMissing" = apply(X, MARGIN = 2L, FUN = anyMissing), colSums = is.na(colSums(X, na.rm = FALSE)), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowAnyMissings = rowAnyMissings(X), "apply+anyMissing" = apply(X, MARGIN = 1L, FUN = anyMissing), rowSums = is.na(rowSums(X, na.rm = FALSE)), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowMins.md.rsp0000644000175100001440000000357713070644022021453 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colMins"%> <%@string rowname="rowMins"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + min() * lapply() + pmin() * lapply() + pmin.int() See also [StackOverflow:colMins?]. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colMins = colMins(X, na.rm = FALSE), "apply+min" = apply(X, MARGIN = 2L, FUN = min, na.rm = FALSE), "lapply+pmin" = do.call(pmin, lapply(seq_len(nrow(X)), function(i) X[i, ])), "lapply+pmin.int" = do.call(pmin.int, lapply(seq_len(nrow(X)), function(i) X[i, ])), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowMins = rowMins(X, na.rm = FALSE), "apply+min" = apply(X, MARGIN = 1L, FUN = min, na.rm = FALSE), "lapply+pmin" = do.call(pmin, lapply(seq_len(ncol(X)), function(i) X[, i])), "lapply+pmin.int" = do.call(pmin.int, lapply(seq_len(ncol(X)), function(i) X[, i])), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowAnyMissings_subset.md.rsp0000644000175100001440000000344413070644022024367 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colAnyMissings"%> <%@string rowname="rowAnyMissings"%> <%@string fcnname="colRowAnyMissings_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colAnyMissings_X_S" = colAnyMissings(X_S), "colAnyMissings(X, rows, cols)" = colAnyMissings(X, rows = rows, cols = cols), "colAnyMissings(X[rows, cols])" = colAnyMissings(X[rows, cols]), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowAnyMissings_X_S" = rowAnyMissings(X_S), "rowAnyMissings(X, cols, rows)" = rowAnyMissings(X, rows = cols, cols = rows), "rowAnyMissings(X[cols, rows])" = rowAnyMissings(X[cols, rows]), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/includes/0000755000175100001440000000000012737057162020040 5ustar hornikusersmatrixStats/inst/benchmarking/includes/footer.md.rsp0000644000175100001440000000136312726216471022464 0ustar hornikusers<%--------------------------------------------------------------- Page footer ---------------------------------------------------------------%> <%@string appendix="${appendix}" default="false"%> <%@ifeq appendix="true"%> <%@include file="appendix.md.rsp"%> <%@endif%> <%@include file="${references}"%> --------------------------------------- Copyright <%@meta name="author"%>. Last updated on <%=format(Sys.time(), format="%Y-%m-%d %H:%M:%S (%z UTC)")%>. Powered by [RSP]. <%--------------------------------------------------------------- Dynamically insert an HTML favicon ---------------------------------------------------------------%> <%=toFavicon({ plot(1, col="blue", bg="yellow", pch=21, cex=4, lwd=4, axes=FALSE) }, force=FALSE)%> matrixStats/inst/benchmarking/includes/header.md.rsp0000644000175100001440000000011212726216471022405 0ustar hornikusers[matrixStats]: Benchmark report --------------------------------------- matrixStats/inst/benchmarking/includes/results.md.rsp0000644000175100001440000001167412726216471022675 0ustar hornikusers<%-------------------------------------------------------------- BENCHMARK RESULTS --------------------------------------------------------------%> <%-------------------------------------------------------------- Local functions --------------------------------------------------------------%> <% toImage <- function(stats, name=levels(stats$expr)[1L], tags=NULL, ylim="auto", col=NULL, alpha=NULL, ...) { %> ![](<%=toPNG(name, tags=c(tags, "benchmark"), aspectRatio=2/3, { if (identical(ylim, "auto")) { y <- stats$time/1e6 ymax <- max(y, na.rm=TRUE) y75 <- quantile(y, probs=0.75, na.rm=TRUE) yupper <- min(c(1.5*y75, ymax), na.rm=TRUE) ylim <- c(0, yupper) } if (!is.null(ylim)) { stats$outlier <- (stats$time > ylim[2]*1e6) stats$time[stats$outlier] <- ylim[2]*1e6 } gg <- ggplot(data=stats, aes(x=seq_along(time)/length(levels(expr)), y=time/1e6)) gg <- gg + geom_point(aes(colour=expr, shape=outlier)) gg <- gg + scale_shape_manual(values=c(16,4), guide="none") if (!is.null(col)) gg <- gg + scale_colour_manual(values=col) if (!is.null(alpha)) gg <- gg + scale_alpha_manual(values=alpha) gg <- gg + xlab("iteration") + ylab("time (ms)") if (!is.null(ylim)) gg <- gg + ylim(ylim) print(gg) })%>) <% } # toImage() %> <% toTable <- function(stats, tags=NULL, order="median", ...) { kable({ s <- summary(stats) s$neval <- NULL s$cld <- NULL s <- s[order(s[[order]]),] s }, row.names=TRUE) kable({ s <- summary(stats, unit="relative") s$neval <- NULL s$cld <- NULL s <- s[order(s[[order]]),] s }, row.names=TRUE) } %> <%-------------------------------------------------------------- Benchmark results for vector functions --------------------------------------------------------------%> <% benchmarkResults <- function(stats, tags=NULL, ...) { %> _Table: Benchmarking of <%=hpaste(sprintf("%s()", levels(stats$expr)), lastCollapse=" and ")%> on <%=paste(tags, collapse="+")%> data. The top panel shows times in milliseconds and the bottom panel shows relative times._ <% toTable(stats, tags=tags) %> _Figure: Benchmarking of <%=hpaste(sprintf("%s()", levels(stats$expr)), lastCollapse=" and ")%> on <%=paste(tags, collapse="+")%> data. Outliers are displayed as crosses. Times are in milliseconds._ <% toImage(stats, tags=tags) %> <% } # benchmarkResults() %> <%-------------------------------------------------------------- Benchmark results for col- and row-specific functions --------------------------------------------------------------%> <% crBenchmarkResults <- function(colStats, rowStats=NULL, tags=NULL, ...) { %> _Table: Benchmarking of <%=hpaste(sprintf("%s()", levels(colStats$expr)), lastCollapse=" and ")%> on <%=paste(tags, collapse="+")%> data. The top panel shows times in milliseconds and the bottom panel shows relative times._ <% toTable(colStats, tags=tags) %> _Table: Benchmarking of <%=hpaste(sprintf("%s()", levels(rowStats$expr)), lastCollapse=" and ")%> on <%=paste(tags, collapse="+")%> data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times._ <% if (!is.null(rowStats)) { toTable(rowStats, tags=tags) } %> _Figure: Benchmarking of <%=hpaste(sprintf("%s()", levels(colStats$expr)), lastCollapse=" and ")%> on <%=paste(tags, collapse="+")%> data <% if (!is.null(rowStats)) { %> as well as <%=hpaste(sprintf("%s()", levels(rowStats$expr)), lastCollapse=" and ")%> on the same data transposed<% } # if (!is.null(rowStats)) %>. Outliers are displayed as crosses. Times are in milliseconds._ <% y <- c(colStats$time, rowStats$time)/1e6 ymax <- max(y, na.rm=TRUE) y75 <- quantile(y, probs=0.75, na.rm=TRUE) yupper <- min(c(1.5*y75, ymax), na.rm=TRUE) ylim <- c(0, yupper) %> <% toImage(colStats, tags=tags, ylim=ylim) %> <% if (!is.null(rowStats)) toImage(rowStats, tags=tags, ylim=ylim) %> <% if (!is.null(rowStats)) { %> <% # Compare performance or the column- and the row-specific methods # for the "main" function. stats <- list(colStats, rowStats) stats <- lapply(stats, FUN=function(x) { level <- levels(x$expr)[1] x <- subset(x, expr %in% level) x$expr <- factor(as.character(x$expr)) x }) stats <- Reduce(rbind, stats) odd <- seq(from=1L, to=nrow(stats), by=2L) top <- 1:(nrow(stats)/2) stats0 <- stats stats[ odd,] <- stats0[ top,] stats[-odd,] <- stats0[-top,] %> _Table: Benchmarking of <%=hpaste(sprintf("%s()", levels(stats$expr)), lastCollapse=" and ")%> on <%=paste(tags, collapse="+")%> data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times._ <% toTable(stats, tags=tags) %> _Figure: Benchmarking of <%=hpaste(sprintf("%s()", levels(stats$expr)), lastCollapse=" and ")%> on <%=paste(tags, collapse="+")%> data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds._ <% toImage(stats, name=paste(levels(stats$expr), collapse="_vs_"), tags=tags, col=c("#000000", "#999999")) %> <% } # if (!is.null(rowStats)) %> <% } # crBenchmarkResults() %> matrixStats/inst/benchmarking/includes/setup.md.rsp0000644000175100001440000000236412726216471022330 0ustar hornikusers<%@string header="includes/header.md.rsp"%> <%@string footer="includes/footer.md.rsp"%> <%@string references="../includes/references.md.rsp"%> <%@string appendix="${appendix}" default="true"%> <%@string colname=""%> <%@string rowname=""%> <%@string fcnname=""%> <%@string fcntags=""%> <%@meta author="Henrik Bengtsson"%> <%-------------------------------------------------------------- RSP specific --------------------------------------------------------------%> <% R.utils::use("R.utils, R.devices (>= 2.12.0), knitr, ggplot2") devOptions("png", width=390) options("withCapture/newline"=FALSE) options(deparse.cutoff=100) kable <- function(...) { t <- knitr::kable(..., format="markdown") print(t) } %> <%-------------------------------------------------------------- Report/package specific --------------------------------------------------------------%> <% use("matrixStats") use("microbenchmark") %> <%@include file="results.md.rsp"%> <%-------------------------------------------------------------- Macros --------------------------------------------------------------%> <%-------------------------------------------------------------- Timing --------------------------------------------------------------%> <% rspStartTime <- Sys.time() %> matrixStats/inst/benchmarking/includes/references.md.rsp0000644000175100001440000000121212726216471023300 0ustar hornikusers<%--------------------------------------------------------------- REFERENCES ---------------------------------------------------------------%> [RSP]: http://cran.r-project.org/package=R.rsp [matrixStats]: http://cran.r-project.org/package=matrixStats [StackOverflow:colMins?]: http://stackoverflow.com/questions/13676878 "Stack Overflow: fastest way to get Min from every column in a matrix?" [StackOverflow:colSds?]: http://stackoverflow.com/questions/17549762 "Stack Overflow: Is there such 'colsd' in R?" [StackOverflow:rowProds?]: http://stackoverflow.com/questions/20198801/ "Stack Overflow: Row product of matrix and column sum of matrix" matrixStats/inst/benchmarking/includes/appendix.md.rsp0000644000175100001440000000067512726216471023003 0ustar hornikusers## Appendix ### Session information ```r <% print(sessionInfo()) %> ``` Total processing time was <%=rspDuration <- round(Sys.time()-rspStartTime, digits=2)%> <%=attr(rspDuration, "units")%>. ### Reproducibility To reproduce this report, do: ```r <%@ifeq fcnname=""%><%@string fcnname="${colname}"%><%@endif%> html <- matrixStats:::benchmark('<%@string name="fcnname"%>'<%@ifneq fcntags=""%>, tags='<%@string name="fcntags"%>'<%@endif%>) ``` matrixStats/inst/benchmarking/colRowOrderStats.md.rsp0000644000175100001440000000346413070644022022632 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colOrderStats"%> <%@string rowname="rowOrderStats"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> <% use("Biobase", how = "load") rowQ <- Biobase::rowQ %> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + quantile(..., type = 3L) * Biobase::rowQ() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() probs <- 0.3 which <- round(probs*nrow(X)) colStats <- microbenchmark( colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), "apply+quantile" = apply(X, MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), "rowQ(t(X))" = rowQ(t(X), which = which), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), "apply+quantile" = apply(X, MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/product_subset.md.rsp0000644000175100001440000000237013070644022022412 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="product_subset"%> <%@string subname="product"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = "double") data <- data[1:4] })%> ``` ## Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] message(dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] gc() stats <- microbenchmark( "product_x_S" = product(x_S, na.rm = FALSE), "product(x, idxs)" = product(x, idxs = idxs, na.rm = FALSE), "product(x[idxs])" = product(x[idxs], na.rm = FALSE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=dataLabel) %> <% } # for (ii ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowAnys_subset.md.rsp0000644000175100001440000000310113070644022023023 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colAnys"%> <%@string rowname="rowAnys"%> <%@string fcnname="colRowAnys_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "logical") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colAnys_X_S" = colAnys(X_S), "colAnys(X, rows, cols)" = colAnys(X, rows = rows, cols = cols), "colAnys(X[rows, cols])" = colAnys(X[rows, cols]), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowAnys_X_S" = rowAnys(X_S), "rowAnys(X, cols, rows)" = rowAnys(X, rows = cols, cols = rows), "rowAnys(X[cols, rows])" = rowAnys(X[cols, rows]), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/mean2.md.rsp0000644000175100001440000000436413070644022020354 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="mean2"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-02"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * mean() + [() * mean.default() + [() - avoids method dispatching as below ```r <%=withCapture({ mean2_R_v1 <- function(x, na.rm = FALSE, idxs) { mean(x[idxs], na.rm = na.rm) } })%> ``` and ```r <%=withCapture({ mean2_R_v2 <- function(x, na.rm = FALSE, idxs) { mean.default(x[idxs], na.rm = na.rm) } })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) ##data <- data[1:3] })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector #### All elements ```r <%=withCapture({ x <- data[[.dataLabel.]] gc() stats <- microbenchmark( "mean2" = mean2(x, refine = TRUE), "mean2_no_refine" = mean2(x, refine = FALSE), "mean" = mean(x), "mean.default" = mean.default(x), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(dataLabel, "all")) %> <% for (subset in c(0.2, 0.4, 0.8)) { %> #### A <%=sprintf("%g", 100*subset)%>% subset ```r <%=withCapture({ x <- data[[.dataLabel.]] subset idxs <- sort(sample(length(x), size = subset*length(x), replace = FALSE)) gc() stats <- microbenchmark( "mean2" = mean2(x, idxs = idxs, refine = TRUE), "mean2_no_refine" = mean2(x, idxs = idxs, refine = FALSE), "mean+[()" = mean2_R_v1(x, idxs = idxs), "mean.default+[()" = mean2_R_v2(x, idxs = idxs), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel, subset)) %> <% } # for (subset in ...) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-02 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowMeans2.md.rsp0000644000175100001440000000306613070644022021663 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colMeans2"%> <%@string rowname="rowMeans2"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2017-03-31"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + mean() * .colMeans() and .rowMeans() * colMeans() and rowMeans() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colMeans2 = colMeans2(X, na.rm = FALSE), .colMeans = .colMeans(X, m = nrow(X), n = ncol(X), na.rm = FALSE), colMeans = colMeans(X, na.rm = FALSE), "apply+mean" = apply(X, MARGIN = 2L, FUN = mean, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowMeans2 = rowMeans2(X, na.rm = FALSE), .rowMeans = .rowMeans(X, m = nrow(X), n = ncol(X), na.rm = FALSE), rowMeans = rowMeans(X, na.rm = FALSE), "apply+mean" = apply(X, MARGIN = 1L, FUN = mean, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> matrixStats/inst/benchmarking/colRowCounts.md.rsp0000644000175100001440000000340213070644022022003 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colCounts"%> <%@string rowname="rowCounts"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * colSums() and rowSums() * apply() + sum() <% for (mode in c("logical", "integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> #### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] value <- 42 })%> ``` <% gc() %> ```r <%=withCapture({ colStats <- microbenchmark( colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == value, na.rm = FALSE), "apply+sum" = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, na.rm = FALSE)), unit = "ms" ) })%> ``` ```r <%=withCapture({ X <- t(X) })%> ``` <% gc() %> ```r <%=withCapture({ rowStats <- microbenchmark( rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == value, na.rm = FALSE), "apply+sum" = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, na.rm = FALSE)), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowMads.md.rsp0000644000175100001440000000422313070644022021416 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colMads"%> <%@string rowname="rowMads"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-18"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + mad() * colMads2() and rowMads2() where `rowMads2()` and `colMads2()` are: ```r <%=withCapture({ rowMads2 <- function(x, const = 1.4826, na.rm = FALSE) { mu <- rowMedians(x, na.rm = na.rm) x <- abs(x - mu) mad <- rowMedians(x, na.rm = FALSE) const * mad } colMads2 <- function(x, const = 1.4826, na.rm = FALSE) { mu <- colMedians(x, na.rm = na.rm) x <- abs(x - mu) mad <- colMedians(x, na.rm = FALSE) const * mad } })%> ``` <% rowMads_R <- function(x, na.rm = FALSE) { apply(x, MARGIN = 1L, FUN = mad, na.rm = na.rm) } colMads_R <- function(x, na.rm = FALSE) { apply(x, MARGIN = 2L, FUN = mad, na.rm = na.rm) } %> <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colMads = colMads(X, na.rm = FALSE), colMads2 = colMads2(X, na.rm = FALSE), "apply+mad" = apply(X, MARGIN = 2L, FUN = mad, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowMads = rowMads(X, na.rm = FALSE), rowMads2 = rowMads2(X, na.rm = FALSE), "apply+mad" = apply(X, MARGIN = 1L, FUN = mad, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-17 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/index.md.rsp0000644000175100001440000000365113070644022020457 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@meta title="Benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-05"%> <%@include file="${header}"%> <% use("matrixStats") use("R.utils (>= 1.34.0)") # Simple logging function lenter <- function(...) { s <- mprintf(...) s <- gsub("[.][.][.](\n)*", "...done\\1", s) lexit <<- function() mprintf(s) } %> # <%@meta name="title"%> List of benchmark report for some of the functions available in the [matrixStats] package. <% path <- cmdArg(path = system.file("benchmarking", package = "matrixStats")) path <- getAbsolutePath(path) message("Processing benchmark report directory: ", path) pattern <- "[.]md[.]rsp$" filenames <- list.files(path = path, pattern = pattern) filenames <- setdiff(filenames, "index.md.rsp") names <- gsub(pattern, "", filenames) # col- and rowAnyMissing() does not really exist names <- setdiff(names, c("colAnyMissing", "rowAnyMissing")) message("Number of reports found: ", length(names)) mprintf("Report #%d: %s\n", seq_along(names), names) %> <% for (ii in seq_along(names)) { %> <% name <- names[ii] if (regexpr("^colRow", name) != -1L) { label <- gsub("^colRow", "", name) label <- sprintf("col%s() and row%s()", label, label) } else { label <- sprintf("%s()", name) } %> * [<%=label%>](<%={ lenter("%d of %d. Benchmarking %s...\n", ii, length(names), label) html <- sprintf("%s.html", name) if (!file_test("-f", html)) { html <- matrixStats:::benchmark(name, path = path, workdir = ".", envir = new.env()) html <- getRelativePath(html) gc() } lexit() html }%>) <% } # for (ii ...) %> ## Appendix To reproduce this page and all of its reports, do: ```r path <- system.file("benchmarking", package = "matrixStats") R.rsp::rfile("index.md.rsp", path = path) ``` _Note: Each of the above reports takes up to several minutes to complete._ <%@string appendix="false"%> <%@include file="${footer}"%> <%@string appendix="true"%> matrixStats/inst/benchmarking/binMeans_subset.md.rsp0000644000175100001440000000323013070644022022462 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="binMeans"%> <%@string subname="binMeans"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2014-06-05"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. ## Results ### Non-sorted simulated data ```r <%=withCapture({ nx <- 100e3 # Number of data points set.seed(0xBEEF) x <- runif(nx, min = 0, max = 1) y <- runif(nx, min = 0, max = 1) # Uniformely distributed bins nb <- 1e3 # Number of bins bx <- seq(from = 0, to = 1, length.out = nb+1L) bx <- c(-1, bx, 2) # indices for subsetting idxs <- sample.int(length(x), size = length(x)*0.7) })%> ``` <% benchmark <- function() { %> <% dataLabel <- if (is.unsorted(x)) "unsorted" else "sorted" %> <% message(dataLabel) %> ```r <%=withCapture({ x_S <- x[idxs] y_S <- y[idxs] gc() stats <- microbenchmark( "binMeans_x_y_S" = binMeans(x = x_S, y = y_S, bx = bx, count = TRUE), "binMeans(x, y, idxs)" = binMeans(x = x, y = y, idxs = idxs, bx = bx, count = TRUE), "binMeans(x[idxs], y[idxs])" = binMeans(x = x[idxs], y = y[idxs], bx = bx, count = TRUE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=dataLabel) %> <% } # benchmark() %> <% benchmark() %> ### Sorted simulated data ```r <%=withCapture({ x <- sort(x) idxs <- sort(idxs) })%> ``` <% benchmark() %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-05 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowDiffs_subset.md.rsp0000644000175100001440000000332513070644022023154 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colDiffs"%> <%@string rowname="rowDiffs"%> <%@string fcnname="colRowDiffs_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colDiffs_X_S" = colDiffs(X_S), "colDiffs(X, rows, cols)" = colDiffs(X, rows = rows, cols = cols), "colDiffs(X[rows, cols])" = colDiffs(X[rows, cols]), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowDiffs_X_S" = rowDiffs(X_S), "rowDiffs(X, cols, rows)" = rowDiffs(X, rows = cols, cols = rows), "rowDiffs(X[cols, rows])" = rowDiffs(X[cols, rows]), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowCounts_subset.md.rsp0000644000175100001440000000377513070644022023405 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colCounts"%> <%@string rowname="rowCounts"%> <%@string fcnname="colRowCounts_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-04-18"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("logical", "integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> #### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] value <- 42 })%> ``` <% gc() %> ```r <%=withCapture({ colStats <- microbenchmark( "colCounts_X_S" = colCounts(X_S, value = value, na.rm = FALSE), "colCounts(X, rows, cols)" = colCounts(X, value = value, na.rm = FALSE, rows = rows, cols = cols), "colCounts(X[rows, cols])" = colCounts(X[rows, cols], value = value, na.rm = FALSE), unit = "ms" ) })%> ``` ```r <%=withCapture({ X <- t(X) X_S <- t(X_S) })%> ``` <% gc() %> ```r <%=withCapture({ rowStats <- microbenchmark( "rowCounts_X_S" = rowCounts(X_S, value = value, na.rm = FALSE), "rowCounts(X, cols, rows)" = rowCounts(X, value = value, na.rm = FALSE, rows = cols, cols = rows), "rowCounts(X[cols, rows])" = rowCounts(X[cols, rows], value = value, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-04-18 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowWeightedMedians_subset.md.rsp0000644000175100001440000000371513070644022025165 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colWeightedMedians"%> <%@string rowname="rowWeightedMedians"%> <%@string fcnname="colRowWeightedMedians_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%> on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] w <- runif(nrow(X)) w_S <- w[rows] gc() colStats <- microbenchmark( "colWeightedMedians_X_w_S" = colWeightedMedians(X_S, w = w_S, na.rm = FALSE), "colWeightedMedians(X, w, rows, cols)" = colWeightedMedians(X, w = w, rows = rows, cols = cols, na.rm = FALSE), "colWeightedMedians(X[rows, cols], w[rows])" = colWeightedMedians(X[rows, cols], w = w[rows], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowWeightedMedians_X_w_S" = rowWeightedMedians(X_S, w = w_S, na.rm = FALSE), "rowWeightedMedians(X, w, cols, rows)" = rowWeightedMedians(X, w = w, rows = cols, cols = rows, na.rm = FALSE), "rowWeightedMedians(X[cols, rows], w[rows])" = rowWeightedMedians(X[cols, rows], w = w[rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/product.md.rsp0000644000175100001440000000323313070644022021024 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="product"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-04"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * product_R() * prod() where ```r <%=withCapture({ product_R <- function(x, na.rm = FALSE, ...) { # Nothing todo? if (length(x) == 0L) return(0); # Any missing values? if (na.rm) { x <- x[!is.na(x)]; } # Any zeros? if (is.integer(x) && any(x == 0)) return(0); # Calculate product via logarithmic sum sign <- if (sum(x < 0) %% 2 == 0) +1 else -1; x <- abs(x); x <- log(x); x <- sum(x, na.rm = FALSE); x <- exp(x); y <- sign*x; y; } # product_R() })%> ``` ## Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = "double") data <- data[1:4] })%> ``` ## Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] message(dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] gc() stats <- microbenchmark( product = product(x, na.rm = FALSE), product_R = product_R(x, na.rm = FALSE), prod = prod(x, na.rm = FALSE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=dataLabel) %> <% } # for (ii ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-02 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/indexByRow.md.rsp0000644000175100001440000000557013070644022021444 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="indexByRow"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-09"%> <%@include file="${header}"%> <% lfun <- local({ locals <- list() function(txt = NULL) { if (is.null(txt)) return(locals) local <- list(txt) locals <<- c(locals, local) } }) %> # <%@meta name="title"%> This report benchmark the performance of `<%=fcnname%>()` against alternative methods: * `indexByRow_R1()` based in `matrix(..., byrow = TRUE)` * `indexByRow_R2()` is a modified version of `indexByRow_R1()` where `indexByRow_R1()` and `indexByRow_R2()` are defined as in the Appendix. <% lfun(withCapture({ indexByRow_R1 <- function(dim, idxs = NULL, ...) { n <- prod(dim) x <- matrix(seq_len(n), nrow = dim[2L], ncol = dim[1L], byrow = TRUE) if (!is.null(idxs)) x <- x[idxs] as.vector(x) } # indexByRow_R1() })) lfun(withCapture({ indexByRow_R2 <- function(dim, idxs = NULL, ...) { n <- prod(dim) if (is.null(idxs)) { x <- matrix(seq_len(n), nrow = dim[2L], ncol = dim[1L], byrow = TRUE) as.vector(x) } else { idxs <- idxs - 1 cols <- idxs %/% dim[2L] rows <- idxs %% dim[2L] cols + dim[1L]*rows + 1L } } # indexByRow_R2() })) %> ## Data <% lfun(withCapture({ <%@include file="R/random-matrices.R"%> })) %> ```r <%=withCapture({ data <- rmatrices(mode = "index") })%> ``` where `rmatrices()` is defined in the Appendix. <% # data <- data[1:2] %> ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] dim <- dim(X) idxsList <- list( 'all-by-NULL' = NULL, all = seq_len(prod(dim)), odd = seq(from = 1, to = prod(dim), by = 2L) ) str(idxsList) })%> ``` <% for (ii in seq_along(idxsList)) { %> #### Index set '<%=names(idxsList)[ii]%>' <% idxs <- idxsList[[ii]] idxsTag <- names(idxsList)[ii] # Validate correctness res <- list( indexByRow = indexByRow(dim, idxs = idxs), indexByRow_R1 = indexByRow_R1(dim, idxs = idxs), indexByRow_R2 = indexByRow_R2(dim, idxs = idxs) ) lapply(res, FUN = function(x) stopifnot(all.equal(x, res[[1]]))) gc() %> ```r <%=withCapture({ stats <- microbenchmark( indexByRow = indexByRow(dim, idxs = idxs), indexByRow_R1 = indexByRow_R1(dim, idxs = idxs), indexByRow_R2 = indexByRow_R2(dim, idxs = idxs), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(dataLabel, idxsTag)) %> <% } # for (ii ...) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> ### Local functions ```r <%=lfun()[[1]]%> ``` ```r <%=lfun()[[2]]%> ``` ```r <%=lfun()[[3]]%> ``` <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/R/0000755000175100001440000000000013070644022016417 5ustar hornikusersmatrixStats/inst/benchmarking/R/random-matrices.R0000644000175100001440000000202513070644022021626 0ustar hornikusersrmatrix <- function(nrow, ncol, mode = c("logical", "double", "integer", "index"), range = c(-100, +100), na_prob = 0) { mode <- match.arg(mode) n <- nrow * ncol if (mode == "logical") { x <- sample(c(FALSE, TRUE), size = n, replace = TRUE) } else if (mode == "index") { x <- seq_len(n) mode <- "integer" } else { x <- runif(n, min = range[1], max = range[2]) } storage.mode(x) <- mode if (na_prob > 0) x[sample(n, size = na_prob * n)] <- NA dim(x) <- c(nrow, ncol) x } rmatrices <- function(scale = 10, seed = 1, ...) { set.seed(seed) data <- list() data[[1]] <- rmatrix(nrow = scale * 1, ncol = scale * 1, ...) data[[2]] <- rmatrix(nrow = scale * 10, ncol = scale * 10, ...) data[[3]] <- rmatrix(nrow = scale * 100, ncol = scale * 1, ...) data[[4]] <- t(data[[3]]) data[[5]] <- rmatrix(nrow = scale * 10, ncol = scale * 100, ...) data[[6]] <- t(data[[5]]) names(data) <- sapply(data, FUN = function(x) paste(dim(x), collapse = "x")) data } matrixStats/inst/benchmarking/R/random-vectors.R0000644000175100001440000000142013070644022021502 0ustar hornikusersrvector <- function(n, mode = c("logical", "double", "integer"), range = c(-100, +100), na_prob = 0) { mode <- match.arg(mode) if (mode == "logical") { x <- sample(c(FALSE, TRUE), size = n, replace = TRUE) } else { x <- runif(n, min = range[1], max = range[2]) } storage.mode(x) <- mode if (na_prob > 0) x[sample(n, size = na_prob * n)] <- NA x } # rvector() rvectors <- function(scale = 10, seed = 1, ...) { set.seed(seed) data <- list() data[[1]] <- rvector(n = scale * 1e2, ...) data[[2]] <- rvector(n = scale * 1e3, ...) data[[3]] <- rvector(n = scale * 1e4, ...) data[[4]] <- rvector(n = scale * 1e5, ...) data[[5]] <- rvector(n = scale * 1e6, ...) names(data) <- sprintf("n = %d", sapply(data, FUN = length)) data } matrixStats/inst/benchmarking/colRowDiffs.md.rsp0000644000175100001440000000312713070644022021567 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colDiffs"%> <%@string rowname="rowDiffs"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-12-30"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + diff() * apply() + diff2() * diff() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colDiffs = colDiffs(X), "apply+diff" = apply(X, MARGIN = 2L, FUN = diff), "apply+diff2" = apply(X, MARGIN = 2L, FUN = diff2), diff = diff(X), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowDiffs = rowDiffs(X), "apply+diff" = apply(X, MARGIN = 1L, FUN = diff), "apply+diff2" = apply(X, MARGIN = 1L, FUN = diff2), "diff + t" = diff(t(X)), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-17 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/sum2_subset.md.rsp0000644000175100001440000000251313070644022021617 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="sum2_subset"%> <%@string subname="sum2"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) ##data <- data[1:3] })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] gc() stats <- microbenchmark( "sum2_x_S" = sum2(x_S), "sum2(x, idxs)" = sum2(x, idxs = idxs), "sum2(x[idxs])" = sum2(x[idxs]), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowMedians_subset.md.rsp0000644000175100001440000000351413070644022023501 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colMedians"%> <%@string rowname="rowMedians"%> <%@string fcnname="colRowMedians_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colMedians_X_S" = colMedians(X_S, na.rm = FALSE), "colMedians(X, rows, cols)" = colMedians(X, rows = rows, cols = cols, na.rm = FALSE), "colMedians(X[rows, cols])" = colMedians(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowMedians_X_S" = rowMedians(X_S, na.rm = FALSE), "rowMedians(X, cols, rows)" = rowMedians(X, rows = cols, cols = rows, na.rm = FALSE), "rowMedians(X[cols, rows])" = rowMedians(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/anyMissing.md.rsp0000644000175100001440000000254613070644022021473 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="anyMissing"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-01"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * anyNA() * any() + is.na() as below ```r <%=withCapture({ any_is.na <- function(x) { any(is.na(x)) } })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] gc() stats <- microbenchmark( "anyMissing" = anyMissing(x), "anyNA" = anyNA(x), "any_is.na" = any_is.na(x), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-01 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowCummins_subset.md.rsp0000644000175100001440000000336213070644022023535 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colCummins"%> <%@string rowname="rowCummins"%> <%@string fcnname="colRowCummins_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colCummins_X_S" = colCummins(X_S), "colCummins(X, rows, cols)" = colCummins(X, rows = rows, cols = cols), "colCummins(X[rows, cols])" = colCummins(X[rows, cols]), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowCummins_X_S" = rowCummins(X_S), "rowCummins(X, cols, rows)" = rowCummins(X, rows = cols, cols = rows), "rowCummins(X[cols, rows])" = rowCummins(X[cols, rows]), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowCumprods.md.rsp0000644000175100001440000000271013070644022022325 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colCumprods"%> <%@string rowname="rowCumprods"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-26"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + cumprod() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode, range = c(-1, 1)) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colCumprods = colCumprods(X), "apply+cumprod" = apply(X, MARGIN = 2L, FUN = cumprod), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowCumprods = rowCumprods(X), "apply+cumprod" = apply(X, MARGIN = 1L, FUN = cumprod), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-26 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowTabulates.md.rsp0000644000175100001440000000234713070644022022463 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colTabulates"%> <%@string rowname="rowTabulates"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * ??? ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "integer", range = c(-10, 10)) })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colTabulates = colTabulates(X, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowTabulates = rowTabulates(X, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowRanges.md.rsp0000644000175100001440000000275113070644022021755 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colRanges"%> <%@string rowname="rowRanges"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + range() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colRanges = colRanges(X, na.rm = FALSE), "apply+range" = apply(X, MARGIN = 2L, FUN = range, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowRanges = rowRanges(X, na.rm = FALSE), "apply+range" = apply(X, MARGIN = 1L, FUN = range, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowRanks_subset.md.rsp0000644000175100001440000000345713070644022023205 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colRanks"%> <%@string rowname="rowRanks"%> <%@string fcnname="colRowRanks_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colRanks_X_S" = colRanks(X_S, na.rm = FALSE), "colRanks(X, rows, cols)" = colRanks(X, rows = rows, cols = cols, na.rm = FALSE), "colRanks(X[rows, cols])" = colRanks(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowRanks_X_S" = rowRanks(X_S, na.rm = FALSE), "rowRanks(X, cols, rows)" = rowRanks(X, rows = cols, cols = rows, na.rm = FALSE), "rowRanks(X[cols, rows])" = rowRanks(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/x_OP_y_subset.md.rsp0000644000175100001440000000340613070644022022130 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="x_OP_y_subset"%> <%@string subname="x_OP_y"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] y <- x[, 1L] xrows <- sample.int(nrow(x), size = nrow(x)*0.7) xcols <- sample.int(ncol(x), size = ncol(x)*0.7) x_S <- x[xrows, xcols] yidxs <- xrows y_S <- y[yidxs] })%> ``` <% for (OP in c("+", "-", "*", "/")) { %> <% OPTag <- c("+" = "add", "-" = "sub", "*" = "mul", "/" = "div")[OP] gc() %> ```r <%=withCapture({ OP stats <- microbenchmark( "x_OP_y_x_y_S" = x_OP_y(x_S, y_S, OP = OP, na.rm = FALSE), "x_OP_y(x, y, OP, xrows, xcols, yidxs)" = x_OP_y(x, y, OP = OP, xrows = xrows, xcols = xcols, yidxs = yidxs, na.rm = FALSE), "x_OP_y(x[xrows, xcols], y[yidxs], OP)" = x_OP_y(x[xrows, xcols], y[yidxs], OP = OP, na.rm = FALSE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel, OPTag)) %> <% } # for (OP ...) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/allocVector.md.rsp0000644000175100001440000000422213070644022021620 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="allocVector"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * vector() + assignment * rep() * matrix() + as.vector() where ```r <%=withCapture({ allocVector_R1 <- function(length, value = NA) { x <- vector(mode = typeof(value), length = length) if (!is.finite(value) || value != 0) x[] <- value x } # allocVector_R1() allocVector_R2 <- function(length, value = NA) { x <- matrix(data = value, nrow = length, ncol = 1L) as.vector(x) } # allocVector_R2() })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) values <- list(zero = 0, one = 1, "NA" = NA_real_) if (mode != "double") values <- lapply(values, FUN = function(x) { storage.mode(x) <- mode; x }) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> matrix <% for (value in values) { %> <% valueLabel <- as.character(value) mprintf("%s: %s, value=%s\n", mode, dataLabel, valueLabel) %> ```r <%=withCapture({ n <- length(data[[.dataLabel.]]) str(value) })%> ``` <% gc() %> ```r <%=withCapture({ stats <- microbenchmark( "allocVector" = allocVector(length = n, value = value), "rep" = rep(value, times = n), "allocVector_R1" = allocVector_R1(length = n, value = value), "allocVector_R2" = allocVector_R2(length = n, value = value), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel, valueLabel)) %> <% } # for (value in values) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-01 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowLogSumExps_subset.md.rsp0000644000175100001440000000336313070644022024171 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colLogSumExps"%> <%@string rowname="rowLogSumExps"%> <%@string fcnname="colRowLogSumExps_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colLogSumExps_X_S" = colLogSumExps(X_S, na.rm = FALSE), "colLogSumExps(X, rows, cols)" = colLogSumExps(X, rows = rows, cols = cols, na.rm = FALSE), "colLogSumExps(X[rows, cols])" = colLogSumExps(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowLogSumExps_X_S" = rowLogSumExps(X_S, na.rm = FALSE), "rowLogSumExps(X, cols, rows)" = rowLogSumExps(X, rows = cols, cols = rows, na.rm = FALSE), "rowLogSumExps(X[cols, rows])" = rowLogSumExps(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowMeans2_subset.md.rsp0000644000175100001440000000320513070644022023243 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colMeans2"%> <%@string rowname="rowMeans2"%> <%@string fcnname="colRowMeans2_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2017-03-31"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colMeans2_X_S" = colMeans2(X_S, na.rm = FALSE), "colMeans2(X, rows, cols)" = colMeans2(X, rows = rows, cols = cols, na.rm = FALSE), "colMeans2(X[rows, cols])" = colMeans2(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowMeans2_X_S" = rowMeans2(X_S, na.rm = FALSE), "rowMeans2(X, cols, rows)" = rowMeans2(X, rows = cols, cols = rows, na.rm = FALSE), "rowMeans2(X[cols, rows])" = rowMeans2(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> matrixStats/inst/benchmarking/weightedMean_subset.md.rsp0000644000175100001440000000276513070644022023343 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="weightedMean_subset"%> <%@string subname="weightedMean"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) data <- data[1:4] })%> ``` ## Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] w <- runif(length(x)) w_S <- w[idxs] gc() stats <- microbenchmark( "weightedMean_x_w_S" = weightedMean(x_S, w = w_S, na.rm = FALSE), "weightedMean(x, w, idxs)" = weightedMean(x, w = w, idxs = idxs, na.rm = FALSE), "weightedMean(x[idxs], w[idxs])" = weightedMean(x[idxs], w = w[idxs], na.rm = FALSE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/t_tx_OP_y.md.rsp0000644000175100001440000000411213070644022021245 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="t_tx_OP_y"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-26"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * t_tx_OP_y_R() as below ```r <%=withCapture({ t_tx_OP_y_R <- function(x, y, OP, na.rm = FALSE) { x <- t(x) if (na.rm) { xnok <- is.na(x) ynok <- is.na(y) anok <- xnok & ynok unit <- switch(OP, "+" = 0, "-" = NA_real_, "*" = 1, "/" = NA_real_, stop("Unknown 'OP' operator: ", OP) ) x[xnok] <- unit y[ynok] <- unit } ans <- switch(OP, "+" = x + y, "-" = x - y, "*" = x * y, "/" = x / y, stop("Unknown 'OP' operator: ", OP) ) if (na.rm) { ans[anok] <- NA_real_ } t(ans) } # t_tx_OP_y_R() })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector #### All elements ```r <%=withCapture({ x <- data[[.dataLabel.]] y <- x[, 1L] })%> ``` <% for (OP in c("+", "-", "*", "/")) { %> <% OPTag <- c("+" = "add", "-" = "sub", "*" = "mul", "/" = "div")[OP] gc() %> ```r <%=withCapture({ OP stats <- microbenchmark( "t_tx_OP_y" = t_tx_OP_y(x, y, OP = OP, na.rm = FALSE), "t_tx_OP_y_R" = t_tx_OP_y_R(x, y, OP = OP, na.rm = FALSE), unit = "ms" ) gc() })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel, OPTag)) %> <% } # for (OP ...) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-26 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowMins_subset.md.rsp0000644000175100001440000000344013070644022023025 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colMins"%> <%@string rowname="rowMins"%> <%@string fcnname="colRowMins_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colMins_X_S" = colMins(X_S, na.rm = FALSE), "colMins(X, rows, cols)" = colMins(X, rows = rows, cols = cols, na.rm = FALSE), "colMins(X[rows, cols])" = colMins(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowMins_X_S" = rowMins(X_S, na.rm = FALSE), "rowMins(X, cols, rows)" = rowMins(X, rows = cols, cols = rows, na.rm = FALSE), "rowMins(X[cols, rows])" = rowMins(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/madDiff.md.rsp0000644000175100001440000000243613070644022020702 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="madDiff"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-10"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * N/A <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) data <- data[1:4] })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector #### All elements ```r <%=withCapture({ x <- data[[.dataLabel.]] stats <- microbenchmark( "madDiff" = madDiff(x), "mad" = mad(x), "diff" = diff(x), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-10 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowTabulates_subset.md.rsp0000644000175100001440000000337113070644022024046 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colTabulates"%> <%@string rowname="rowTabulates"%> <%@string fcnname="colRowTabulates_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "integer", range = c(-10, 10)) })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colTabulates_X_S" = colTabulates(X_S, na.rm = FALSE), "colTabulates(X, rows, cols)" = colTabulates(X, rows = rows, cols = cols, na.rm = FALSE), "colTabulates(X[rows, cols])" = colTabulates(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowTabulates_X_S" = rowTabulates(X_S, na.rm = FALSE), "rowTabulates(X, cols, rows)" = rowTabulates(X, rows = cols, cols = rows, na.rm = FALSE), "rowTabulates(X[cols, rows])" = rowTabulates(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowQuantiles_subset.md.rsp0000644000175100001440000000355113070644022024067 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colQuantiles"%> <%@string rowname="rowQuantiles"%> <%@string fcnname="colRowQuantiles_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() probs <- seq(from = 0, to = 1, by = 0.25) colStats <- microbenchmark( "colQuantiles_X_S" = colQuantiles(X_S, probs = probs, na.rm = FALSE), "colQuantiles(X, rows, cols)" = colQuantiles(X, rows = rows, cols = cols, probs = probs, na.rm = FALSE), "colQuantiles(X[rows, cols])" = colQuantiles(X[rows, cols], probs = probs, na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowQuantiles_X_S" = rowQuantiles(X_S, probs = probs, na.rm = FALSE), "rowQuantiles(X, cols, rows)" = rowQuantiles(X, rows = cols, cols = rows, probs = probs, na.rm = FALSE), "rowQuantiles(X[cols, rows])" = rowQuantiles(X[cols, rows], probs = probs, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowQuantiles.md.rsp0000644000175100001440000000273613070644022022506 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colQuantiles"%> <%@string rowname="rowQuantiles"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + quantile() ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() probs <- seq(from = 0, to = 1, by = 0.25) colStats <- microbenchmark( colQuantiles = colQuantiles(X, probs = probs, na.rm = FALSE), "apply+quantile" = apply(X, MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowQuantiles = rowQuantiles(X, probs = probs, na.rm = FALSE), "apply+quantile" = apply(X, MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/weightedMean.md.rsp0000644000175100001440000000307213070644022021746 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="weightedMean"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-12-09"%> <%@include file="${header}"%> <% library("stats") weighted.mean.default <- stats:::weighted.mean.default %> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * stats::weighted.mean() * stats:::weighted.mean.default() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) data <- data[1:4] })%> ``` ## Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] w <- runif(length(x)) gc() stats <- microbenchmark( "weightedMean" = weightedMean(x, w = w, na.rm = FALSE), "stats::weighted.mean" = weighted.mean(x, w = w, na.rm = FALSE), "stats:::weighted.mean.default" = weighted.mean.default(x, w = w, na.rm = FALSE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-12-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowWeightedMeans.md.rsp0000644000175100001440000000272613070644022023264 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colWeightedMeans"%> <%@string rowname="rowWeightedMeans"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + weighted.mean() ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] w <- runif(nrow(X)) gc() colStats <- microbenchmark( colWeightedMeans = colWeightedMeans(X, w = w, na.rm = FALSE), "apply+weigthed.mean" = apply(X, MARGIN = 2L, FUN = weighted.mean, w = w, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowWeightedMeans = rowWeightedMeans(X, w = w, na.rm = FALSE), "apply+weigthed.mean" = apply(X, MARGIN = 1L, FUN = weighted.mean, w = w, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowVars_subset.md.rsp0000644000175100001440000000344113070644022023033 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colVars"%> <%@string rowname="rowVars"%> <%@string fcnname="colRowVars_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colVars_X_S" = colVars(X_S, na.rm = FALSE), "colVars(X, rows, cols)" = colVars(X, rows = rows, cols = cols, na.rm = FALSE), "colVars(X[rows, cols])" = colVars(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowVars_X_S" = rowVars(X_S, na.rm = FALSE), "rowVars(X, cols, rows)" = rowVars(X, rows = cols, cols = rows, na.rm = FALSE), "rowVars(X[cols, rows])" = rowVars(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/count.md.rsp0000644000175100001440000000240513070644022020474 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="count"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-12-08"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * sum(x == value) <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) x <- data[[dataLabel]] value <- 42 gc() %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] gc() stats <- microbenchmark( "count" = count(x, value), "sum(x == value)" = sum(x == value), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-01 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowCumprods_subset.md.rsp0000644000175100001440000000342413070644022023715 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colCumprods"%> <%@string rowname="rowCumprods"%> <%@string fcnname="colRowCumprods_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode, range = c(-1, 1)) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colCumprods_X_S" = colCumprods(X_S), "colCumprods(X, rows, cols)" = colCumprods(X, rows = rows, cols = cols), "colCumprods(X[rows, cols])" = colCumprods(X[rows, cols]), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowCumprods_X_S" = rowCumprods(X_S), "rowCumprods(X, cols, rows)" = rowCumprods(X, rows = cols, cols = rows), "rowCumprods(X[cols, rows])" = rowCumprods(X[cols, rows]), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/weightedMedian.md.rsp0000644000175100001440000000434713070644022022271 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="weightedMedian"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-03"%> <%@include file="${header}"%> <%--- 'ergm' could be hard to install, because it imports 'Rglpk', which requires GLPK library on the system. ---%> <%@string test_ergm="FALSE"%> <% use("limma", how = "load") limma_weighted.median <- limma::weighted.median use("cwhmisc", how = "load") cwhmisc_w.median <- cwhmisc::w.median use("laeken", how = "load") laeken_weightedMedian <- laeken::weightedMedian <%@ifeq test_ergm="TRUE"%> use("ergm", how = "load") ergm_wtd.median <- ergm::wtd.median <%@endif%> weightedMedian <- matrixStats::weightedMedian %> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * apply() + limma::weighted.median() * apply() + cwhmisc::w.median() * apply() + laeken::weightedMedian() <%@ifeq test_ergm="TRUE"%> * apply() + ergm::wtd.median() --%> <%@endif%> ## Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = "double") data <- data[1:3] })%> ``` ## Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] message(dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] w <- runif(length(x)) gc() stats <- microbenchmark( "weightedMedian" = weightedMedian(x, w = w, ties = "mean", na.rm = FALSE), "limma::weighted.median" = limma_weighted.median(x, w = w, na.rm = FALSE), "cwhmisc::w.median" = cwhmisc_w.median(x, w = w), "laeken::weightedMedian" = laeken_weightedMedian(x, w = w), <%@ifeq test_ergm="TRUE"%> "ergm::wtd.median" = ergm_wtd.median(x, w = w), <%@endif%> unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=dataLabel) %> <% } # for (ii ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-12-17 o Made 'ergm::wtd.median' optional. 2014-06-03 o Created using benchmark snippet in incl/weightedMedian.Rex. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/anyMissing_subset.md.rsp0000644000175100001440000000251313070644022023052 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="anyMissing_subset"%> <%@string subname="anyMissing"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-04"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] gc() stats <- microbenchmark( "anyMissing_x_S" = anyMissing(x_S), "anyMissing(x, idxs)" = anyMissing(x, idxs = idxs), "anyMissing(x[idxs])" = anyMissing(x[idxs]), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-04 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/binCounts.md.rsp0000644000175100001440000000367713070644022021324 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="binCounts"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-05-25"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * hist() as below ```r <%=withCapture({ hist <- graphics::hist binCounts_hist <- function(x, bx, right = FALSE, ...) { hist(x, breaks = bx, right = right, include.lowest = TRUE, plot = FALSE)$counts } })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Non-sorted simulated data ```r <%=withCapture({ set.seed(0xBEEF) nx <- 100e3 # Number of data points xmax <- 0.01*nx x <- runif(nx, min = 0, max = xmax) storage.mode(x) <- mode str(x) # Uniformely distributed bins nb <- 10e3 # Number of bins bx <- seq(from = 0, to = xmax, length.out = nb+1L) bx <- c(-1, bx, xmax+1) })%> ``` ### Results <% benchmark <- function() { %> <% dataLabel <- if (is.unsorted(x)) "unsorted" else "sorted" %> <% mprintf("%s: %s\n", mode, dataLabel) %> ```r <%=withCapture({ gc() stats <- microbenchmark( binCounts = binCounts(x, bx = bx), hist = binCounts_hist(x, bx = bx), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% # Sanity checks n0 <- binCounts_hist(x, bx = bx) n1 <- binCounts(x, bx = bx) stopifnot(identical(n1, n0)) n1r <- rev(binCounts(-x, bx = rev(-bx), right = TRUE)) stopifnot(identical(n1r, n1)) %> <% } # benchmark() %> <% benchmark() %> ### Sorted simulated data ```r <%=withCapture({ x <- sort(x) })%> ``` <% benchmark() %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-02 o Restructured. 2014-05-25 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/sum2.md.rsp0000644000175100001440000000350413070644022020233 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="sum2"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-02"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * sum() + [() as below ```r <%=withCapture({ sum2_R <- function(x, na.rm = FALSE, idxs) { sum(x[idxs], na.rm = na.rm) } })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) ##data <- data[1:3] })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector #### All elements ```r <%=withCapture({ x <- data[[.dataLabel.]] gc() stats <- microbenchmark( "sum2" = sum2(x), "sum" = sum(x), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(dataLabel, "all")) %> <% for (subset in c(0.2, 0.4, 0.8)) { %> #### A <%=sprintf("%g", 100*subset)%>% subset ```r <%=withCapture({ x <- data[[.dataLabel.]] subset idxs <- sort(sample(length(x), size = subset*length(x), replace = FALSE)) gc() stats <- microbenchmark( "sum2" = sum2(x, idxs = idxs), "sum+[()" = sum2_R(x, idxs = idxs), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel, subset)) %> <% } # for (subset in ...) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-02 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowLogSumExps.md.rsp0000644000175100001440000000335713070644022022607 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colLogSumExps"%> <%@string rowname="rowLogSumExps"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + matrixStats::logSumExp() * apply() + logSumExp0() where ```r <%=withCapture({ logSumExp0 <- function(lx, ...) { iMax <- which.max(lx) log1p(sum(exp(lx[-iMax] - lx[iMax]))) + lx[iMax] } # logSumExp0() })%> ``` ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colLogSumExps = colLogSumExps(X, na.rm = FALSE), "apply+logSumExp" = apply(X, MARGIN = 2L, FUN = logSumExp, na.rm = FALSE), "apply+logSumExp0" = apply(X, MARGIN = 2L, FUN = logSumExp0, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowLogSumExps = rowLogSumExps(X, na.rm = FALSE), "apply+logSumExp" = apply(X, MARGIN = 1L, FUN = logSumExp, na.rm = FALSE), "apply+logSumExp0" = apply(X, MARGIN = 1L, FUN = logSumExp0, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/logSumExp.md.rsp0000644000175100001440000000247413070644022021275 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="logSumExp"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-01"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * logSumExp_R() where ```r <%=withCapture({ logSumExp_R <- function(lx, ...) { iMax <- which.max(lx) log1p(sum(exp(lx[-iMax] - lx[iMax]))) + lx[iMax] } # logSumExp_R() })%> ``` ## Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = "double") data <- data[1:4] })%> ``` ## Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] message(dataLabel) x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] gc() stats <- microbenchmark( "logSumExp" = logSumExp(x), "logSumExp_R" = logSumExp_R(x), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=dataLabel) %> <% } # for (ii ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-01 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowRanks.md.rsp0000644000175100001440000000300413070644022021604 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colRanks"%> <%@string rowname="rowRanks"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + rank() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colRanks = colRanks(X, na.rm = FALSE), "apply+rank" = apply(X, MARGIN = 2L, FUN = rank, na.last = "keep", ties.method = "max"), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowRanks = rowRanks(X, na.rm = FALSE), "apply+rank" = apply(X, MARGIN = 1L, FUN = rank, na.last = "keep", ties.method = "max"), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowSums2.md.rsp0000644000175100001440000000303713070644022021545 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colSums2"%> <%@string rowname="rowSums2"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2017-03-31"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + sum() * colSums() and rowSums() * .colSums() and .rowSums() <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colSums2 = colSums2(X, na.rm = FALSE), .colSums = .colSums(X, m = nrow(X), n = ncol(X), na.rm = FALSE), colSums = colSums(X, na.rm = FALSE), "apply+sum" = apply(X, MARGIN = 2L, FUN = sum, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowSums2 = rowSums2(X, na.rm = FALSE), .rowSums = .rowSums(X, m = nrow(X), n = ncol(X), na.rm = FALSE), rowSums = rowSums(X, na.rm = FALSE), "apply+sum" = apply(X, MARGIN = 1L, FUN = sum, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> matrixStats/inst/benchmarking/count_subset.md.rsp0000644000175100001440000000250313070644022022060 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="count_subset"%> <%@string subname="count"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) value <- 42 %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] gc() stats <- microbenchmark( "count_x_S" = count(x_S, value), "count(x, idxs)" = count(x, idxs = idxs, value), "count(x[idxs])" = count(x[idxs], value), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/binCounts_subset.md.rsp0000644000175100001440000000354613070644022022704 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="binCounts_subset"%> <%@string subname="binCounts"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-04"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Non-sorted simulated data ```r <%=withCapture({ set.seed(0xBEEF) nx <- 100e3 # Number of data points xmax <- 0.01*nx x <- runif(nx, min = 0, max = xmax) storage.mode(x) <- mode str(x) # Uniformely distributed bins nb <- 10e3 # Number of bins bx <- seq(from = 0, to = xmax, length.out = nb+1L) bx <- c(-1, bx, xmax+1) # indices for subsetting idxs <- sample.int(length(x), size = length(x)*0.7) })%> ``` ### Results <% benchmark <- function() { %> <% dataLabel <- if (is.unsorted(x)) "unsorted" else "sorted" %> <% mprintf("%s: %s\n", mode, dataLabel) %> ```r <%=withCapture({ x_S <- x[idxs] gc() stats <- microbenchmark( "binCounts_x_S" = binCounts(x_S, bx = bx), "binCounts(x, idxs)" = binCounts(x, idxs = idxs, bx = bx), "binCounts(x[idxs])" = binCounts(x[idxs], bx = bx), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% # Sanity checks n1 <- binCounts(x, idxs = idxs, bx = bx) n1r <- rev(binCounts(-x, idxs = idxs, bx = rev(-bx), right = TRUE)) stopifnot(identical(n1r, n1)) %> <% } # benchmark() %> <% benchmark() %> ### Sorted simulated data ```r <%=withCapture({ x <- sort(x) idxs <- sort(idxs) })%> ``` <% benchmark() %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-04 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowWeightedMedians.md.rsp0000644000175100001440000000274513070644022023602 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colWeightedMedians"%> <%@string rowname="rowWeightedMedians"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-06-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + weightedMedian() ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] w <- runif(nrow(X)) gc() colStats <- microbenchmark( colWeightedMedians = colWeightedMedians(X, w = w, na.rm = FALSE), "apply+weigthedMedian" = apply(X, MARGIN = 2L, FUN = weightedMedian, w = w, na.rm = FALSE), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowWeightedMedians = rowWeightedMedians(X, w = w, na.rm = FALSE), "apply+weigthedMedian" = apply(X, MARGIN = 1L, FUN = weightedMedian, w = w, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/madDiff_subset.md.rsp0000644000175100001440000000246413070644022022270 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="madDiff_subset"%> <%@string subname="madDiff"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] gc() stats <- microbenchmark( "madDiff_x_S" = madDiff(x_S), "madDiff(x, idxs)" = madDiff(x, idxs = idxs), "madDiff(x[idxs])" = madDiff(x[idxs]), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/weightedMedian_subset.md.rsp0000644000175100001440000000275413070644022023656 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="weightedMedian_subset"%> <%@string subname="weightedMedian"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> <% weightedMedian <- matrixStats::weightedMedian %> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = "double") data <- data[1:3] })%> ``` ## Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] message(dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] w <- runif(length(x)) w_S <- x[idxs] gc() stats <- microbenchmark( "weightedMedian_x_w_S" = weightedMedian(x_S, w = w_S, ties = "mean", na.rm = FALSE), "weightedMedian(x, w, idxs)" = weightedMedian(x, w = w, idxs = idxs, ties = "mean", na.rm = FALSE), "weightedMedian(x[idxs], w[idxs])" = weightedMedian(x[idxs], w = w[idxs], ties = "mean", na.rm = FALSE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=dataLabel) %> <% } # for (ii ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowVars.md.rsp0000644000175100001440000000543413070644022021452 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colVars"%> <%@string rowname="rowVars"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2015-01-06"%> <%@include file="${header}"%> <%@string test_genefilter="TRUE"%> <%@ifeq test_genefilter="TRUE"%> <% use("genefilter", how = "load") genefilter_rowVars <- genefilter::rowVars genefilter_colVars <- function(x, ...) genefilter_rowVars(t(x), ...) %> <%@endif%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + var() * colVarColMeans() and rowVarColMeans() <%@ifeq test_genefilter="TRUE"%> * genefilter::rowVars(t(.)) and genefilter::rowVars() <%@endif%> where ```r <%=withCapture({ colVarColMeans <- function(x, na.rm = TRUE) { if (na.rm) { n <- colSums(!is.na(x)) } else { n <- nrow(x) } var <- colMeans(x*x, na.rm = na.rm) - (colMeans(x, na.rm = na.rm))^2 var * n/(n-1) } })%> ``` and ```r <%=withCapture({ rowVarRowMeans <- function(x, na.rm = TRUE) { if (na.rm) { n <- rowSums(!is.na(x)) } else { n <- ncol(x) } mu <- rowMeans(x, na.rm = na.rm) var <- rowMeans(x*x, na.rm = na.rm) - mu^2 var * (n/(n-1)) } })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colVars = colVars(X, na.rm = FALSE), colVarColMeans = colVarColMeans(X, na.rm = FALSE), "apply+var" = apply(X, MARGIN = 2L, FUN = var, na.rm = FALSE), <%@ifeq test_genefilter="TRUE"%> "genefilter::rowVars(t(.))" = genefilter_colVars(X, na.rm = FALSE), <%@endif%> unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowVars = rowVars(X, na.rm = FALSE), rowVarRowMeans = rowVarRowMeans(X, na.rm = FALSE), "apply+var" = apply(X, MARGIN = 1L, FUN = var, na.rm = FALSE), <%@ifeq test_genefilter="TRUE"%> "genefilter::rowVars" = genefilter_rowVars(X, na.rm = FALSE), <%@endif%> unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-01-06 o Now benchmarking 'genefilter' functions too. 2014-11-23 o Now benchmarking rowVars() instead of rowSds() since the latter uses the former. 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowSums2_subset.md.rsp0000644000175100001440000000316613070644022023135 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colSums2"%> <%@string rowname="rowSums2"%> <%@string fcnname="colRowSums2_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2017-03-31"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colSums2_X_S" = colSums2(X_S, na.rm = FALSE), "colSums2(X, rows, cols)" = colSums2(X, rows = rows, cols = cols, na.rm = FALSE), "colSums2(X[rows, cols])" = colSums2(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowSums2_X_S" = rowSums2(X_S, na.rm = FALSE), "rowSums2(X, cols, rows)" = rowSums2(X, rows = cols, cols = rows, na.rm = FALSE), "rowSums2(X[cols, rows])" = rowSums2(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> matrixStats/inst/benchmarking/colRowAnys.md.rsp0000644000175100001440000000256613070644022021454 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colAnys"%> <%@string rowname="rowAnys"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-18"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * apply() + any() * colSums() > 0 or rowSums() > 0 ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "logical") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] gc() colStats <- microbenchmark( colAnys = colAnys(X), "apply+any" = apply(X, MARGIN = 2L, FUN = any), "colSums > 0" = (colSums(X) > 0L), unit = "ms" ) X <- t(X) gc() rowStats <- microbenchmark( rowAnys = rowAnys(X), "apply+any" = apply(X, MARGIN = 1L, FUN = any), "rowSums > 0" = (rowSums(X) > 0L), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-18 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/varDiff_subset.md.rsp0000644000175100001440000000252513070644022022315 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="varDiff_subset"%> <%@string subname="varDiff"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = mode) data <- data[1:4] })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> vector #### All elements ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] gc() stats <- microbenchmark( "varDiff_x_S" = varDiff(x_S), "varDiff(x, idxs)" = varDiff(x, idxs = idxs), "varDiff(x[idxs])" = varDiff(x[idxs]), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel)) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/allocMatrix.md.rsp0000644000175100001440000000410013070644022021615 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="allocMatrix"%> <% fcnname <- "<%@string name="fcnname"%>" %> <%@meta title="${fcnname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-09"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=fcnname%>() against alternative methods. ## Alternative methods * matrix() * matrix() special trick for NA where ```r <%=withCapture({ allocMatrix_R <- function(nrow, ncol, value = NA) { if (is.na(value) && !is.nan(value)) { matrix(data = value[c()], nrow = nrow, ncol = ncol) } else { matrix(data = value, nrow = nrow, ncol = ncol) } } # allocMatrix_R() })%> ``` <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) values <- list(zero = 0, one = 1, "NA" = NA_real_) if (mode != "double") values <- lapply(values, FUN = function(x) { storage.mode(x) <- mode; x }) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] x <- data[[dataLabel]] gc() %> ### <%=dataLabel%> matrix <% for (value in values) { %> <% valueLabel <- as.character(value) mprintf("%s: %s, value=%s\n", mode, dataLabel, valueLabel) %> ```r <%=withCapture({ dim <- dim(data[[.dataLabel.]]) nrow <- dim[1L] ncol <- dim[2L] str(value) })%> ``` <% gc() %> ```r <%=withCapture({ stats <- microbenchmark( "allocMatrix" = allocMatrix(nrow = nrow, ncol = ncol, value = value), "matrix" = matrix(data = value, nrow = nrow, ncol = ncol), "allocMatrix_R" = allocMatrix_R(nrow = nrow, ncol = ncol, value = value), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel, valueLabel)) %> <% } # for (value in values) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-11-01 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowOrderStats_subset.md.rsp0000644000175100001440000000400113070644022024203 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colOrderStats"%> <%@string rowname="rowOrderStats"%> <%@string fcnname="colRowOrderStats_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() probs <- 0.3 which <- round(probs*nrow(X)) colStats <- microbenchmark( "colOrderStats_X_S" = colOrderStats(X_S, which = which, na.rm = FALSE), "colOrderStats(X, rows, cols)" = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE), "colOrderStats(X[rows, cols])" = colOrderStats(X[rows, cols], which = which, na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowOrderStats_X_S" = rowOrderStats(X_S, which = which, na.rm = FALSE), "rowOrderStats(X, cols, rows)" = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE), "rowOrderStats(X[cols, rows])" = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/t_tx_OP_y_subset.md.rsp0000644000175100001440000000343613070644022022642 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="t_tx_OP_y_subset"%> <%@string subname="t_tx_OP_y"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] mprintf("%s: %s\n", mode, dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] y <- x[, 1L] xrows <- sample.int(nrow(x), size = nrow(x)*0.7) xcols <- sample.int(ncol(x), size = ncol(x)*0.7) x_S <- x[xrows, xcols] yidxs <- xrows y_S <- y[yidxs] })%> ``` <% for (OP in c("+", "-", "*", "/")) { %> <% OPTag <- c("+" = "add", "-" = "sub", "*" = "mul", "/" = "div")[OP] gc() %> ```r <%=withCapture({ OP stats <- microbenchmark( "t_tx_OP_y_x_y_S" = t_tx_OP_y(x_S, y_S, OP = OP, na.rm = FALSE), "t_tx_OP_y(x, y, OP, xrows, xcols, yidxs)" = t_tx_OP_y(x, y, OP = OP, xrows = xrows, xcols = xcols, yidxs = yidxs, na.rm = FALSE), "t_tx_OP_y(x[xrows, xcols], y[yidxs], OP)" = t_tx_OP_y(x[xrows, xcols], y[yidxs], OP = OP, na.rm = FALSE), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=c(mode, dataLabel, OPTag)) %> <% } # for (OP ...) %> <% } # for (ii ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowProds.md.rsp0000644000175100001440000000356113070644022021625 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colProds"%> <%@string rowname="rowProds"%> <%@meta title="${colname}() and ${rowname}() benchmarks"%> <%@meta author="Henrik Bengtsson"%> <%@meta date="2014-11-15"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() against alternative methods. ## Alternative methods * <%=colname%>()/<%=rowname%>() using method="expSumLog" * apply() + prod() * apply() + product() ## Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = "double") })%> ``` ## Results <% for (dataLabel in names(data)) { %> <% message(dataLabel) %> ### <%=dataLabel%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] })%> <% gc() %> <%=withCapture({ colStats <- microbenchmark( "colProds w/ direct" = colProds(X, method = "direct", na.rm = FALSE), "colProds w/ expSumLog" = colProds(X, method = "expSumLog", na.rm = FALSE), "apply+prod" = apply(X, MARGIN = 2L, FUN = prod, na.rm = FALSE), "apply+product" = apply(X, MARGIN = 2L, FUN = product, na.rm = FALSE), unit = "ms" ) })%> <%=withCapture({ X <- t(X) })%> <% gc() %> <%=withCapture({ rowStats <- microbenchmark( "rowProds w/ direct" = rowProds(X, method = "direct", na.rm = FALSE), "rowProds w/ expSumLog" = rowProds(X, method = "expSumLog", na.rm = FALSE), "apply+prod" = apply(X, MARGIN = 1L, FUN = prod, na.rm = FALSE), "apply+product" = apply(X, MARGIN = 1L, FUN = product, na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=dataLabel) %> <% } # for (dataLabel ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2014-06-09 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowRanges_subset.md.rsp0000644000175100001440000000347613070644022023347 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colRanges"%> <%@string rowname="rowRanges"%> <%@string fcnname="colRowRanges_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colRanges_X_S" = colRanges(X_S, na.rm = FALSE), "colRanges(X, rows, cols)" = colRanges(X, rows = rows, cols = cols, na.rm = FALSE), "colRanges(X[rows, cols])" = colRanges(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowRanges_X_S" = rowRanges(X_S, na.rm = FALSE), "rowRanges(X, cols, rows)" = rowRanges(X, rows = cols, cols = rows, na.rm = FALSE), "rowRanges(X[cols, rows])" = rowRanges(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowMads_subset.md.rsp0000644000175100001440000000343713070644022023011 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colMads"%> <%@string rowname="rowMads"%> <%@string fcnname="colRowMads_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colMads_X_S" = colMads(X_S, na.rm = FALSE), "colMads(X, rows, cols)" = colMads(X, rows = rows, cols = cols, na.rm = FALSE), "colMads(X[rows, cols])" = colMads(X[rows, cols], na.rm = FALSE), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowMads_X_S" = rowMads(X_S, na.rm = FALSE), "rowMads(X, cols, rows)" = rowMads(X, rows = cols, cols = rows, na.rm = FALSE), "rowMads(X[cols, rows])" = rowMads(X[cols, rows], na.rm = FALSE), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/logSumExp_subset.md.rsp0000644000175100001440000000233213070644022022653 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string fcnname="logSumExp_subset"%> <%@string subname="logSumExp"%> <%@meta title="${subname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-07"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=subname%>() on subsetted computation. ## Data ```r <%=withCapture({ <%@include file="R/random-vectors.R"%> data <- rvectors(mode = "double") data <- data[1:4] })%> ``` ## Results <% for (ii in seq_along(data)) { %> <% dataLabel <- names(data)[ii] message(dataLabel) %> ### <%=dataLabel%> vector ```r <%=withCapture({ x <- data[[.dataLabel.]] idxs <- sample.int(length(x), size = length(x)*0.7) x_S <- x[idxs] gc() stats <- microbenchmark( "logSumExp_x_S" = logSumExp(x_S), "logSumExp(x, idxs)" = logSumExp(x, idxs = idxs), "logSumExp(x[idxs])" = logSumExp(x[idxs]), unit = "ms" ) })%> ``` <% benchmarkResults(stats, tags=dataLabel) %> <% } # for (ii ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-07 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/benchmarking/colRowCumsums_subset.md.rsp0000644000175100001440000000336213070644022023556 0ustar hornikusers<%@include file="includes/setup.md.rsp"%> <%@string colname="colCumsums"%> <%@string rowname="rowCumsums"%> <%@string fcnname="colRowCumsums_subset"%> <%@meta title="${colname}() and ${rowname}() benchmarks on subsetted computation"%> <%@meta author="Dongcan Jiang"%> <%@meta date="2015-06-06"%> <%@include file="${header}"%> # <%@meta name="title"%> This report benchmark the performance of <%=colname%>() and <%=rowname%>() on subsetted computation. <% for (mode in c("integer", "double")) { %> ## Data type "<%=mode%>" ### Data ```r <%=withCapture({ <%@include file="R/random-matrices.R"%> data <- rmatrices(mode = mode) })%> ``` ### Results <% for (dataLabel in names(data)) { %> <% mprintf("%s: %s\n", mode, dataLabel) %> #### <%=dataLabel%> <%=mode%> matrix ```r <%=withCapture({ X <- data[[.dataLabel.]] rows <- sample.int(nrow(X), size = nrow(X)*0.7) cols <- sample.int(ncol(X), size = ncol(X)*0.7) X_S <- X[rows, cols] gc() colStats <- microbenchmark( "colCumsums_X_S" = colCumsums(X_S), "colCumsums(X, rows, cols)" = colCumsums(X, rows = rows, cols = cols), "colCummins(X[rows, cols])" = colCumsums(X[rows, cols]), unit = "ms" ) X <- t(X) X_S <- t(X_S) gc() rowStats <- microbenchmark( "rowCumsums_X_S" = rowCumsums(X_S), "rowCumsums(X, cols, rows)" = rowCumsums(X, rows = cols, cols = rows), "rowCumsums(X[cols, rows])" = rowCumsums(X[cols, rows]), unit = "ms" ) })%> ``` <% crBenchmarkResults(colStats, rowStats, tags=c(mode, dataLabel)) %> <% } # for (dataLabel ...) %> <% } # for (mode ...) %> <%@include file="${footer}"%> <%--------------------------------------------------------------------------- HISTORY: 2015-06-06 o Created. ---------------------------------------------------------------------------%> matrixStats/inst/doc/0000755000175100001440000000000013073627232014342 5ustar hornikusersmatrixStats/inst/doc/matrixStats-methods.md.rsp0000644000175100001440000002131013073627232021450 0ustar hornikusers<%@meta language="R-vignette" content="-------------------------------- DIRECTIVES FOR R: %\VignetteIndexEntry{matrixStats: Summary of functions} %\VignetteAuthor{Henrik Bengtsson} %\VignetteKeyword{matrix} %\VignetteKeyword{vector} %\VignetteKeyword{apply} %\VignetteKeyword{rows} %\VignetteKeyword{columns} %\VignetteKeyword{memory} %\VignetteKeyword{speed} %\VignetteEngine{R.rsp::rsp} %\VignetteTangle{FALSE} --------------------------------------------------------------------"%> <% pkgName <- "matrixStats" library(pkgName, character.only=TRUE) ns <- getNamespace(pkgName) env <- as.environment(sprintf("package:%s", pkgName)) R.utils::use("R.utils") kable <- function(df, ...) { fcns <- as.character(df$Functions) fcns <- strsplit(fcns, split=",") fcns <- sapply(fcns, FUN=function(names) { names <- trim(names) ok <- sapply(names, FUN=exists, envir=ns, mode="function") names[ok] <- sprintf("%s()", names[ok]) names[!ok] <- sprintf("~~%s()~~", names[!ok]) names <- paste(names, collapse=", ") }) df$Functions <- fcns df$Example <- sprintf("`%s`", df$Example) print(knitr::kable(df, ..., format="markdown")) } # Find all functions all <- ls(envir=env) keep <- sapply(all, FUN=function(name) { is.function(get(name, envir=env)) }) all <- all[keep] keep <- !grepl("[.]([^.]*)$", all) all <- all[keep] # Hidden functions skip <- c("rowAvgsPerColSet", "colAvgsPerRowSet") skip <- c(skip, "allocArray", "allocMatrix", "allocVector") all <- setdiff(all, skip) # Column and row functions crfcns <- grep("^(col|row)", all, value=TRUE) # Vector functions vfcns <- setdiff(all, crfcns) %> # <%@meta name="title"%> <% pkg <- R.oo::Package(pkgName) %> <%@meta name="author"%> on <%=format(as.Date(pkg$date), format="%B %d, %Y")%> <% fcns <- crfcns base <- gsub("^(col|row)", "", fcns) groups <- tapply(fcns, base, FUN=list) stopifnot(all(sapply(groups, FUN=length) == 2L)) groups <- matrix(unlist(groups, use.names=FALSE), nrow=2L) %> <%--- ## Functions that apply to column and rows of matrices ``` <% print(fcns) %> ``` ---%> <% fcns <- vfcns %> <%--- ## Functions that apply to vectors ``` <% print(fcns) %> ``` ---%> ## Location and scale estimators <% tbl <- NULL row <- data.frame( "Estimator" = "Weighted sample mean", "Functions" = "weightedMean, colWeightedMeans, rowWeightedMeans", "Example" = "weightedMean(x, w); rowWeightedMeans(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Mean", "Functions" = "mean2, colMeans2, rowMeans2", "Example" = "mean2(x); rowMeans2(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Median", "Functions" = "median, colMedians, rowMedians", "Example" = "median(x); rowMedians(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Weighted median", "Functions" = "weightedMedian, colWeightedMedians, rowWeightedMedians", "Example" = "weightedMedian(x, w); rowWeightedMedians(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample variance", "Functions" = "var, colVars, rowVars", "Example" = "var(x); rowVars(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Weighted sample variance", "Functions" = "weightedVar, colWeightedVars, rowWeightedVars", "Example" = "weightedVar(x, w), rowWeightedVars(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample variance by n-order differences", "Functions" = "varDiff, colVarDiffs, rowVarDiffs", "Example" = "varDiff(x); rowVarDiffs(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample standard deviation", "Functions" = "sd, colSds, rowSds", "Example" = "sd(x); rowSds(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Weighted sample deviation", "Functions" = "weightedSd, colWeightedSds, rowWeightedSds", "Example" = "weightedSd(x, w), rowWeightedSds(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample standard deviation by n-order differences", "Functions" = "sdDiff, colSdDiffs, rowSdDiffs", "Example" = "sdDiff(x); rowSdDiffs(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Median absolute deviation (MAD)", "Functions" = "mad, colMads, rowMads", "Example" = "mad(x); rowMads(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Weighted median absolute deviation (MAD)", "Functions" = "weightedMad, colWeightedMads, rowWeightedMads", "Example" = "weightedMad(x, w), rowWeightedMads(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Median absolute deviation (MAD) by n-order differences", "Functions" = "madDiff, colMadDiffs, rowMadDiffs", "Example" = "madDiff(x); rowMadDiffs()" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Quantile", "Functions" = "quantile, colQuantiles, rowQuantiles", "Example" = "quantile(x, probs); rowQuantiles(x, probs)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Interquartile range (IQR)", "Functions" = "iqr, colIQRs, rowIQRs", "Example" = "iqr(x); rowIQRs(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Interquartile range (IQR) by n-order differences", "Functions" = "iqrDiff, colIQRDiffs, rowIQRDiffs", "Example" = "iqrDiff(x); rowIQRDiffs(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Range", "Functions" = "range, colRanges, rowRanges", "Example" = "range(x); rowRanges(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Minimum", "Functions" = "min, colMins, rowMins", "Example" = "min(x); rowMins(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Maximum", "Functions" = "max, colMaxs, rowMaxs", "Example" = "max(x); rowMaxs(x)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ## Testing for and counting values <% tbl <- NULL row <- data.frame( "Operator" = "Are there any missing values?", "Functions" = "anyMissing, colAnyMissings, rowAnyMissings", "Example" = "anyMissing(x); rowAnyMissings(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Does TRUE exists?", "Functions" = "any, colAnys, rowAnys", "Example" = "any(x); rowAnys(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Are all values TRUE?", "Functions" = "all, colAlls, rowAlls", "Example" = "all(x); rowAlls(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Does value exists?", "Functions" = "anyValue, colAnys, rowAnys", "Example" = "anyValue(x, value); rowAnys(x, value)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Do all elements have a given value?", "Functions" = "allValue, colAlls, rowAlls", "Example" = "allValue(x, value); rowAlls(x, value)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Number of occurrences of a value?", "Functions" = "count, colCounts, rowCounts", "Example" = "count(x, value); rowCounts(x, value)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ## Cumulative functions <% tbl <- NULL row <- data.frame( "Operator" = "Cumulative sum", "Functions" = "cumsum, colCumsums, rowCumsums", "Example" = "cumsum(x); rowCumsums(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Cumulative product", "Functions" = "cumprod, colCumprods, rowCumprods", "Example" = "cumprod(x); rowCumprods(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Cumulative minimum", "Functions" = "cummin, colCummins, rowCummins", "Example" = "cummin(x); rowCummins(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Cumulative maximum", "Functions" = "cummax, colCummaxs, rowCummaxs", "Example" = "cummax(x); rowCummaxs(x)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ## Binning <% tbl <- NULL row <- data.frame( "Estimator" = "Counts in disjoint bins", "Functions" = "binCounts", "Example" = "binCounts(x, bx)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample means (and counts) in disjoint bins", "Functions" = "binMeans", "Example" = "binMeans(y, x, bx)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ## Miscellaneous <% tbl <- NULL row <- data.frame( "Operation" = "Sum", "Functions" = "sum2, colSums2, rowSums2", "Example" = "sum2(x); rowSums2(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operation" = "Lagged differences", "Functions" = c("diff2, colDiffs, rowDiffs"), "Example" = "diff2(x), rowDiffs(x)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ------------------------------------------------------------- <%=pkgName%> v<%=getVersion(pkg)%>. Release: [CRAN](https://cran.r-project.org/package=<%=pkgName%>), Development: [GitHub](<%=getUrl(pkg)%>). matrixStats/inst/doc/matrixStats-methods.html0000644000175100001440000002244513073627232021223 0ustar hornikusers matrixStats: Summary of functions

matrixStats: Summary of functions

Henrik Bengtsson on April 13, 2017

Location and scale estimators

Estimator Functions Example
Weighted sample mean weightedMean(), colWeightedMeans(), rowWeightedMeans() weightedMean(x, w); rowWeightedMeans(x, w)
Mean mean2(), colMeans2(), rowMeans2() mean2(x); rowMeans2(x)
Median median(), colMedians(), rowMedians() median(x); rowMedians(x)
Weighted median weightedMedian(), colWeightedMedians(), rowWeightedMedians() weightedMedian(x, w); rowWeightedMedians(x, w)
Sample variance var(), colVars(), rowVars() var(x); rowVars(x)
Weighted sample variance weightedVar(), colWeightedVars(), rowWeightedVars() weightedVar(x, w), rowWeightedVars(x, w)
Sample variance by n-order differences varDiff(), colVarDiffs(), rowVarDiffs() varDiff(x); rowVarDiffs(x)
Sample standard deviation sd(), colSds(), rowSds() sd(x); rowSds(x)
Weighted sample deviation weightedSd(), colWeightedSds(), rowWeightedSds() weightedSd(x, w), rowWeightedSds(x, w)
Sample standard deviation by n-order differences sdDiff(), colSdDiffs(), rowSdDiffs() sdDiff(x); rowSdDiffs(x)
Median absolute deviation (MAD) mad(), colMads(), rowMads() mad(x); rowMads(x)
Weighted median absolute deviation (MAD) weightedMad(), colWeightedMads(), rowWeightedMads() weightedMad(x, w), rowWeightedMads(x, w)
Median absolute deviation (MAD) by n-order differences madDiff(), colMadDiffs(), rowMadDiffs() madDiff(x); rowMadDiffs()
Quantile quantile(), colQuantiles(), rowQuantiles() quantile(x, probs); rowQuantiles(x, probs)
Interquartile range (IQR) iqr(), colIQRs(), rowIQRs() iqr(x); rowIQRs(x)
Interquartile range (IQR) by n-order differences iqrDiff(), colIQRDiffs(), rowIQRDiffs() iqrDiff(x); rowIQRDiffs(x)
Range range(), colRanges(), rowRanges() range(x); rowRanges(x)
Minimum min(), colMins(), rowMins() min(x); rowMins(x)
Maximum max(), colMaxs(), rowMaxs() max(x); rowMaxs(x)

Testing for and counting values

Operator Functions Example
Are there any missing values? anyMissing(), colAnyMissings(), rowAnyMissings() anyMissing(x); rowAnyMissings(x)
Does TRUE exists? any(), colAnys(), rowAnys() any(x); rowAnys(x)
Are all values TRUE? all(), colAlls(), rowAlls() all(x); rowAlls(x)
Does value exists? anyValue(), colAnys(), rowAnys() anyValue(x, value); rowAnys(x, value)
Do all elements have a given value? allValue(), colAlls(), rowAlls() allValue(x, value); rowAlls(x, value)
Number of occurrences of a value? count(), colCounts(), rowCounts() count(x, value); rowCounts(x, value)

Cumulative functions

Operator Functions Example
Cumulative sum cumsum(), colCumsums(), rowCumsums() cumsum(x); rowCumsums(x)
Cumulative product cumprod(), colCumprods(), rowCumprods() cumprod(x); rowCumprods(x)
Cumulative minimum cummin(), colCummins(), rowCummins() cummin(x); rowCummins(x)
Cumulative maximum cummax(), colCummaxs(), rowCummaxs() cummax(x); rowCummaxs(x)

Binning

Estimator Functions Example
Counts in disjoint bins binCounts() binCounts(x, bx)
Sample means (and counts) in disjoint bins binMeans() binMeans(y, x, bx)

Miscellaneous

Operation Functions Example
Sum sum2(), colSums2(), rowSums2() sum2(x); rowSums2(x)
Lagged differences diff2(), colDiffs(), rowDiffs() diff2(x), rowDiffs(x)

matrixStats v0.52.2. Release: CRAN, Development: GitHub.

matrixStats/tests/0000755000175100001440000000000013073627232013762 5ustar hornikusersmatrixStats/tests/rowOrderStats_subset.R0000644000175100001440000000237513073232324020315 0ustar hornikuserslibrary("matrixStats") rowOrderStats_R <- function(x, probs, ...) { ans <- apply(x, MARGIN = 1L, FUN = quantile, probs = probs, type = 3L) # Remove Attributes attributes(ans) <- NULL ans } # rowOrderStats_R() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" probs <- 0.3 for (rows in index_cases) { for (cols in index_cases) { if (is.null(cols)) which <- round(probs * ncol(x)) else { xxrows <- rows suppressWarnings({ xx <- tryCatch(x[, cols, drop = FALSE], error = function(c) "error") if (identical(xx, "error")) which <- 0 else which <- round(probs * ncol(xx)) }) } if (which == 0) next validateIndicesTestMatrix(x, rows, cols, ftest = rowOrderStats, fsure = rowOrderStats_R, which = which, probs = probs) validateIndicesTestMatrix(x, rows, cols, fcoltest = colOrderStats, fsure = rowOrderStats_R, which = which, probs = probs) } } matrixStats/tests/x_OP_y_subset.R0000644000175100001440000000473013073232324016665 0ustar hornikuserslibrary("matrixStats") x_OP_y_R <- function(x, y, OP, na.rm = FALSE) { if (na.rm) { xnok <- is.na(x) ynok <- is.na(y) anok <- xnok & ynok unit <- switch(OP, "+" = 0, "-" = NA_real_, "*" = 1, "/" = NA_real_, stop("Unknown 'OP' operator: ", OP) ) x[xnok] <- unit y[ynok] <- unit } ans <- switch(OP, "+" = x + y, "-" = x - y, "*" = x * y, "/" = x / y, stop("Unknown 'OP' operator: ", OP) ) if (na.rm) { ans[anok] <- NA_real_ } ans } # x_OP_y_R() t_tx_OP_y_R <- function(x, y, OP, na.rm = FALSE) { t(x_OP_y_R(x = t(x), y = y, OP = OP, na.rm = na.rm)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") for (OP in c("+", "-", "*", "/")) { for (mode in c("numeric", "integer")) { x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6L, ncol = 6L) y <- runif(6, min = 0, max = 6) storage.mode(x) <- mode storage.mode(y) <- mode if (mode == "numeric") y[1] <- Inf for (xrows in index_cases) { for (xcols in index_cases) { if (is.null(xrows)) xrows <- seq_len(nrow(x)) if (is.null(xcols)) xcols <- seq_len(ncol(x)) for (yidxs in list(xrows, xcols)) { for (na.rm in c(TRUE, FALSE)) { suppressWarnings({ actual <- tryCatch( x_OP_y(x, y, OP, xrows = xrows, xcols = xcols, yidxs = yidxs, na.rm = na.rm), error = function(c) "error" ) expect <- tryCatch( x_OP_y_R(x[xrows, xcols, drop = FALSE], y[yidxs], OP, na.rm = na.rm), error = function(c) "error" ) }) stopifnot(all.equal(as.vector(actual), as.vector(expect))) suppressWarnings({ actual <- tryCatch( t_tx_OP_y(x, y, OP, xrows = xrows, xcols = xcols, yidxs = yidxs, na.rm = na.rm), error = function(c) "error" ) expect <- tryCatch( t_tx_OP_y_R(x[xrows, xcols, drop = FALSE], y[yidxs], OP, na.rm = na.rm), error = function(c) "error" ) }) stopifnot(all.equal(as.vector(actual), as.vector(expect))) } } } } } } matrixStats/tests/rowWeightedVars_subset.R0000644000175100001440000000244613073232324020616 0ustar hornikuserslibrary("matrixStats") fcns <- list( weightedVar = c(rowWeightedVars, colWeightedVars), weightedSd = c(rowWeightedSds, colWeightedSds), weightedMad = c(rowWeightedMads, colWeightedMads) ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") for (fcn in names(fcns)) { cat(sprintf("subsetted tests on matrix %s()...\n", fcn)) row_fcn <- fcns[[fcn]][[1]] col_fcn <- fcns[[fcn]][[2]] for (mode in c("numeric", "integer")) { x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) w <- runif(6, min = 0, max = 6) storage.mode(x) <- mode storage.mode(w) <- mode if (mode == "numeric") w[1] <- Inf for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix_w(x, w, rows, cols, ftest = row_fcn, fsure = row_fcn, na.rm = na.rm) validateIndicesTestMatrix_w(x, w, rows, cols, fcoltest = col_fcn, fsure = row_fcn, na.rm = na.rm) } } } } cat(sprintf("%s()...DONE\n", fcn)) } matrixStats/tests/signTabulate.R0000644000175100001440000000203513073232324016521 0ustar hornikuserslibrary("matrixStats") signTabulate0 <- function(x, ...) { nneg <- sum(x < 0, na.rm = TRUE) nzero <- sum(x == 0, na.rm = TRUE) npos <- sum(x > 0, na.rm = TRUE) nna <- sum(is.na(x)) nneginf <- sum(is.infinite(x) & x < 0, na.rm = TRUE) nposinf <- sum(is.infinite(x) & x > 0, na.rm = TRUE) res <- c(nneg, nzero, npos, nna, nneginf, nposinf) res <- as.double(res) names(res) <- c("-1", "0", "+1", "NA", "-Inf", "+Inf") if (is.integer(x)) res <- res[1:4] res } # signTabulate0() # Simulate data set.seed(0xBEEF) n <- 1e3 x <- runif(n) x[sample(n, size = 0.1 * n)] <- 0 x[sample(n, size = 0.1 * n)] <- NA_real_ x[sample(n, size = 0.1 * n)] <- -Inf x[sample(n, size = 0.1 * n)] <- +Inf # Doubles message("Doubles:") counts0 <- signTabulate0(x) print(counts0) counts1 <- signTabulate(x) print(counts1) stopifnot(identical(counts1, counts0)) # Integers message("Integers:") x <- suppressWarnings(as.integer(x)) counts0 <- signTabulate0(x) print(counts0) counts1 <- signTabulate(x) print(counts1) stopifnot(identical(counts1, counts0)) matrixStats/tests/rowMeans2.R0000644000175100001440000001414313073232324015757 0ustar hornikuserslibrary("matrixStats") for (mode in c("integer", "double")) { x <- matrix(1:9 + 0.1, nrow = 3, ncol = 3) storage.mode(x) <- mode y0 <- rowMeans(x, na.rm = FALSE) y1 <- rowMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = FALSE) y1 <- colMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Single-element matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Single-element matrix:\n") for (mode in c("integer", "double")) { x <- matrix(1, nrow = 1, ncol = 1) storage.mode(x) <- mode y0 <- rowMeans(x, na.rm = FALSE) y1 <- rowMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = FALSE) y1 <- colMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Empty matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Empty matrix:\n") for (mode in c("integer", "double")) { x <- matrix(integer(0), nrow = 0, ncol = 0) storage.mode(x) <- mode y0 <- rowMeans(x, na.rm = FALSE) y1 <- rowMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = FALSE) y1 <- colMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All NAs:\n") for (mode in c("integer", "double")) { x <- matrix(NA_integer_, nrow = 3, ncol = 3) storage.mode(x) <- mode y0 <- rowMeans(x, na.rm = TRUE) y1 <- rowMeans2(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = TRUE) y1 <- colMeans2(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All NaNs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All NaNs:\n") x <- matrix(NA_real_, nrow = 3, ncol = 3) y0 <- rowMeans(x, na.rm = TRUE) y1 <- rowMeans2(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = TRUE) y1 <- colMeans2(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All Infs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All Infs:\n") x <- matrix(Inf, nrow = 3, ncol = 3) y0 <- rowMeans(x, na.rm = FALSE) y1 <- rowMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = FALSE) y1 <- colMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All -Infs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All -Infs:\n") x <- matrix(-Inf, nrow = 3, ncol = 3) y0 <- rowMeans(x, na.rm = FALSE) y1 <- rowMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = FALSE) y1 <- colMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Infs and -Infs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Infs and -Infs:\n") x <- matrix(c(-Inf, +Inf), nrow = 4, ncol = 4) y0 <- rowMeans(x, na.rm = FALSE) y1 <- rowMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = FALSE) y1 <- colMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: NaNs and NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Infs and -Infs:\n") x <- matrix(c(NaN, NA_real_), nrow = 4, ncol = 4) y0 <- rowMeans(x, na.rm = FALSE) str(y0) stopifnot(all(is.na(y0)), length(unique(y0)) >= 1L) y1 <- rowMeans2(x, na.rm = FALSE) str(y1) stopifnot(all(is.na(y1)), length(unique(y1)) >= 1L) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = FALSE) stopifnot(all(is.na(y0)), length(unique(y0)) == 1L) y1 <- colMeans2(x, na.rm = FALSE) stopifnot(all(is.na(y1)), length(unique(y1)) == 1L) ## NOTE, due to compiler optimization, it is not guaranteed that NA is ## returned here (as one would expect). NaN might very well be returned, ## when both NA and NaN are involved. This is an accepted feature in R, ## which is documented in help("is.nan"). See also ## https://stat.ethz.ch/pipermail/r-devel/2017-April/074009.html. ## Thus, we cannot guarantee that y1 is identical to y0. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Integer overflow with ties # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Integer overflow with ties:\n") x <- matrix(.Machine$integer.max, nrow = 4, ncol = 4) y0 <- rowMeans(x, na.rm = FALSE) y1 <- rowMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMeans(x, na.rm = FALSE) y1 <- colMeans2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Consistency checks # - - - - - - - - - - - - - - - - - - - - - - - - - - - - set.seed(1) cat("Consistency checks:\n") n_sims <- if (Sys.getenv("_R_CHECK_USE_VALGRIND_") != "") 4L else 20L for (kk in seq_len(n_sims)) { cat("Random test #", kk, "\n", sep = "") # Simulate data in a matrix of any shape dim <- sample(50:200, size = 2) n <- prod(dim) x <- rnorm(n, sd = 100) dim(x) <- dim # Add NAs? if ((kk %% 4) %in% c(3, 0)) { cat("Adding NAs\n") nna <- sample(n, size = 1) na_values <- c(NA_real_, NaN) t <- sample(na_values, size = nna, replace = TRUE) x[sample(length(x), size = nna)] <- t } # Integer or double? if ((kk %% 4) %in% c(2, 0)) { cat("Coercing to integers\n") storage.mode(x) <- "integer" } na.rm <- sample(c(TRUE, FALSE), size = 1) # rowMeans(): y0 <- rowMeans(x, na.rm = na.rm) y1 <- rowMeans2(x, na.rm = na.rm) stopifnot(all.equal(y1, y0)) y2 <- colMeans2(t(x), na.rm = na.rm) stopifnot(all.equal(y2, y0)) # colMeans2(): y0 <- colMeans(x, na.rm = na.rm) y1 <- colMeans2(x, na.rm = na.rm) stopifnot(all.equal(y1, y0)) y2 <- rowMeans2(t(x), na.rm = na.rm) stopifnot(all.equal(y2, y0)) } # for (kk ...) matrixStats/tests/diff2.R0000644000175100001440000000112213073232324015065 0ustar hornikuserslibrary("matrixStats") set.seed(0x42) for (mode in c("integer", "double")) { x <- rnorm(10, sd = 5) storage.mode(x) <- mode str(x) for (has_na in c(FALSE, TRUE)) { if (has_na) { x[sample(1:10, size = 3)] <- NA } for (l in 1:3) { for (d in 1:4) { cat(sprintf("%s: NAs = %s, lag = %d, differences = %d\n", mode, has_na, l, d)) y0 <- diff(x, lag = l, differences = d) str(y0) y1 <- diff2(x, lag = l, differences = d) str(y1) stopifnot(identical(y1, y0)) } } } # for (has_na ...) } matrixStats/tests/rowCumMinMaxs_subset.R0000644000175100001440000000261313073232324020237 0ustar hornikuserslibrary("matrixStats") rowCummins_R <- function(x) { suppressWarnings({ y <- t(apply(x, MARGIN = 1L, FUN = cummin)) }) dim(y) <- dim(x) y } rowCummaxs_R <- function(x) { mode <- storage.mode(x) # Change mode because a bug is detected on cummax for integer in R-3.2.0 storage.mode(x) <- "numeric" suppressWarnings({ y <- t(apply(x, MARGIN = 1L, FUN = cummax)) }) dim(y) <- dim(x) storage.mode(y) <- mode y } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -3, max = 3), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = rowCummins, fsure = rowCummins_R) validateIndicesTestMatrix(x, rows, cols, ftest = function(x, rows, cols, ...) { t(colCummins(t(x), rows = cols, cols = rows)) }, fsure = rowCummins_R) validateIndicesTestMatrix(x, rows, cols, ftest = rowCummaxs, fsure = rowCummaxs_R) validateIndicesTestMatrix(x, rows, cols, ftest = function(x, rows, cols, ...) { t(colCummaxs(t(x), rows = cols, cols = rows)) }, fsure = rowCummaxs_R) } } matrixStats/tests/rowRanks.R0000644000175100001440000000276013073232324015712 0ustar hornikuserslibrary("matrixStats") set.seed(1) cat("Consistency checks:\n") for (kk in 1:4) { cat("Random test #", kk, "\n", sep = "") # Simulate data in a matrix of any shape dim <- sample(40:80, size = 2L) n <- prod(dim) x <- rnorm(n, sd = 10) dim(x) <- dim # Add NAs? if ((kk %% 4) %in% c(3, 0)) { cat("Adding NAs\n") nna <- sample(n, size = 1L) x[sample(length(x), size = nna)] <- NA_real_ } # Integer or double? if ((kk %% 4) %in% c(2, 0)) { cat("Coercing to integers\n") storage.mode(x) <- "integer" } str(x) for (ties in c("max", "min", "average")) { cat(sprintf("ties.method = %s\n", ties)) # rowRanks(): y1 <- matrixStats::rowRanks(x, ties.method = ties) y2 <- t(apply(x, MARGIN = 1L, FUN = rank, na.last = "keep", ties.method = ties)) stopifnot(identical(y1, y2)) y3 <- matrixStats::colRanks(t(x), ties.method = ties) stopifnot(identical(y1, y3)) # colRanks(): y1 <- matrixStats::colRanks(x, ties.method = ties) y2 <- t(apply(x, MARGIN = 2L, FUN = rank, na.last = "keep", ties.method = ties)) stopifnot(identical(y1, y2)) y3 <- matrixStats::rowRanks(t(x), ties.method = ties) stopifnot(identical(y1, y3)) } } # for (kk ...) ## Exception handling x <- matrix(1:12, nrow = 3L) y <- try(rowRanks(x, ties.method = "unknown"), silent = TRUE) stopifnot(inherits(y, "try-error")) y <- try(colRanks(x, ties.method = "unknown"), silent = TRUE) stopifnot(inherits(y, "try-error")) matrixStats/tests/rowCollapse.R0000644000175100001440000000133313073232324016371 0ustar hornikuserslibrary("matrixStats") x <- matrix(1:27, ncol = 3) idxs <- 1L y <- rowCollapse(x, idxs) stopifnot(identical(y, x[, idxs])) y2 <- colCollapse(t(x), idxs) stopifnot(identical(y2, y)) idxs <- 2L y <- rowCollapse(x, idxs) stopifnot(identical(y, x[, idxs])) y2 <- colCollapse(t(x), idxs) stopifnot(identical(y2, y)) idxs <- c(1, 1, 1, 1, 1, 3, 3, 3, 3) y <- rowCollapse(x, idxs) stopifnot(identical(y, c(x[1:5, 1], x[6:9, 3]))) y2 <- colCollapse(t(x), idxs) stopifnot(identical(y2, y)) idxs <- 1:3 y <- rowCollapse(x, idxs) print(y) y_truth <- c(x[1, 1], x[2, 2], x[3, 3], x[4, 1], x[5, 2], x[6, 3], x[7, 1], x[8, 2], x[9, 3]) stopifnot(identical(y, y_truth)) y2 <- colCollapse(t(x), idxs) stopifnot(identical(y2, y)) matrixStats/tests/count_subset.R0000644000175100001440000000166613073232324016625 0ustar hornikuserslibrary("matrixStats") count_R <- function(x, value = TRUE, na.rm = FALSE, ...) { if (is.na(value)) { counts <- sum(is.na(x)) } else { counts <- sum(x == value, na.rm = na.rm) } as.integer(counts) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- runif(6, min = -3, max = 3) storage.mode(x) <- "integer" for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = count, fsure = count_R, value = 0, na.rm = TRUE) validateIndicesTestVector(x, idxs, ftest = count, fsure = count_R, value = 0, na.rm = FALSE) validateIndicesTestVector(x, idxs, ftest = count, fsure = count_R, value = NA_integer_) } matrixStats/tests/weightedMean.R0000644000175100001440000000436413073232324016507 0ustar hornikuserslibrary("matrixStats") for (mode in c("integer", "double")) { cat("mode: ", mode, "", sep = "") n <- 2L x <- runif(n, min = -5, max = 5) storage.mode(x) <- mode str(x) cat("All weights are 1\n") w <- rep(1, times = n) m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) str(list(m0 = m0, m1 = m1)) stopifnot(identical(m1, m0)) cat("First weight is 5\n") # Pull the mean towards zero w[1] <- 5 str(w) m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) str(list(m0 = m0, m1 = m1)) stopifnot(identical(m1, m0)) cat("All weights are 0\n") # All weights set to zero w <- rep(0, times = n) m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) str(list(m0 = m0, m1 = m1)) stopifnot(identical(m1, m0)) cat("First weight is 8.5\n") # Put even more weight on the zero w[1] <- 8.5 m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) str(list(m0 = m0, m1 = m1)) stopifnot(identical(m1, m0)) cat("First weight is Inf\n") # All weight on the first value w[1] <- Inf m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) str(list(m0 = m0, m1 = m1)) stopifnot(identical(m1, m0)) cat("Last weight is Inf\n") # All weight on the last value w[1] <- 1 w[n] <- Inf m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) str(list(m0 = m0, m1 = m1)) stopifnot(identical(m1, m0)) } # for (mode ...) message("*** Testing for missing values") # NA tests xs <- list(A = c(1, 2, 3), B = c(NA, 2, 3), C = c(NA, 2, 3)) ws <- list(A = c(1, 1, 1), B = c(NA, 1, 1), C = c(1, NA, 1)) ## NOTE: The (B, B) case with na.rm = TRUE is interesting because ## even if NAs in 'w' are not dropped by na.rm = TRUE, this one ## is because 'x' is dropped and therefore that first element ## is skipped in the computation. It basically does ## keep <- !is.na(x); x <- x[keep]; w <- w[keep] ## without looking at 'w'. for (x in xs) { for (mode in c("integer", "double")) { storage.mode(x) <- mode for (w in ws) { for (na.rm in c(FALSE, TRUE)) { cat(sprintf("mode: %s, na.rm = %s\n", mode, na.rm)) str(list(x = x, w = w)) m0 <- weighted.mean(x, w, na.rm = na.rm) m1 <- weightedMean(x, w, na.rm = na.rm) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) } } } } matrixStats/tests/rowProds.R0000644000175100001440000000427713073232324015730 0ustar hornikuserslibrary("matrixStats") rowProds_R <- function(x, FUN = prod, na.rm = FALSE, ...) { y <- apply(x, MARGIN = 1L, FUN = FUN, na.rm = na.rm) y } all.equal.na <- function(target, current, ...) { # Computations involving NaN may return NaN or NA, cf. ?is.nan current[is.nan(current)] <- NA_real_ target[is.nan(target)] <- NA_real_ all.equal(target, current, ...) } for (mode in c("integer", "double")) { # Missing values x <- matrix(c(1, NA, NaN, 1, 1, 0, 1, 0), nrow = 4, ncol = 2) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) y0 <- rowProds_R(x, na.rm = TRUE) print(y0) y1 <- rowProds(x, na.rm = TRUE) print(y1) y2 <- colProds(t(x), na.rm = TRUE) print(y2) stopifnot(all.equal(y1, y0)) stopifnot(all.equal(y1, x[, 2])) stopifnot(all.equal(y2, y1)) # Missing values y0 <- rowProds_R(x, na.rm = FALSE) print(y0) y1 <- rowProds(x, na.rm = FALSE) print(y1) y2 <- colProds(t(x), na.rm = FALSE) print(y2) stopifnot(all.equal.na(y1, y0)) stopifnot(all.equal(y2, y1)) y3 <- x[, 1] * x[, 2] print(y3) stopifnot(all.equal.na(y1, y3)) # "Empty" rows y0 <- rowProds_R(x[integer(0), , drop = FALSE], na.rm = FALSE) print(y0) y1 <- rowProds(x[integer(0), , drop = FALSE], na.rm = FALSE) print(y1) y2 <- colProds(t(x[integer(0), , drop = FALSE]), na.rm = FALSE) print(y2) stopifnot(all.equal.na(y1, y0)) stopifnot(all.equal(y2, y1)) stopifnot(length(y1) == 0L) # Using product() y1 <- rowProds(x, method = "expSumLog", na.rm = FALSE) print(y1) y2 <- colProds(t(x), method = "expSumLog", na.rm = FALSE) print(y2) stopifnot(all.equal(y2, y1)) } # for (mode ...) # Bug report 2012-06-25 x <- matrix(c(1, 1, 1, 1, 1, 0, 1, 0), nrow = 4, ncol = 2) y0 <- rowProds_R(x) print(y0) y1 <- rowProds(x) print(y1) y2 <- colProds(t(x)) print(y2) stopifnot(all.equal.na(y1, y0)) stopifnot(all.equal.na(y1, x[, 1] * x[, 2])) stopifnot(all.equal.na(y2, y1)) # Bug report 2014-03-25 ("all rows contains a zero") x <- matrix(c(0, 1, 1, 0), nrow = 2, ncol = 2) y0 <- rowProds_R(x) print(y0) y1 <- rowProds(x) print(y1) y2 <- colProds(t(x)) print(y2) stopifnot(all.equal.na(y1, y0)) stopifnot(all.equal.na(y1, c(0, 0))) stopifnot(all.equal.na(y2, y1)) matrixStats/tests/x_OP_y.R0000644000175100001440000000730013073232324015274 0ustar hornikuserslibrary("matrixStats") x_OP_y_R <- function(x, y, OP, na.rm = FALSE) { if (na.rm) { xnok <- is.na(x) ynok <- is.na(y) anok <- xnok & ynok unit <- switch(OP, "+" = 0, "-" = NA_real_, "*" = 1, "/" = NA_real_, stop("Unknown 'OP' operator: ", OP) ) x[xnok] <- unit y[ynok] <- unit } ans <- switch(OP, "+" = x + y, "-" = x - y, "*" = x * y, "/" = x / y, stop("Unknown 'OP' operator: ", OP) ) if (na.rm) { ans[anok] <- NA_real_ } ans } # x_OP_y_R() t_tx_OP_y_R <- function(x, y, OP, na.rm = FALSE) { t(x_OP_y_R(x = t(x), y = y, OP = OP, na.rm = na.rm)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # No missing values # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(1:16, nrow = 4, ncol = 4) y <- 1:nrow(x) storage.mode(y) <- storage.mode(x) for (OP in c("+", "-", "*", "/")) { for (na.rm in c(FALSE, TRUE)) { cat(sprintf("OP = '%s', na.rm = %s\n", OP, na.rm)) a0 <- x_OP_y_R(x, y, OP, na.rm = na.rm) a1 <- x_OP_y(x, y, OP, na.rm = na.rm) str(a1) stopifnot(all.equal(a1, a0)) b0 <- t_tx_OP_y_R(x, y, OP, na.rm = na.rm) b1 <- t_tx_OP_y(x, y, OP, na.rm = na.rm) str(b1) stopifnot(all.equal(b1, b0)) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Missing values in x, y, or both. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (which in c("x", "y", "both")) { x <- matrix(1:16, nrow = 4, ncol = 4) y <- 1:nrow(x) storage.mode(y) <- storage.mode(x) if (which == "x") { x[3:6] <- NA_real_ } else if (which == "y") { y[c(1, 3)] <- NA_real_ } else if (which == "both") { x[3:6] <- NA_real_ y[c(1, 3)] <- NA_real_ } for (OP in c("+", "-", "*", "/")) { for (na.rm in c(FALSE, TRUE)) { cat(sprintf("OP = '%s', na.rm = %s\n", OP, na.rm)) a0 <- x_OP_y_R(x, y, OP, na.rm = na.rm) a1 <- x_OP_y(x, y, OP, na.rm = na.rm) str(a1) stopifnot(all.equal(a1, a0)) b0 <- t_tx_OP_y_R(x, y, OP, na.rm = na.rm) b1 <- t_tx_OP_y(x, y, OP, na.rm = na.rm) str(b1) stopifnot(all.equal(b1, b0)) } } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Length differences # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(1:8, nrow = 2, ncol = 4) y <- 1:ncol(x) storage.mode(y) <- storage.mode(x) for (OP in c("+", "-", "*", "/")) { for (na.rm in c(FALSE, TRUE)) { cat(sprintf("OP = '%s', na.rm = %s\n", OP, na.rm)) a0 <- x_OP_y_R(x, y, OP, na.rm = na.rm) a1 <- x_OP_y(x, y, OP, na.rm = na.rm) str(a1) stopifnot(all.equal(a1, a0)) b0 <- t_tx_OP_y_R(x, y, OP, na.rm = na.rm) b1 <- t_tx_OP_y(x, y, OP, na.rm = na.rm) str(b1) stopifnot(all.equal(b1, b0)) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All missing values # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - xs <- list( A = matrix(1:2, nrow = 2, ncol = 2), B = matrix(NA_integer_, nrow = 2, ncol = 2) ) ys <- list( A = 1L, B = NA_integer_ ) for (x in xs) { for (y in ys) { for (mode in c("integer", "double")) { storage.mode(x) <- mode storage.mode(y) <- mode str(list(x = x, y = y)) for (OP in c("+", "-", "*", "/")) { for (na.rm in c(FALSE, TRUE)) { cat(sprintf("mode = '%s', OP = '%s', na.rm = %s\n", mode, OP, na.rm)) suppressWarnings({ z0 <- x_OP_y_R(x, y, OP, na.rm = na.rm) z <- x_OP_y(x, y, OP, na.rm = na.rm) }) str(z) stopifnot(all.equal(z, z0)) } } } # for (mode ...) } # for (y ...) } # for (x ...) matrixStats/tests/rowWeightedMeans_subset.R0000644000175100001440000000211013073232324020732 0ustar hornikuserslibrary("matrixStats") rowWeightedMeans_R <- function(x, w, na.rm = FALSE, ...) { apply(x, MARGIN = 1L, FUN = weighted.mean, w = w, na.rm = na.rm, ...) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") for (mode in c("numeric", "integer")) { x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) w <- runif(6, min = 0, max = 6) storage.mode(x) <- mode storage.mode(w) <- mode if (mode == "numeric") w[1] <- Inf for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix_w(x, w, rows, cols, na.rm = na.rm, ftest = rowWeightedMeans, fsure = rowWeightedMeans_R) validateIndicesTestMatrix_w(x, w, rows, cols, na.rm = na.rm, fcoltest = colWeightedMeans, fsure = rowWeightedMeans_R) } } } } matrixStats/tests/rowCollapse_subset.R0000644000175100001440000000205113073232324017754 0ustar hornikuserslibrary("matrixStats") rowCollapse_R <- function(x, idxs, ...) { ans <- c() storage.mode(ans) <- storage.mode(x) for (ii in seq_len(length(idxs))) { ans[ii] <- x[ii, idxs[ii]] } ans } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" idxs <- seq_len(6) for (rows in index_cases) { if (is.null(rows)) rows <- seq_len(nrow(x)) suppressWarnings({ actual <- tryCatch(rowCollapse(x, idxs, rows = rows), error = function(c) "error") expect <- tryCatch(rowCollapse_R(x[rows, , drop = FALSE], idxs[rows]), error = function(c) "error") }) stopifnot(all.equal(actual, expect)) suppressWarnings({ actual <- tryCatch(colCollapse(t(x), idxs, cols = rows), error = function(c) "error") }) stopifnot(all.equal(actual, expect)) } matrixStats/tests/validateIndices.R0000644000175100001440000000201013073232324017160 0ustar hornikuserslibrary(matrixStats) source("utils/validateIndicesFramework.R") ftest <- function(x, idxs) validateIndices(idxs, length(x)) x <- 1:6 for (idxs in index_cases) { for (mode in c("integer", "numeric", "logical")) { if (!is.null(idxs)) { suppressWarnings({storage.mode(idxs) <- mode}) } validateIndicesTestVector(x, idxs, ftest = ftest, fsure = identity) } } ftest <- function(x, idxs) validateIndices(idxs, length(x)) for (idxs in index_error_cases) { validateIndicesTestVector(x, idxs, ftest = ftest, fsure = identity) } ftest <- function(x, rows, cols) { vr <- validateIndices(rows, dim(x)[1], FALSE) vc <- validateIndices(cols, dim(x)[2], FALSE) stopifnot(all((vr > 0 & vr <= dim(x)[1]) | is.na(vr))) stopifnot(all((vc > 0 & vc <= dim(x)[2]) | is.na(vc))) suppressWarnings(x <- x[vr, vc, drop = FALSE]) x } x <- matrix(1:36, nrow = 6, ncol = 6) for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = ftest, fsure = identity) } } matrixStats/tests/rowAvgsPerColSet_subset.R0000644000175100001440000000266113073232324020702 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) #W <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) for (rows in index_cases) { for (cols in index_cases) { if (is.null(rows)) { rows <- seq_len(nrow(x)) rows_finite <- rows } else { rows_finite <- rows[is.finite(rows)] } if (is.null(cols)) { cols <- seq_len(ncol(x)) cols_finite <- cols } else { cols_finite <- cols[is.finite(cols)] } suppressWarnings({ actual <- tryCatch({ rowAvgsPerColSet(x, rows = rows, S = matrix(cols, ncol = 1), FUN = rowMeans) }, error = function(c) "error") expect <- tryCatch({ rowMeans(x[rows, cols_finite, drop = FALSE], na.rm = TRUE) }, error = function(c) "error") }) stopifnot(all.equal(as.vector(actual), expect)) suppressWarnings({ actual <- tryCatch({ colAvgsPerRowSet(x, cols = cols, S = matrix(rows, ncol = 1), FUN = colMeans) }, error = function(c) "error") expect <- tryCatch({ colMeans(x[rows_finite, cols, drop = FALSE], na.rm = TRUE) }, error = function(c) "error") }) stopifnot(all.equal(as.vector(actual), expect)) } } matrixStats/tests/sum2_subset.R0000644000175100001440000000106213073232324016351 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- runif(6, min = -6, max = 6) storage.mode(x) <- "integer" for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = sum2, fsure = sum, na.rm = FALSE) validateIndicesTestVector(x, idxs, ftest = sum2, fsure = sum, na.rm = TRUE) } matrixStats/tests/rowSds_subset.R0000644000175100001440000000330413073232324016745 0ustar hornikuserslibrary("matrixStats") rowSds_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = sd, na.rm = na.rm) }) } colSds_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 2L, FUN = sd, na.rm = na.rm) }) } rowSds_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- rowWeightedMeans(x, cols = cols, na.rm = na.rm) rowSds(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } colSds_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- colWeightedMeans(x, rows = rows, na.rm = na.rm) colSds(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowSds, fsure = rowSds_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, ftest = rowSds_center, fsure = rowSds_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colSds, fsure = rowSds_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colSds_center, fsure = rowSds_R, na.rm = na.rm) } } } matrixStats/tests/rowDiffs_subset.R0000644000175100001440000000236313073232324017253 0ustar hornikuserslibrary("matrixStats") rowDiffs_R <- function(x, lag = 1L, differences = 1L, ...) { ncol2 <- ncol(x) - lag * differences if (ncol2 <= 0) { return(matrix(x[integer(0L)], nrow = nrow(x), ncol = 0L)) } suppressWarnings({ y <- apply(x, MARGIN = 1L, FUN = diff, lag = lag, differences = differences) }) y <- t(y) dim(y) <- c(nrow(x), ncol2) y } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { for (lag in 1:2) { for (differences in 1:3) { validateIndicesTestMatrix(x, rows, cols, ftest = rowDiffs, fsure = rowDiffs_R, lag = lag, differences = differences) validateIndicesTestMatrix(x, rows, cols, ftest = function(x, rows, cols, ...) { t(colDiffs(t(x), rows = cols, cols = rows, ...)) }, fsure = rowDiffs_R, lag = lag, differences = differences) } } } } matrixStats/tests/rowRanges.R0000644000175100001440000001163713073232324016056 0ustar hornikuserslibrary("matrixStats") rowMins_R <- function(x, ...) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = min, ...) }) } rowMaxs_R <- function(x, ...) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = max, ...) }) } rowRanges_R <- function(x, ...) { suppressWarnings({ ans <- t(apply(x, MARGIN = 1L, FUN = range, ...)) }) dim(ans) <- c(dim(x)[1], 2L) ans } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # With and without some NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") for (add_na in c(FALSE, TRUE)) { cat("add_na = ", add_na, "\n", sep = "") x <- matrix(1:100 + 0.1, nrow = 20, ncol = 5) if (add_na) { x[13:17, c(2, 4)] <- NA_real_ } storage.mode(x) <- mode str(x) # Row/column extremes for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") # Ranges cat("range:\n") r0 <- rowRanges_R(x, na.rm = na.rm) r1 <- rowRanges(x, na.rm = na.rm) r2 <- colRanges(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) # Min cat("min:\n") m0 <- rowMins_R(x, na.rm = na.rm) m1 <- rowMins(x, na.rm = na.rm) m2 <- colMins(t(x), na.rm = na.rm) stopifnot(all.equal(m1, m2)) stopifnot(all.equal(m1, m0)) # Max cat("max:\n") m0 <- rowMaxs_R(x, na.rm = na.rm) m1 <- rowMaxs(x, na.rm = na.rm) m2 <- colMaxs(t(x), na.rm = na.rm) stopifnot(all.equal(m1, m2)) stopifnot(all.equal(m1, m0)) } } # for (add_na ...) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") x <- matrix(NA_real_, nrow = 20, ncol = 5) storage.mode(x) <- mode str(x) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowRanges_R(x, na.rm = na.rm) r1 <- rowRanges(x, na.rm = na.rm) r2 <- colRanges(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) } } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Nx0 matrix x <- matrix(double(0L), nrow = 5L, ncol = 0L) r0 <- rowRanges_R(x) #r1 <- rowRanges(x) #r_truth <- matrix(c(Inf, -Inf), nrow = nrow(x), ncol = 2L, byrow = TRUE) #stopifnot(all.equal(r1, r_truth)) # 0xN matrix x <- t(x) #r1 <- colRanges(x) #stopifnot(all.equal(r1, r_truth)) # Nx1 matrix x <- matrix(1:5, nrow = 5L, ncol = 1L) r1 <- rowRanges(x) r_truth <- matrix(1:5, nrow = nrow(x), ncol = 2L, byrow = FALSE) stopifnot(all.equal(r1, r_truth)) # 1xN matrix x <- t(x) r1 <- colRanges(x) stopifnot(all.equal(r1, r_truth)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Additional tests with NA_integer_, NA_real, NaN, -Inf, +Inf # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(1:12, nrow = 4, ncol = 3) na_list <- list( "integer" = matrix(1:12, nrow = 4, ncol = 3), "integer w/ NA" = matrix(NA_integer_, nrow = 4, ncol = 3), "real" = matrix(as.double(1:12), nrow = 4, ncol = 3), "real w/ NA" = matrix(NA_real_, nrow = 4, ncol = 3) ) na <- na_list[["real"]] na[2, 2] <- NA na_list[["real + NA cell"]] <- na na <- na_list[["real"]] na[2, ] <- NA na_list[["real + NA row"]] <- na na <- na_list[["real"]] na[2, ] <- NaN na_list[["real + NaN row"]] <- na na <- na_list[["real"]] na[2, 2] <- Inf na_list[["real + Inf cell"]] <- na na <- na_list[["real"]] na[2, ] <- Inf na_list[["real + Inf row"]] <- na na <- na_list[["real"]] na[2, 2] <- NaN na_list[["real + NaN cell"]] <- na na <- na_list[["real w/ NA"]] na[2, 2] <- NaN na_list[["real w/ NA + NaN cell"]] <- na na <- na_list[["real w/ NA"]] na[2, ] <- NaN na_list[["real w/ NA + NaN row"]] <- na for (na.rm in c(FALSE, TRUE)) { for (name in names(na_list)) { na <- na_list[[name]] cat(sprintf("%s (%s) w/ na.rm = %s:\n", name, typeof(na), na.rm)) print(na) cat(" min:\n") y0 <- rowMins_R(na, na.rm = na.rm) str(y0) y1 <- rowMins(na, na.rm = na.rm) str(y1) stopifnot(all.equal(y1, y0)) y1c <- colMins(t(na), na.rm = na.rm) str(y1c) stopifnot(all.equal(y1c, y1)) cat(" max:\n") y0 <- rowMaxs_R(na, na.rm = na.rm) str(y0) y1 <- rowMaxs(na, na.rm = na.rm) str(y1) stopifnot(all.equal(y1, y0)) y1c <- colMaxs(t(na), na.rm = na.rm) str(y1c) stopifnot(all.equal(y1c, y1)) cat(" range:\n") y0 <- rowRanges_R(na, na.rm = na.rm) str(y0) y1 <- rowRanges(na, na.rm = na.rm) str(y1) stopifnot(all.equal(y1, y0)) y1c <- colRanges(t(na), na.rm = na.rm) str(y1c) stopifnot(all.equal(y1c, y1)) } # for (name ...) } # for (na.rm ...) matrixStats/tests/allocArray.R0000644000175100001440000000103713073232324016171 0ustar hornikuserslibrary("matrixStats") allocArray_R <- function(nrow, ncol, value = NA) { array(data = value, dim = dim) } values <- list( -1L, 0L, +1L, NA_integer_, .Machine$integer.max, -1, 0, +1, NA_real_, NaN, -Inf, +Inf, .Machine$double.xmin, .Machine$double.xmax, .Machine$double.eps, .Machine$double.neg.eps, FALSE, TRUE, NA ) dim <- c(2L, 4L, 3L) for (value in values) { x0 <- allocArray_R(dim, value = value) x <- allocArray(dim, value = value) str(list(dim = dim, value = value, x = x, x0 = x0)) stopifnot(identical(x, x0)) } matrixStats/tests/count.R0000644000175100001440000000512413073232324015231 0ustar hornikuserslibrary("matrixStats") count_R <- function(x, value = TRUE, na.rm = FALSE, ...) { if (is.na(value)) { counts <- sum(is.na(x)) } else { counts <- sum(x == value, na.rm = na.rm) } as.integer(counts) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Data type: integer and numeric # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- runif(20 * 5, min = -3, max = 3) x[sample.int(length(x), size = 7)] <- 0 storage.mode(x) <- mode for (na.rm in c(FALSE, TRUE)) { # Count zeros n0 <- count_R(x, value = 0, na.rm = na.rm) n1 <- count(x, value = 0, na.rm = na.rm) stopifnot(identical(n1, n0)) all <- allValue(x, value = 0, na.rm = na.rm) any <- anyValue(x, value = 0, na.rm = na.rm) # Count NAs n0 <- count_R(x, value = NA, na.rm = na.rm) n1 <- count(x, value = NA, na.rm = na.rm) stopifnot(identical(n1, n0)) all <- allValue(x, value = NA, na.rm = na.rm) any <- anyValue(x, value = NA, na.rm = na.rm) if (mode == "integer") { ux <- unique(as.vector(x)) n0 <- n1 <- integer(length(x)) for (value in ux) { n0 <- n0 + count_R(x, value = value, na.rm = na.rm) n1 <- n1 + count(x, value = value, na.rm = na.rm) stopifnot(identical(n1, n0)) } stopifnot(all(n0 == ncol(x))) } # if (mode == "integer") } # for (na.rm ...) } # for (mode ...) # All NAs na_list <- list(NA_integer_, NA_real_, NaN) for (na_value in na_list) { x <- rep(na_value, times = 100L) for (na.rm in c(FALSE, TRUE)) { n0 <- count_R(x, na.rm = na.rm) n1 <- count(x, na.rm = na.rm) stopifnot(identical(n1, n0)) # Count NAs n0 <- count_R(x, value = NA, na.rm = na.rm) n1 <- count(x, value = NA, na.rm = na.rm) stopifnot(identical(n1, n0)) any <- anyValue(x, value = NA, na.rm = na.rm) all <- allValue(x, value = NA, na.rm = na.rm) stopifnot(any) stopifnot(all) } } # for (na_value ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Data type: logical # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- logical(length = 100L) x[13:17] <- TRUE # Row/column counts for (na.rm in c(FALSE, TRUE)) { n0 <- count_R(x, na.rm = na.rm) n1 <- count(x, na.rm = na.rm) stopifnot(identical(n1, n0)) n_true <- count(x, value = TRUE, na.rm = na.rm) n_false <- count(x, value = FALSE, na.rm = na.rm) stopifnot(n_true + n_false == ncol(x)) # Count NAs n0 <- count_R(x, value = NA, na.rm = na.rm) n1 <- count(x, value = NA, na.rm = na.rm) stopifnot(identical(n1, n0)) } matrixStats/tests/rowWeightedMeans.R0000644000175100001440000000522313073232324017355 0ustar hornikuserslibrary("matrixStats") set.seed(1) x <- matrix(rnorm(20), nrow = 5, ncol = 4) print(x) # Non-weighted row averages x_est0 <- rowMeans(x) x_est1 <- rowWeightedMeans(x) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMeans(t(x)) stopifnot(all.equal(x_est2, x_est0)) # Weighted row averages (uniform weights) w <- rep(2.5, times = ncol(x)) x_est1 <- rowWeightedMeans(x, w = w) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMeans(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted row averages (excluding some columns) w <- c(1, 1, 0, 1) x_est0 <- rowMeans(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedMeans(x, w = w) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMeans(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted row averages (excluding some columns) w <- c(0, 1, 0, 0) x_est0 <- rowMeans(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedMeans(x, w = w) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMeans(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted row averages (all zero weights) w <- c(0, 0, 0, 0) x_est0 <- rowMeans(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedMeans(x, w = w) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMeans(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted averages by rows and columns w <- 1:4 x_est1 <- rowWeightedMeans(x, w = w) print(x_est1) x_est2 <- colWeightedMeans(t(x), w = w) stopifnot(all.equal(x_est2, x_est1)) x[sample(length(x), size = 0.3 * length(x))] <- NA print(x) # Non-weighted row averages with missing values x_est0 <- rowMeans(x, na.rm = TRUE) x_est1 <- rowWeightedMeans(x, na.rm = TRUE) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMeans(t(x), na.rm = TRUE) stopifnot(all.equal(x_est2, x_est0)) # Weighted row averages with missing values x_est0 <- apply(x, MARGIN = 1L, FUN = weighted.mean, w = w, na.rm = TRUE) print(x_est0) x_est1 <- rowWeightedMeans(x, w = w, na.rm = TRUE) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMeans(t(x), w = w, na.rm = TRUE) stopifnot(all.equal(x_est2, x_est0)) # Weighted averages by rows and columns w <- 1:4 x_est1 <- rowWeightedMeans(x, w = w, na.rm = TRUE) x_est2 <- colWeightedMeans(t(x), w = w, na.rm = TRUE) stopifnot(all.equal(x_est2, x_est1)) # w contains missing value w[1] <- NA_integer_ x_est1 <- rowWeightedMeans(x, w = w, na.rm = TRUE) x_est2 <- colWeightedMeans(t(x), w = w, na.rm = TRUE) stopifnot(all.equal(x_est2, x_est1)) x_est1 <- rowWeightedMeans(x, w = w, na.rm = FALSE) x_est2 <- colWeightedMeans(t(x), w = w, na.rm = FALSE) stopifnot(all.equal(x_est2, x_est1)) matrixStats/tests/sum2.R0000644000175100001440000001514613073232324014774 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Consistency checks # - - - - - - - - - - - - - - - - - - - - - - - - - - - - set.seed(1) sum2_R <- function(x, na.rm = FALSE, idxs = NULL) { if (is.null(idxs)) { sum(x, na.rm = na.rm) } else { sum(x[idxs], na.rm = na.rm) } } # sum2_R() cat("Consistency checks:\n") for (kk in 1:20) { cat("Random test #", kk, "\n", sep = "") # Simulate data in a matrix of any shape n <- sample(1e3, size = 1L) x <- rnorm(n, sd = 100) # Add NAs? if ((kk %% 4) %in% c(3, 0)) { cat("Adding NAs\n") nna <- sample(n, size = 1L) na_values <- c(NA_real_, NaN) t <- sample(na_values, size = nna, replace = TRUE) x[sample(length(x), size = nna)] <- t } # Integer or double? if ((kk %% 4) %in% c(2, 0)) { cat("Coercing to integers\n") storage.mode(x) <- "integer" } na.rm <- sample(c(TRUE, FALSE), size = 1L) # Sum over all y0 <- sum2_R(x, na.rm = na.rm) y1 <- sum2(x, na.rm = na.rm) stopifnot(all.equal(y1, y0)) # Sum over subset nidxs <- sample(n, size = 1L) idxs <- sample(n, size = nidxs) y0 <- sum2_R(x, na.rm = na.rm, idxs = idxs) y1 <- sum2(x, na.rm = na.rm, idxs = idxs) stopifnot(all.equal(y1, y0)) } # for (kk ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All missing values # - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (n in 0:2) { for (na.rm in c(FALSE, TRUE)) { x <- rep(NA_real_, times = n) y0 <- sum(x, na.rm = na.rm) y <- sum2(x, na.rm = na.rm) stopifnot(all.equal(y, y0)) x <- rep(NA_integer_, times = n) y0 <- sum(x, na.rm = na.rm) y <- sum2(x, na.rm = na.rm) stopifnot(all.equal(y, y0)) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (na.rm in c(FALSE, TRUE)) { # Summing over zero elements (integers) x <- integer(0) s1 <- sum(x, na.rm = na.rm) s2 <- sum2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) x <- 1:10 idxs <- integer(0) s1 <- sum(x[idxs], na.rm = na.rm) s2 <- sum2(x, idxs = idxs, na.rm = na.rm) stopifnot(identical(s1, s2)) # Summing over NA_integer_:s x <- rep(NA_integer_, times = 10L) s1 <- sum(x, na.rm = na.rm) s2 <- sum2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) x <- rep(NA_integer_, times = 10L) idxs <- 1:5 s1 <- sum(x[idxs], na.rm = na.rm) s2 <- sum2(x, idxs = idxs, na.rm = na.rm) stopifnot(identical(s1, s2)) # Summing over zero elements (doubles) x <- double(0) s1 <- sum(x) s2 <- sum2(x) stopifnot(identical(s1, s2)) x <- as.double(1:10) idxs <- integer(0) s1 <- sum(x[idxs]) s2 <- sum2(x, idxs = idxs) stopifnot(identical(s1, s2)) # Summing over NA_real_:s x <- rep(NA_real_, times = 10L) s1 <- sum(x, na.rm = na.rm) s2 <- sum2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) x <- rep(NA_real_, times = 10L) idxs <- 1:5 s1 <- sum(x[idxs], na.rm = na.rm) s2 <- sum2(x, idxs = idxs, na.rm = na.rm) stopifnot(identical(s1, s2)) # Summing over -Inf:s x <- rep(-Inf, times = 3L) s1 <- sum(x, na.rm = na.rm) s2 <- sum2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) # Summing over +Inf:s x <- rep(+Inf, times = 3L) s1 <- sum(x, na.rm = na.rm) s2 <- sum2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) # Summing over mix of -Inf:s and +Inf:s x <- rep(c(-Inf, +Inf), times = 3L) s1 <- sum(x, na.rm = na.rm) s2 <- sum2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) # Summing over mix of -Inf:s and +Inf:s and numerics x <- rep(c(-Inf, +Inf, 3.14), times = 2L) s1 <- sum(x, na.rm = na.rm) s2 <- sum2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) # Summing over mix of NaN, NA, +Inf, and numerics x <- c(NaN, NA, +Inf, 3.14) s1 <- sum(x, na.rm = na.rm) s2 <- sum2(x, na.rm = na.rm) if (na.rm) { stopifnot(identical(s2, s1)) } else { stopifnot(is.na(s1), is.na(s2)) ## NOTE, due to compiler optimization, it is not guaranteed that NA is ## returned here (as one would expect). NaN might very well be returned, ## when both NA and NaN are involved. This is an accepted feature in R, ## which is documented in help("is.nan"). See also ## https://stat.ethz.ch/pipermail/r-devel/2017-April/074009.html. ## Thus, we cannot guarantee that s1 is identical to s0. } # Summing over mix of NaN, NA, +Inf, and numerics x <- c(NA, NaN, +Inf, 3.14) s1 <- sum(x, na.rm = na.rm) s2 <- sum2(x, na.rm = na.rm) if (na.rm) { stopifnot(identical(s2, s1)) } else { stopifnot(is.na(s1), is.na(s2)) ## NOTE, due to compiler optimization, it is not guaranteed that NA is ## returned here (as one would expect). NaN might very well be returned, ## when both NA and NaN are involved. This is an accepted feature in R, ## which is documented in help("is.nan"). See also ## https://stat.ethz.ch/pipermail/r-devel/2017-April/074009.html. ## Thus, we cannot guarantee that s1 is identical to s0. } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Summing of large integers # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- c(.Machine$integer.max, 1L, -.Machine$integer.max) # Total gives integer overflow s1 <- sum(x[1:2]) # NA_integer_ s2 <- sum2(x[1:2]) # NA_integer_ stopifnot(identical(s1, s2)) # Total gives integer overflow (coerce to numeric) s1 <- sum(as.numeric(x[1:2])) # 2147483648 s2 <- sum2(as.numeric(x[1:2])) # 2147483648 s3 <- sum2(x[1:2], mode = "double") # 2147483648 stopifnot(identical(s1, s2)) stopifnot(identical(s1, s3)) # Cumulative sum would give integer overflow but not the total s1 <- sum(x) # 1L s2 <- sum2(x) # 1L stopifnot(identical(s1, s2)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Summing of large doubles # - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## Double overflow x <- rep(.Machine$double.xmax, times = 2L) y0 <- sum(x) print(y0) y <- sum2(x) print(y) stopifnot(is.infinite(y) && y > 0) stopifnot(identical(y, y0)) x <- rep(-.Machine$double.xmax, times = 2L) y0 <- sum(x) print(y0) y <- sum2(x) print(y) stopifnot(is.infinite(y) && y < 0) stopifnot(identical(y, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'idxs' # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- 1:10 idxs_list <- list( integer = 1:5, double = as.double(1:5), logical = (x <= 5) ) for (idxs in idxs_list) { cat("idxs:\n") str(idxs) s1 <- sum(x[idxs], na.rm = TRUE) s2 <- sum2(x, idxs = idxs, na.rm = TRUE) stopifnot(identical(s1, s2)) } matrixStats/tests/rowMeans2_subset.R0000644000175100001440000000133213073232324017340 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -3, max = 3), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowMeans2, fsure = rowMeans, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colMeans2, fsure = rowMeans, na.rm = na.rm) } } } matrixStats/tests/rowCounts_subset.R0000644000175100001440000000443313073232324017473 0ustar hornikuserslibrary("matrixStats") rowCounts_R <- function(x, value = TRUE, na.rm = FALSE, ...) { if (is.na(value)) { counts <- apply(x, MARGIN = 1L, FUN = function(x) sum(is.na(x)) ) } else { counts <- apply(x, MARGIN = 1L, FUN = function(x) sum(x == value, na.rm = na.rm) ) } as.integer(counts) } # rowCounts_R() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -3, max = 3), nrow = 6, ncol = 6) x[2:3, 3:4] <- NA_real_ storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = rowCounts, fsure = rowCounts_R, value = 0, na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colCounts, fsure = rowCounts_R, value = 0, na.rm = TRUE) for (value in c(0, NA_integer_)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowCounts, fsure = rowCounts_R, value = value) validateIndicesTestMatrix(x, rows, cols, fcoltest = colCounts, fsure = rowCounts_R, value = value) } } } x <- matrix(rep(letters, length.out = 6 * 6), nrow = 6, ncol = 6) x[2:3, 3:4] <- NA_character_ for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = rowCounts, fsure = rowCounts_R, value = "g", na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colCounts, fsure = rowCounts_R, value = "g", na.rm = TRUE) for (value in c("g", NA_character_)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowCounts, fsure = rowCounts_R, value = value) validateIndicesTestMatrix(x, rows, cols, fcoltest = colCounts, fsure = rowCounts_R, value = value) } } } matrixStats/tests/rowCumMinMaxs.R0000644000175100001440000000722213073232324016653 0ustar hornikuserslibrary("matrixStats") rowCummins_R <- function(x) { suppressWarnings({ y <- t(apply(x, MARGIN = 1L, FUN = cummin)) }) dim(y) <- dim(x) y } rowCummaxs_R <- function(x) { mode <- storage.mode(x) # Change mode because a bug is detected on cummax for integer in R-3.2.0 storage.mode(x) <- "numeric" suppressWarnings({ y <- t(apply(x, MARGIN = 1L, FUN = cummax)) }) dim(y) <- dim(x) storage.mode(y) <- mode y } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # With and without some NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { for (add_na in c(FALSE, TRUE)) { cat("add_na = ", add_na, "\n", sep = "") x <- matrix(1:100, nrow = 20, ncol = 5) if (add_na) { x[13:17, c(2, 4)] <- NA_real_ } cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) # Row/column ranges r0 <- rowCummins_R(x) r1 <- rowCummins(x) r2 <- t(colCummins(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) r0 <- rowCummaxs_R(x) r1 <- rowCummaxs(x) r2 <- t(colCummaxs(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (add_na ...) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(NA_real_, nrow = 20, ncol = 5) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) r0 <- rowCummins_R(x) r1 <- rowCummins(x) r2 <- t(colCummins(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) r0 <- rowCummaxs_R(x) r1 <- rowCummaxs(x) r2 <- t(colCummaxs(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 1x1 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(0, nrow = 1, ncol = 1) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) r0 <- rowCummins_R(x) r1 <- rowCummins(x) r2 <- t(colCummins(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) r0 <- rowCummaxs_R(x) r1 <- rowCummaxs(x) r2 <- t(colCummaxs(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Corner cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") value <- 0 storage.mode(value) <- mode # A 0x0 matrix x <- matrix(value, nrow = 0L, ncol = 0L) str(x) r0 <- matrix(value, nrow = nrow(x), ncol = ncol(x)) r1 <- rowCummins(x) r2 <- t(colCummins(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) # A 0xK matrix x <- matrix(value, nrow = 0L, ncol = 5L) str(x) r0 <- matrix(value, nrow = nrow(x), ncol = ncol(x)) r1 <- rowCummins(x) r2 <- t(colCummins(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) # A Nx0 matrix x <- matrix(value, nrow = 5L, ncol = 0L) str(x) r0 <- matrix(value, nrow = nrow(x), ncol = ncol(x)) r1 <- rowCummins(x) r2 <- t(colCummins(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (mode ...) matrixStats/tests/rowMedians_subset.R0000644000175100001440000000167113073232324017601 0ustar hornikuserslibrary("matrixStats") rowMedians_R <- function(x, na.rm = FALSE, ...) { apply(x, MARGIN = 1L, FUN = median, na.rm = na.rm) } colMedians_R <- function(x, na.rm = FALSE, ...) { apply(x, MARGIN = 2L, FUN = median, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -3, max = 3), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowMedians, fsure = rowMedians_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colMedians, fsure = rowMedians_R, na.rm = na.rm) } } } matrixStats/tests/indexByRow.R0000644000175100001440000000304213073232324016170 0ustar hornikuserslibrary("matrixStats") indexByRow_R1 <- function(dim, idxs = NULL, ...) { n <- prod(dim) x <- matrix(seq_len(n), nrow = dim[2L], ncol = dim[1L], byrow = TRUE) if (!is.null(idxs)) x <- x[idxs] as.vector(x) } indexByRow_R2 <- function(dim, idxs = NULL, ...) { n <- prod(dim) if (is.null(idxs)) { x <- matrix(seq_len(n), nrow = dim[2L], ncol = dim[1L], byrow = TRUE) as.vector(x) } else { idxs <- idxs - 1L cols <- idxs %/% dim[2L] rows <- idxs %% dim[2L] cols + dim[1L] * rows + 1L } } dim <- c(5L, 4L) x <- matrix(NA_integer_, nrow = dim[1L], ncol = dim[2L]) y <- t(x) idxs_by_cols <- seq_along(x) # Assign by columns x[idxs_by_cols] <- idxs_by_cols print(x) # Truth y0 <- t(x) idxs_by_rows <- as.vector(y0) # Assert idxs <- indexByRow(dim) stopifnot(all.equal(idxs, idxs_by_rows)) y <- x y[idxs_by_rows] <- idxs print(y) stopifnot(all(as.vector(y) == as.vector(x))) idxs_R1 <- indexByRow_R1(dim) stopifnot(all.equal(idxs_R1, idxs_by_rows)) idxs_R2 <- indexByRow_R2(dim) stopifnot(all.equal(idxs_R2, idxs_by_rows)) # Assert idxs_by_cols <- seq(from = 1, to = length(x), by = 3L) idxs_by_rows <- as.vector(t(x)[idxs_by_cols]) idxs <- indexByRow(dim, idxs = idxs_by_cols) stopifnot(all(idxs == idxs_by_rows)) idxs_R1 <- indexByRow_R1(dim, idxs = idxs_by_cols) stopifnot(all(idxs_R1 == idxs_by_rows)) idxs_R2 <- indexByRow_R2(dim, idxs = idxs_by_cols) stopifnot(all(idxs_R2 == idxs_by_rows)) ## DEPRECATED: Backward compatibility idxs0 <- indexByRow(dim) idxs1 <- indexByRow(x) stopifnot(identical(idxs1, idxs0)) matrixStats/tests/mean2_subset.R0000644000175100001440000000106613073232324016471 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- runif(6, min = -6, max = 6) storage.mode(x) <- "integer" for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = mean2, fsure = mean, na.rm = FALSE) validateIndicesTestVector(x, idxs, ftest = mean2, fsure = mean, na.rm = TRUE) } matrixStats/tests/binCounts.R0000644000175100001440000000511613073232324016046 0ustar hornikuserslibrary("matrixStats") library("stats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Local functions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - binCounts_hist <- function(x, bx, right = FALSE, ...) { n0 <- graphics::hist(x, breaks = bx, right = right, include.lowest = TRUE, plot = FALSE)$counts } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Non-sorted and sorted positions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - nx <- 1e5 # Number of data points nb <- 2e3 # Number of bins # Uniformely distributed bins bx <- seq(from = 0, to = 1, length.out = nb + 1L) bx <- c(-1, bx, 2) # Sample data points set.seed(0xBEEF) x <- runif(nx, min = 0, max = 1) for (kk in 1:2) { n0 <- binCounts_hist(x, bx = bx) n1 <- binCounts(x, bx = bx) # Sanity check stopifnot(identical(n1, n0)) # Check reversed n1r <- rev(binCounts(-x, bx = rev(-bx), right = TRUE)) stopifnot(identical(n1r, n1)) # Retry with a sorted vector x <- sort(x) } # for (kk in 1:2) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Missing values # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- 1:200 x[100] <- NA_integer_ nx <- length(x) # Bins bx <- c(0.5, 50.5, 100.5, 150.5, 200.5) y_smooth0 <- binCounts_hist(x, bx = bx) y_smooth <- binCounts(x, bx = bx) # Sanity check stopifnot(all.equal(y_smooth, y_smooth0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Border cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- 1:10 bx <- min(x) - c(10, 1) y_smooth <- binCounts(x, bx = bx) stopifnot(all.equal(y_smooth, 0L)) bx <- range(x) y_smooth <- binCounts(x, bx = bx) stopifnot(all.equal(y_smooth, length(x) - 1L)) bx <- max(x) + c(1, 10) y_smooth <- binCounts(x, bx = bx) stopifnot(all.equal(y_smooth, 0L)) # Every second empty x <- 1:10 bx <- rep(x, each = 2L) y_smooth <- binCounts(x, bx = bx) stopifnot(all.equal(y_smooth, rep(c(0L, 1L), length.out = length(bx) - 1L))) ## NOTE: binCounts_hist() does not give the same last bin count # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Exception handling # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Zero bin bounderies (invalid bin definition) bx <- double(0L) res <- try(y_smooth <- binCounts(1:10, bx = bx), silent = TRUE) stopifnot(inherits(res, "try-error")) # One bin boundery (invalid bin definition) bx <- double(1L) res <- try(y_smooth <- binCounts(1:10, bx = bx), silent = TRUE) stopifnot(inherits(res, "try-error")) matrixStats/tests/varDiff_etal.R0000644000175100001440000000536013073232324016471 0ustar hornikuserslibrary("matrixStats") set.seed(1) x <- rnorm(1e4) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Variance estimators # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sigma2_a <- var(x) cat(sprintf("var(x) = %g\n", sigma2_a)) sigma2_b <- varDiff(x) cat(sprintf("varDiff(x) = %g\n", sigma2_b)) d <- abs(sigma2_b - sigma2_a) cat(sprintf("Absolute difference = %g\n", d)) stopifnot(d < 0.02) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Standard deviation estimators # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sigma_a <- sd(x) cat(sprintf("sd(x) = %g\n", sigma_a)) sigma_b <- sdDiff(x) cat(sprintf("sdDiff(x) = %g\n", sigma_b)) d <- abs(sigma_b - sigma_a) cat(sprintf("Absolute difference = %g\n", d)) stopifnot(d < 0.01) # Sanity checks stopifnot(abs(sigma2_a - sigma_a ^ 2) < 1e-9) stopifnot(abs(sigma2_b - sigma_b ^ 2) < 1e-9) sigma_a2 <- mad(x) cat(sprintf("mad(x) = %g\n", sigma_a2)) sigma_b2 <- madDiff(x) cat(sprintf("madDiff(x) = %g\n", sigma_b2)) d <- abs(sigma_b2 - sigma_a2) cat(sprintf("Absolute difference = %g\n", d)) stopifnot(d < 0.05) sigma_a3 <- IQR(x) cat(sprintf("IQR(x) = %g\n", sigma_a3)) sigma_b3 <- iqrDiff(x) cat(sprintf("iqrDiff(x) = %g\n", sigma_b3)) d <- abs(sigma_b3 - sigma_a3) cat(sprintf("Absolute difference = %g\n", d)) stopifnot(d < 0.05) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Trimmed estimators # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - y <- x outliers <- sample(length(x), size = 0.1 * length(x)) y[outliers] <- 100 * y[outliers] sigma_ao <- sd(y[-outliers]) cat(sprintf("sd(y) = %g\n", sigma_ao)) sigma_bo <- sdDiff(y[-outliers]) cat(sprintf("sdDiff(y) = %g\n", sigma_bo)) d <- abs(sigma_b - sigma_a) cat(sprintf("Absolute difference = %g\n", d)) stopifnot(d < 0.01) sigma_bot <- sdDiff(y, trim = 0.05) cat(sprintf("sdDiff(y, trim = 0.05) = %g\n", sigma_bot)) d <- abs(sigma_bot - sigma_a) cat(sprintf("Absolute difference = %g\n", d)) #stopifnot(d < 1e-3) sigma_cot <- madDiff(y, trim = 0.05) cat(sprintf("madDiff(y, trim = 0.05) = %g\n", sigma_cot)) sigma_dot <- iqrDiff(y, trim = 0.05) cat(sprintf("iqrDiff(y, trim = 0.05) = %g\n", sigma_dot)) fcns <- list( varDiff = varDiff, sdDiff = sdDiff, madDiff = madDiff, iqrDiff = iqrDiff ) for (name in names(fcns)) { cat(sprintf("%s()...\n", name)) fcn <- fcns[[name]] for (mode in c("integer", "double")) { cat("mode: ", mode, "", sep = "") for (n in 0:3) { x <- runif(n, min = -5, max = 5) storage.mode(x) <- mode str(x) y <- fcn(x) yt <- fcn(x, trim = 0.1) str(list("non-trimmed" = y, trimmed = yt)) } # for (mode ...) } cat(sprintf("%s()...DONE\n", name)) } # for (name ...) matrixStats/tests/rowOrderStats.R0000644000175100001440000000261113073232324016721 0ustar hornikuserslibrary("matrixStats") library("stats") rowOrderStats_R <- function(x, probs, ...) { ans <- apply(x, MARGIN = 1L, FUN = quantile, probs = probs, type = 3L) # Remove Attributes attributes(ans) <- NULL ans } # rowOrderStats_R() set.seed(1) # Simulate data in a matrix of any shape nrow <- 300 ncol <- 100 x <- rnorm(nrow * ncol) dim(x) <- c(nrow, ncol) probs <- 0.3 which <- round(probs * ncol) y0 <- rowOrderStats_R(x, probs = probs) y1 <- rowOrderStats(x, which = which) stopifnot(all.equal(y1, y0)) y2 <- colOrderStats(t(x), which = which) stopifnot(all.equal(y2, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Consistency checks # - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("Consistency checks without NAs:\n") for (kk in 1:3) { cat("Random test #", kk, "\n", sep = "") # Simulate data in a matrix of any shape nrow <- sample(100, size = 1) ncol <- sample(100, size = 1) x <- rnorm(nrow * ncol) dim(x) <- c(nrow, ncol) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) probs <- runif(1) which <- round(probs * ncol) y0 <- rowOrderStats_R(x, probs = probs) y1 <- rowOrderStats(x, which = which) stopifnot(all.equal(y1, y0)) y2 <- colOrderStats(t(x), which = which) stopifnot(all.equal(y2, y0)) } # for (kk in ...) } # for (mode ...) matrixStats/tests/rowMads_subset.R0000644000175100001440000000330713073232324017103 0ustar hornikuserslibrary("matrixStats") rowMads_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = mad, na.rm = na.rm) }) } colMads_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 2L, FUN = mad, na.rm = na.rm) }) } rowMads_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- rowMedians(x, cols = cols, na.rm = na.rm) rowMads(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } colMads_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- colMedians(x, rows = rows, na.rm = na.rm) colMads(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowMads, fsure = rowMads_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, ftest = rowMads_center, fsure = rowMads_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colMads, fsure = rowMads_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colMads_center, fsure = rowMads_R, na.rm = na.rm) } } } matrixStats/tests/rowVarDiffs.R0000644000175100001440000000403513073232324016335 0ustar hornikuserslibrary("matrixStats") fcns <- list( rowVarDiffs = list(rowVarDiffs, colVarDiffs), rowSdDiffs = list(rowSdDiffs, colSdDiffs), rowMadDiffs = list(rowMadDiffs, colMadDiffs), rowIQRDiffs = list(rowIQRDiffs, colIQRDiffs) ) for (fcn in names(fcns)) { cat(sprintf("%s()...\n", fcn)) row_fcn <- fcns[[fcn]][[1L]] col_fcn <- fcns[[fcn]][[2L]] # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # With and without some NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { for (add_na in c(FALSE, TRUE)) { cat("add_na = ", add_na, "\n", sep = "") x <- matrix(1:100 + 0.1, nrow = 20, ncol = 5) if (add_na) { x[13:17, c(2, 4)] <- NA_real_ } cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) # Row/column ranges for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r1 <- row_fcn(x, na.rm = na.rm) r2 <- col_fcn(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) } } # for (add_na ...) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(NA_real_, nrow = 20, ncol = 5) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r1 <- row_fcn(x, na.rm = na.rm) r2 <- col_fcn(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 1x1 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(0, nrow = 1, ncol = 1) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r1 <- row_fcn(x, na.rm = na.rm) r2 <- col_fcn(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) } cat(sprintf("%s()...DONE\n", fcn)) } # for (fcn ...) matrixStats/tests/rowCumsums.R0000644000175100001440000000551413073232324016270 0ustar hornikuserslibrary("matrixStats") rowCumsums_R <- function(x) { suppressWarnings({ y <- t(apply(x, MARGIN = 1L, FUN = cumsum)) }) dim(y) <- dim(x) y } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # With and without some NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { for (add_na in c(FALSE, TRUE)) { cat("add_na = ", add_na, "\n", sep = "") x <- matrix(1:100, nrow = 20, ncol = 5) if (add_na) { x[13:17, c(2, 4)] <- NA_real_ } cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) # Row/column ranges r0 <- rowCumsums_R(x) r1 <- rowCumsums(x) r2 <- t(colCumsums(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (add_na ...) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(NA_real_, nrow = 20, ncol = 5) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) r0 <- rowCumsums_R(x) r1 <- rowCumsums(x) r2 <- t(colCumsums(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 1x1 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(0, nrow = 1, ncol = 1) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) r0 <- rowCumsums_R(x) r1 <- rowCumsums(x) r2 <- t(colCumsums(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Corner cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") value <- 0 storage.mode(value) <- mode # A 0x0 matrix x <- matrix(value, nrow = 0L, ncol = 0L) str(x) r0 <- matrix(value, nrow = nrow(x), ncol = ncol(x)) r1 <- rowCumsums(x) r2 <- t(colCumsums(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) # A 0xK matrix x <- matrix(value, nrow = 0L, ncol = 5L) str(x) r0 <- matrix(value, nrow = nrow(x), ncol = ncol(x)) r1 <- rowCumsums(x) r2 <- t(colCumsums(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) # A Nx0 matrix x <- matrix(value, nrow = 5L, ncol = 0L) str(x) r0 <- matrix(value, nrow = nrow(x), ncol = ncol(x)) r1 <- rowCumsums(x) r2 <- t(colCumsums(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (mode ...) matrixStats/tests/binMeans,binCounts_subset.R0000644000175100001440000000315713073232324021167 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Naive R implementation of binMeans() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - binMeans0 <- function(y, x, bx, na.rm = TRUE, count = TRUE, right = FALSE) { n_smooth <- length(bx) - 1L res <- double(n_smooth) counts <- rep(NaN, times = n_smooth) if (na.rm) { keep <- !is.na(x) & !is.na(y) x <- x[keep] y <- y[keep] } # For each bin... for (kk in seq_len(n_smooth)) { if (right) { idxs <- which(bx[kk] < x & x <= bx[kk + 1L]) } else { idxs <- which(bx[kk] <= x & x < bx[kk + 1L]) } y_kk <- y[idxs] res[kk] <- mean(y_kk) counts[kk] <- length(idxs) } # for (kk ...) if (count) attr(res, "count") <- counts res } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") y <- runif(6, min = -6, max = 6) x <- runif(6, min = -6, max = 6) storage.mode(x) <- "integer" bx <- c(-6, 0, 3, 4, 10) for (idxs in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestVector_w(y, x, idxs, ftest = binMeans, fsure = binMeans0, bx = bx, na.rm = na.rm, count = TRUE, right = FALSE) validateIndicesTestVector_w(y, x, idxs, ftest = binMeans, fsure = binMeans0, bx = bx, na.rm = na.rm, count = TRUE, right = TRUE) } } matrixStats/tests/benchmark.R0000644000175100001440000000074213073232324016034 0ustar hornikusers## 1. Don't test with valgrind ## 2. Test only R (>= 3.0.2) because of that's what knitr requires if (getRversion() >= "3.0.2" && Sys.getenv("_R_CHECK_USE_VALGRIND_") == "") { ## 3. Make sure all suggested packages are installed / can be loaded pkgs <- c("base64enc", "ggplot2", "knitr", "microbenchmark", "R.devices", "R.rsp") if (all(unlist(lapply(pkgs, FUN = requireNamespace)))) { html <- matrixStats:::benchmark("binCounts") print(html) } rm(list = "pkgs") } matrixStats/tests/rowVarDiffs_var,sd_subset.R0000644000175100001440000000243513073232324021177 0ustar hornikuserslibrary("matrixStats") fcns <- list( varDiff = c(rowVarDiffs, colVarDiffs), sdDiff = c(rowSdDiffs, colSdDiffs) ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") trim <- runif(1, min = 0, max = 0.5) for (fcn in names(fcns)) { cat(sprintf("subsetted tests on %s()...\n", fcn)) row_fcn <- fcns[[fcn]][[1L]] col_fcn <- fcns[[fcn]][[2L]] for (mode in c("numeric", "integer")) { x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6L, ncol = 6L) storage.mode(x) <- mode if (mode == "numeric") x[1:2, 3:4] <- Inf for (diff in 1:2) { for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = row_fcn, fsure = row_fcn, na.rm = na.rm, diff = diff, trim = trim) validateIndicesTestMatrix(x, rows, cols, fcoltest = col_fcn, fsure = row_fcn, na.rm = na.rm, diff = diff, trim = trim) } } } } } cat(sprintf("%s()...DONE\n", fcn)) } matrixStats/tests/rowRanks_subset.R0000644000175100001440000000201513073232324017270 0ustar hornikuserslibrary("matrixStats") rowRanks_R <- function(x, ties.method = "average", ...) { ans <- t(apply(x, MARGIN = 1L, FUN = rank, na.last = "keep", ties.method = ties.method)) dim(ans) <- dim(x) ans } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" colRanks_R_t <- function(x, rows, cols, ...) { t(colRanks(t(x), rows = cols, cols = rows, preserveShape = TRUE, ...)) } for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = rowRanks, fsure = rowRanks_R, ties.method = "average") validateIndicesTestMatrix(x, rows, cols, ftest = colRanks_R_t, fsure = rowRanks_R, ties.method = "average") } } matrixStats/tests/rowVars_subset.R0000644000175100001440000000332413073232324017131 0ustar hornikuserslibrary("matrixStats") rowVars_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = var, na.rm = na.rm) }) } colVars_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 2L, FUN = var, na.rm = na.rm) }) } rowVars_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- rowWeightedMeans(x, cols = cols, na.rm = na.rm) rowVars(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } colVars_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- colWeightedMeans(x, rows = rows, na.rm = na.rm) colVars(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowVars, fsure = rowVars_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, ftest = rowVars_center, fsure = rowVars_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colVars, fsure = rowVars_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colVars_center, fsure = rowVars_R, na.rm = na.rm) } } } matrixStats/tests/zzz.package-unload.R0000644000175100001440000000227413073232324017613 0ustar hornikusers## These tests need to be last of all tests, otherwise ## covr::package_coverage() gives an error. cat("1. Loading package\n") loadNamespace("matrixStats") stopifnot("matrixStats" %in% loadedNamespaces()) cat("2. Unloading package\n") unloadNamespace("matrixStats") stopifnot(!"matrixStats" %in% loadedNamespaces()) if (FALSE) { ## 'covr' gives "Error in library("matrixStats") : ## there is no package called 'matrixStats'" here, cf. ## https://travis-ci.org/HenrikBengtsson/matrixStats/builds/48015577 cat("3. Attaching package\n") library("matrixStats") stopifnot("package:matrixStats" %in% search()) cat("4. Detaching package\n") detach("package:matrixStats") stopifnot(!"package:matrixStats" %in% search()) stopifnot("matrixStats" %in% loadedNamespaces()) cat("5. Unloading package\n") unloadNamespace("matrixStats") stopifnot(!"matrixStats" %in% loadedNamespaces()) cat("6. Attaching package (again)\n") library("matrixStats") stopifnot("package:matrixStats" %in% search()) cat("7. Detaching package (again)\n") detach("package:matrixStats") stopifnot(!"package:matrixStats" %in% search()) stopifnot("matrixStats" %in% loadedNamespaces()) } cat("7. DONE\n") matrixStats/tests/rowSums2_subset.R0000644000175100001440000000230313073232324017223 0ustar hornikuserslibrary("matrixStats") rowSums2_R <- function(x, na.rm = FALSE, ...) { ## FIXME: sum() may overflow for integers, whereas ## base::rowSums() doesn't. What should rowSums2() do? ## apply(x, MARGIN = 1L, FUN = sum, na.rm = na.rm) rowSums(x, na.rm = na.rm) } colSums2_R <- function(x, na.rm = FALSE, ...) { ## FIXME: sum() may overflow for integers, whereas ## base::colSums() doesn't. What should colSums2() do? ## apply(x, MARGIN = 2L, FUN = sum, na.rm = na.rm) colSums(x, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -3, max = 3), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowSums2, fsure = rowSums2_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colSums2, fsure = rowSums2_R, na.rm = na.rm) } } } matrixStats/tests/rowAvgsPerColSet.R0000644000175100001440000000420613073232324017312 0ustar hornikuserslibrary("matrixStats") x <- matrix(rnorm(20 * 6), nrow = 20, ncol = 6) rownames(x) <- LETTERS[1:nrow(x)] colnames(x) <- letters[1:ncol(x)] print(x) # - - - - - - - - - - - - - - - - - - - - - - - - - - # Apply rowMeans() for 3 sets of 2 columns # - - - - - - - - - - - - - - - - - - - - - - - - - - nbr_of_sets <- 3L s <- matrix(1:ncol(x), ncol = nbr_of_sets) colnames(s) <- sprintf("s%d", 1:nbr_of_sets) print(s) z <- rowAvgsPerColSet(x, S = s) print(z) # Validation z0 <- cbind(s1 = rowMeans(x[, 1:2]), s2 = rowMeans(x[, 3:4]), s3 = rowMeans(x[, 5:6])) stopifnot(identical(drop(z), z0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - # Apply colMeans() for 5 sets of 4 rows # - - - - - - - - - - - - - - - - - - - - - - - - - - nbr_of_sets <- 5L s <- matrix(1:nrow(x), ncol = nbr_of_sets) colnames(s) <- sprintf("s%d", 1:nbr_of_sets) print(s) z <- colAvgsPerRowSet(x, S = s) print(z) # Validation z0 <- rbind(s1 = colMeans(x[1:4, ]), s2 = colMeans(x[5:8, ]), s3 = colMeans(x[9:12, ]), s4 = colMeans(x[13:16, ]), s5 = colMeans(x[17:20, ])) stopifnot(identical(drop(z), z0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - # When there is only one "complete" set # - - - - - - - - - - - - - - - - - - - - - - - - - - nbr_of_sets <- 1L s <- matrix(1:ncol(x), ncol = nbr_of_sets) colnames(s) <- sprintf("s%d", 1:nbr_of_sets) print(s) z <- rowAvgsPerColSet(x, S = s, FUN = rowMeans) print(z) z0 <- rowMeans(x) stopifnot(identical(drop(z), z0)) nbr_of_sets <- 1L s <- matrix(1:nrow(x), ncol = nbr_of_sets) colnames(s) <- sprintf("s%d", 1:nbr_of_sets) print(s) z <- colAvgsPerRowSet(x, S = s, FUN = colMeans) print(z) z0 <- colMeans(x) stopifnot(identical(drop(z), z0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - # Use weights # - - - - - - - - - - - - - - - - - - - - - - - - - - nbr_of_sets <- 3L s <- matrix(1:ncol(x), ncol = nbr_of_sets) colnames(s) <- sprintf("s%d", 1:nbr_of_sets) print(s) w <- matrix(runif(length(x)), nrow = nrow(x), ncol = ncol(x)) z1 <- rowAvgsPerColSet(x, W = w, S = s, FUN = rowWeightedMeans) print(z1) z2 <- colAvgsPerRowSet(x, W = w, S = s, FUN = colWeightedMeans) print(z2) matrixStats/tests/rowCumprods_subset.R0000644000175100001440000000147013073232324020012 0ustar hornikuserslibrary("matrixStats") rowCumprods_R <- function(x) { suppressWarnings({ y <- t(apply(x, MARGIN = 1L, FUN = cumprod)) }) dim(y) <- dim(x) y } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -3, max = 3), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = rowCumprods, fsure = rowCumprods_R) validateIndicesTestMatrix(x, rows, cols, ftest = function(x, rows, cols, ...) { t(colCumprods(t(x), rows = cols, cols = rows)) }, fsure = rowCumprods_R) } } matrixStats/tests/rowRanges_subset.R0000644000175100001440000000342313073232324017435 0ustar hornikuserslibrary("matrixStats") rowMins_R <- function(x, ...) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = min, ...) }) } # rowMins_R() rowMaxs_R <- function(x, ...) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = max, ...) }) } # rowMaxs_R() rowRanges_R <- function(x, ...) { suppressWarnings({ ans <- t(apply(x, MARGIN = 1L, FUN = range, ...)) }) dim(ans) <- c(dim(x)[1], 2) ans } # rowRanges_R() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowRanges, fsure = rowRanges_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, ftest = rowMins, fsure = rowMins_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, ftest = rowMaxs, fsure = rowMaxs_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colRanges, fsure = rowRanges_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colMins, fsure = rowMins_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colMaxs, fsure = rowMaxs_R, na.rm = na.rm) } } } matrixStats/tests/rowWeightedVars.R0000644000175100001440000000603613073232324017230 0ustar hornikuserslibrary("matrixStats") set.seed(1) x <- matrix(rnorm(20), nrow = 5L, ncol = 4L) print(x) # Weighted row variances (uniform weights - all w = 1) # Non-weighted row variances x_est0 <- rowVars(x) w <- rep(1, times = ncol(x)) x_est1 <- rowWeightedVars(x, w = w) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedVars(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted row variances (uniform weights - all w = 3) x3 <- cbind(x, x, x) x_est0 <- rowVars(x3) w <- rep(3, times = ncol(x)) x_est1 <- rowWeightedVars(x, w = w) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedVars(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted row variances (excluding some columns) w <- c(1, 1, 0, 1) x_est0 <- rowVars(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedVars(x, w = w) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedVars(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted row variances (excluding some columns) w <- c(0, 1, 0, 0) x_est0 <- rowVars(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedVars(x, w = w) #stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedVars(t(x), w = w) stopifnot(all.equal(x_est2, x_est1)) # Weighted row variances (all zero weights) w <- c(0, 0, 0, 0) x_est0 <- rowVars(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedVars(x, w = w) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedVars(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted variances by rows and columns w <- 1:4 x_est1 <- rowWeightedVars(x, w = w) print(x_est1) x_est2 <- colWeightedVars(t(x), w = w) stopifnot(all.equal(x_est2, x_est1)) x[sample(length(x), size = 0.3 * length(x))] <- NA print(x) # Non-weighted row variances with missing values x_est0 <- rowVars(x, na.rm = TRUE) x_est1 <- rowWeightedVars(x, w = rep(1, times = ncol(x)), na.rm = TRUE) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedVars(t(x), w = rep(1, times = ncol(x)), na.rm = TRUE) stopifnot(all.equal(x_est2, x_est0)) # Weighted row variances with missing values x_est1 <- rowWeightedVars(x, w = w, na.rm = TRUE) print(x_est1) x_est2 <- colWeightedVars(t(x), w = w, na.rm = TRUE) stopifnot(all.equal(x_est2, x_est1)) # Weighted variances by rows and columns w <- 1:4 x_est1 <- rowWeightedVars(x, w = w, na.rm = TRUE) x_est2 <- colWeightedVars(t(x), w = w, na.rm = TRUE) stopifnot(all.equal(x_est2, x_est1)) # Weighted row standard deviation (excluding some columns) w <- c(1, 1, 0, 1) ## FIXME: rowVars()/rowSds() needs na.rm = FALSE (wrong default) x_est0 <- rowSds(x[, (w == 1), drop = FALSE], na.rm = FALSE) x_est1 <- rowWeightedSds(x, w = w) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedSds(t(x), w = w, na.rm = FALSE) stopifnot(all.equal(x_est2, x_est0)) # Weighted row MADs (excluding some columns) w <- c(1, 1, 0, 1) x_est0 <- rowMads(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedMads(x, w = w) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMads(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) matrixStats/tests/rowIQRs_subset.R0000644000175100001440000000250513073232324017034 0ustar hornikuserslibrary("matrixStats") rowIQRs_R <- function(x, na.rm = FALSE) { quantile_na <- function(x, ..., na.rm = FALSE) { if (!na.rm && anyMissing(x)) return(c(NA_real_, NA_real_)) quantile(x, ..., na.rm = na.rm) } q <- apply(x, MARGIN = 1L, FUN = quantile_na, probs = c(0.25, 0.75), na.rm = na.rm) dim(q) <- c(2L, nrow(x)) q[2L, , drop = TRUE] - q[1L, , drop = TRUE] } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- runif(6, min = -6, max = 6) for (idxs in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestVector(x, idxs, ftest = iqr, fsure = function(x, na.rm) { dim(x) <- c(1L, length(x)) rowIQRs_R(x, na.rm = na.rm) }, na.rm = na.rm) } } x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowIQRs, fsure = rowIQRs_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colIQRs, fsure = rowIQRs_R, na.rm = na.rm) } } } matrixStats/tests/rowCumsums_subset.R0000644000175100001440000000146213073232324017653 0ustar hornikuserslibrary("matrixStats") rowCumsums_R <- function(x) { suppressWarnings({ y <- t(apply(x, MARGIN = 1L, FUN = cumsum)) }) dim(y) <- dim(x) y } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -3, max = 3), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = rowCumsums, fsure = rowCumsums_R) validateIndicesTestMatrix(x, rows, cols, ftest = function(x, rows, cols, ...) { t(colCumsums(t(x), rows = cols, cols = rows)) }, fsure = rowCumsums_R) } } matrixStats/tests/rowTabulates_subset.R0000644000175100001440000000165413073232324020146 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = rowTabulates, fsure = rowTabulates) validateIndicesTestMatrix(x, rows, cols, ftest = rowTabulates, fsure = rowTabulates, values = 1:3) validateIndicesTestMatrix(x, rows, cols, ftest = colTabulates, fsure = colTabulates) validateIndicesTestMatrix(x, rows, cols, ftest = colTabulates, fsure = colTabulates, values = 1:3) } } matrixStats/tests/allocMatrix.R0000644000175100001440000000112013073232324016350 0ustar hornikuserslibrary("matrixStats") allocMatrix_R <- function(nrow, ncol, value = NA) { matrix(data = value, nrow = nrow, ncol = ncol) } values <- list( -1L, 0L, +1L, NA_integer_, .Machine$integer.max, -1, 0, +1, NA_real_, NaN, -Inf, +Inf, .Machine$double.xmin, .Machine$double.xmax, .Machine$double.eps, .Machine$double.neg.eps, FALSE, TRUE, NA ) nrow <- 3L ncol <- 4L for (value in values) { x0 <- allocMatrix_R(nrow, ncol, value = value) x <- allocMatrix(nrow, ncol, value = value) str(list(nrow = nrow, ncol = ncol, value = value, x = x, x0 = x0)) stopifnot(identical(x, x0)) } matrixStats/tests/signTabulate_subset.R0000644000175100001440000000165113073232324020111 0ustar hornikuserslibrary("matrixStats") signTabulate0 <- function(x, ...) { nneg <- sum(x < 0, na.rm = TRUE) nzero <- sum(x == 0, na.rm = TRUE) npos <- sum(x > 0, na.rm = TRUE) nna <- sum(is.na(x)) nneginf <- sum(is.infinite(x) & x < 0, na.rm = TRUE) nposinf <- sum(is.infinite(x) & x > 0, na.rm = TRUE) res <- c(nneg, nzero, npos, nna, nneginf, nposinf) res <- as.double(res) names(res) <- c("-1", "0", "+1", "NA", "-Inf", "+Inf") if (is.integer(x)) res <- res[1:4] res } # signTabulate0() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) x[2:3, 4:5] <- +Inf x[4:5, 1:2] <- -Inf for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = signTabulate, fsure = signTabulate0) } matrixStats/tests/anyMissing_subset.R0000644000175100001440000000100613073232324017602 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- runif(6, min = -3, max = 3) x[2] <- NA for (mode in c("integer", "numeric")) { storage.mode(x) <- mode for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = anyMissing, fsure = function(x, ...) { anyValue(x, value = NA) }) } } matrixStats/tests/rowLogSumExps_subset.R0000644000175100001440000000165413073232324020270 0ustar hornikuserslibrary("matrixStats") rowLogSumExps_R <- function(x, ...) { apply(x, MARGIN = 1L, FUN = function(rx, ...) { log(sum(exp(rx), ...)) }, ...) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowLogSumExps, fsure = rowLogSumExps_R, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colLogSumExps, fsure = rowLogSumExps_R, na.rm = na.rm) } } } matrixStats/tests/rowWeightedMedians.R0000644000175100001440000000424613073232324017676 0ustar hornikuserslibrary("matrixStats") set.seed(1) x <- matrix(rnorm(20), nrow = 5, ncol = 4) print(x) # Non-weighted row medians x_est0 <- rowMedians(x) x_est1 <- rowWeightedMedians(x) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMedians(t(x)) stopifnot(all.equal(x_est2, x_est0)) # Weighted row medians (uniform weights) w <- rep(2.5, times = ncol(x)) x_est1 <- rowWeightedMedians(x, w = w) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMedians(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted row medians (excluding some columns) w <- c(1, 1, 0, 1) x_est0 <- rowMedians(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedMedians(x, w = w) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMedians(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted row medians (excluding some columns) w <- c(0, 1, 0, 0) x_est0 <- rowMedians(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedMedians(x, w = w) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMedians(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted row medians (all zero weights) w <- c(0, 0, 0, 0) x_est0 <- rowMedians(x[, (w == 1), drop = FALSE]) x_est1 <- rowWeightedMedians(x, w = w) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMedians(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted medians by rows and columns w <- 1:4 x_est1 <- rowWeightedMedians(x, w = w) x_est2 <- colWeightedMedians(t(x), w = w) stopifnot(all.equal(x_est2, x_est1)) # Weighted row medians with missing values x_est0 <- apply(x, MARGIN = 1L, FUN = weightedMedian, w = w, na.rm = TRUE) print(x_est0) x_est1 <- rowWeightedMedians(x, w = w, na.rm = TRUE) print(x_est1) stopifnot(all.equal(x_est1, x_est0)) x_est2 <- colWeightedMedians(t(x), w = w) stopifnot(all.equal(x_est2, x_est0)) # Weighted medians by rows and columns w <- 1:4 x_est1 <- rowWeightedMedians(x, w = w, na.rm = TRUE) x_est2 <- colWeightedMedians(t(x), w = w, na.rm = TRUE) stopifnot(all.equal(x_est2, x_est1)) # Inf weight x <- matrix(1:2, nrow = 1, ncol = 2) w <- c(7, Inf) x_est1 <- rowWeightedMedians(x, w = w) x_est2 <- colWeightedMedians(t(x), w = w) stopifnot(identical(2, x_est1)) stopifnot(identical(2, x_est2)) matrixStats/tests/rowMedians.R0000644000175100001440000001410713073232324016212 0ustar hornikuserslibrary("matrixStats") rowMedians_R <- function(x, na.rm = FALSE, ...) { apply(x, MARGIN = 1L, FUN = median, na.rm = na.rm) } colMedians_R <- function(x, na.rm = FALSE, ...) { apply(x, MARGIN = 2L, FUN = median, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Non-ties # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Non-ties:\n") for (mode in c("integer", "double")) { x <- matrix(1:9 + 0.1, nrow = 3, ncol = 3) storage.mode(x) <- mode y0 <- rowMedians_R(x, na.rm = FALSE) y1 <- rowMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = FALSE) y1 <- colMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Ties # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Ties:\n") for (mode in c("integer", "double")) { x <- matrix(1:16 + 0.1, nrow = 4, ncol = 4) storage.mode(x) <- mode y0 <- rowMedians_R(x, na.rm = FALSE) y1 <- rowMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = FALSE) y1 <- colMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Single-element matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Single-element matrix:\n") for (mode in c("integer", "double")) { x <- matrix(1, nrow = 1, ncol = 1) storage.mode(x) <- mode y0 <- rowMedians_R(x, na.rm = FALSE) y1 <- rowMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = FALSE) y1 <- colMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Empty matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Empty matrix:\n") for (mode in c("integer", "double")) { x <- matrix(integer(0), nrow = 0, ncol = 0) storage.mode(x) <- mode y0 <- rowMedians_R(x, na.rm = FALSE) y1 <- rowMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = FALSE) y1 <- colMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All NAs:\n") for (mode in c("integer", "double")) { x <- matrix(NA_integer_, nrow = 3, ncol = 3) storage.mode(x) <- mode y0 <- rowMedians_R(x, na.rm = TRUE) y1 <- rowMedians(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = TRUE) y1 <- colMedians(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All NaNs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All NaNs:\n") x <- matrix(NA_real_, nrow = 3, ncol = 3) y0 <- rowMedians_R(x, na.rm = TRUE) y1 <- rowMedians(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = TRUE) y1 <- colMedians(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All Infs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All Infs:\n") x <- matrix(Inf, nrow = 3, ncol = 3) y0 <- rowMedians_R(x, na.rm = FALSE) y1 <- rowMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = FALSE) y1 <- colMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All -Infs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All -Infs:\n") x <- matrix(-Inf, nrow = 3, ncol = 3) y0 <- rowMedians_R(x, na.rm = FALSE) y1 <- rowMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = FALSE) y1 <- colMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Infs and -Infs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Infs and -Infs:\n") x <- matrix(c(-Inf, +Inf), nrow = 4, ncol = 4) y0 <- rowMedians_R(x, na.rm = FALSE) y1 <- rowMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = FALSE) y1 <- colMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Integer overflow with ties # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Integer overflow with ties:\n") x <- matrix(.Machine$integer.max, nrow = 4, ncol = 4) y0 <- rowMedians_R(x, na.rm = FALSE) y1 <- rowMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colMedians_R(x, na.rm = FALSE) y1 <- colMedians(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Consistency checks # - - - - - - - - - - - - - - - - - - - - - - - - - - - - set.seed(1) cat("Consistency checks:\n") n_sims <- if (Sys.getenv("_R_CHECK_USE_VALGRIND_") != "") 4L else 20L for (kk in seq_len(n_sims)) { cat("Random test #", kk, "\n", sep = "") # Simulate data in a matrix of any shape dim <- sample(50:200, size = 2) n <- prod(dim) x <- rnorm(n, sd = 100) dim(x) <- dim # Add NAs? if ((kk %% 4) %in% c(3, 0)) { cat("Adding NAs\n") nna <- sample(n, size = 1) na_values <- c(NA_real_, NaN) t <- sample(na_values, size = nna, replace = TRUE) x[sample(length(x), size = nna)] <- t } # Integer or double? if ((kk %% 4) %in% c(2, 0)) { cat("Coercing to integers\n") storage.mode(x) <- "integer" } na.rm <- sample(c(TRUE, FALSE), size = 1) # rowMedians(): y0 <- rowMedians_R(x, na.rm = na.rm) y1 <- rowMedians(x, na.rm = na.rm) stopifnot(all.equal(y1, y0)) y2 <- colMedians(t(x), na.rm = na.rm) stopifnot(all.equal(y2, y0)) # colMedians(): y0 <- colMedians_R(x, na.rm = na.rm) y1 <- colMedians(x, na.rm = na.rm) stopifnot(all.equal(y1, y0)) y2 <- rowMedians(t(x), na.rm = na.rm) stopifnot(all.equal(y2, y0)) } # for (kk ...) matrixStats/tests/rowLogSumExps.R0000644000175100001440000001000713073232324016673 0ustar hornikusers# Test inspired by the harmonic mean example in R-help # thread '[R] Beyond double-precision?' on May 9, 2009. library("matrixStats") library("stats") logSumExp0 <- function(lx) { idx_max <- which.max(lx) log1p(sum(exp(lx[-idx_max] - lx[idx_max]))) + lx[idx_max] } n <- 1e3 set.seed(1) for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") x <- matrix(runif(n, min = 1.0, max = 3.0), nrow = 50L) storage.mode(x) <- mode str(x) # The logarithm of the harmonic mean by rows y_h <- log(1 / rowMeans(1 / x)) str(y_h) lx_neg <- -log(x) y0 <- log(ncol(x)) - apply(lx_neg, MARGIN = 1L, FUN = logSumExp0) stopifnot(all.equal(y0, y_h)) y1 <- log(ncol(x)) - apply(lx_neg, MARGIN = 1L, FUN = logSumExp) stopifnot(all.equal(y1, y0)) y2 <- log(ncol(x)) - rowLogSumExps(lx_neg) stopifnot(all.equal(y2, y0)) y3 <- log(ncol(x)) - colLogSumExps(t(lx_neg)) stopifnot(all.equal(y3, y0)) # The logarithm of the harmonic mean by columns y_h <- log(1 / colMeans(1 / x)) str(y_h) y0 <- log(nrow(x)) - apply(lx_neg, MARGIN = 2L, FUN = logSumExp0) stopifnot(all.equal(y0, y_h)) y1 <- log(nrow(x)) - apply(lx_neg, MARGIN = 2L, FUN = logSumExp) stopifnot(all.equal(y1, y0)) y2 <- log(nrow(x)) - colLogSumExps(lx_neg) stopifnot(all.equal(y2, y0)) y3 <- log(nrow(x)) - rowLogSumExps(t(lx_neg)) stopifnot(all.equal(y3, y0)) # Testing names rownames(lx_neg) <- seq_len(nrow(x)) colnames(lx_neg) <- seq_len(ncol(x)) y2 <- rowLogSumExps(lx_neg) stopifnot(identical(names(y2), rownames(lx_neg))) y3 <- colLogSumExps(t(lx_neg)) stopifnot(identical(names(y3), rownames(lx_neg))) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Corner cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## Zero-size matrices lx <- matrix(numeric(0L), nrow = 0L, ncol = 0L) y <- rowLogSumExps(lx) print(y) stopifnot(length(y) == nrow(lx)) y <- colLogSumExps(lx) print(y) stopifnot(length(y) == ncol(lx)) ## Zero-height matrices lx <- matrix(numeric(0L), nrow = 0L, ncol = 10L) y <- rowLogSumExps(lx) print(y) stopifnot(length(y) == nrow(lx)) y <- colLogSumExps(lx) print(y) stopifnot(length(y) == ncol(lx)) stopifnot(all(y == -Inf)) ## Zero-width matrices lx <- matrix(numeric(0L), nrow = 10L, ncol = 0L) y <- colLogSumExps(lx) print(y) stopifnot(length(y) == ncol(lx)) y <- rowLogSumExps(lx) print(y) stopifnot(length(y) == nrow(lx)) stopifnot(all(y == -Inf)) ## Matrices with one element lx <- matrix(1.0, nrow = 1L, ncol = 1L) y <- rowLogSumExps(lx) print(y) stopifnot(length(y) == nrow(lx)) stopifnot(all(y == lx)) y <- colLogSumExps(lx) print(y) stopifnot(length(y) == ncol(lx)) stopifnot(all(y == lx)) ## All missing values lx <- matrix(NA_real_, nrow = 1L, ncol = 1L) y <- rowLogSumExps(lx, na.rm = TRUE) print(y) stopifnot(length(y) == nrow(lx)) stopifnot(identical(y, -Inf)) lx <- matrix(NA_real_, nrow = 1L, ncol = 1L) y <- colLogSumExps(lx, na.rm = TRUE) print(y) stopifnot(length(y) == ncol(lx)) stopifnot(identical(y, -Inf)) lx <- matrix(NA_real_, nrow = 2L, ncol = 2L) y <- rowLogSumExps(lx, na.rm = TRUE) print(y) stopifnot(length(y) == nrow(lx)) stopifnot(all(y == -Inf)) y <- rowLogSumExps(lx, na.rm = FALSE) print(y) stopifnot(length(y) == nrow(lx)) stopifnot(all(is.na(y) & !is.nan(y))) lx <- matrix(NA_real_, nrow = 2L, ncol = 2L) y <- colLogSumExps(lx, na.rm = TRUE) print(y) stopifnot(length(y) == ncol(lx)) stopifnot(all(y == -Inf)) y <- colLogSumExps(lx, na.rm = FALSE) print(y) stopifnot(length(y) == ncol(lx)) stopifnot(all(is.na(y) & !is.nan(y))) ## +Inf values lx <- matrix(c(1, 2, +Inf), nrow = 3L, ncol = 2L) y <- colLogSumExps(lx, na.rm = TRUE) print(y) stopifnot(length(y) == ncol(lx)) stopifnot(all(y == +Inf)) ## multiple -Inf values lx <- matrix(c(-Inf, -Inf), nrow = 2L, ncol = 3L) y <- rowLogSumExps(lx) print(y) stopifnot(length(y) == nrow(lx)) stopifnot(all(y == -Inf)) lx <- matrix(c(-Inf, 5, -Inf), nrow = 2L, ncol = 3L, byrow = 1) y <- rowLogSumExps(lx) print(y) stopifnot(length(y) == nrow(lx)) stopifnot(all(y == 5)) matrixStats/tests/rowVars.R0000644000175100001440000000575113073232324015552 0ustar hornikuserslibrary("matrixStats") rowVars_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = var, na.rm = na.rm) }) } colVars_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 2L, FUN = var, na.rm = na.rm) }) } rowVars_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- rowWeightedMeans(x, cols = cols, na.rm = na.rm) rowVars(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } colVars_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- colWeightedMeans(x, rows = rows, na.rm = na.rm) colVars(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # With and without some NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { for (add_na in c(FALSE, TRUE)) { cat("add_na = ", add_na, "\n", sep = "") x <- matrix(1:100 + 0.1, nrow = 20, ncol = 5) if (add_na) { x[13:17, c(2, 4)] <- NA_real_ } cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) # Row/column ranges for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowVars_R(x, na.rm = na.rm) r1 <- rowVars(x, na.rm = na.rm) r1b <- rowVars_center(x, na.rm = na.rm) r2 <- colVars(t(x), na.rm = na.rm) r2b <- colVars_center(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1b, r1)) stopifnot(all.equal(r2b, r2)) } } # for (add_na ...) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(NA_real_, nrow = 20, ncol = 5) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowVars_R(x, na.rm = na.rm) r1 <- rowVars(x, na.rm = na.rm) r1b <- rowVars_center(x, na.rm = na.rm) r2 <- colVars(t(x), na.rm = na.rm) r2b <- colVars_center(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1b, r1)) stopifnot(all.equal(r2b, r2)) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 1x1 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(0, nrow = 1, ncol = 1) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowVars_R(x, na.rm = na.rm) r1 <- rowVars(x, na.rm = na.rm) r1b <- rowVars_center(x, na.rm = na.rm) r2 <- colVars(t(x), na.rm = na.rm) r2b <- colVars_center(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1b, r1)) stopifnot(all.equal(r2b, r2)) } matrixStats/tests/product.R0000644000175100001440000000220213073232324015553 0ustar hornikuserslibrary("matrixStats") for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") # Empty vector x <- 0 storage.mode(x) <- mode y <- prod(x, na.rm = TRUE) print(y) z <- product(x, na.rm = TRUE) print(z) stopifnot(all.equal(z, y)) # Test negative values x <- c(1, -4, 2) storage.mode(x) <- mode y <- prod(x, na.rm = TRUE) print(y) z <- product(x, na.rm = TRUE) print(z) stopifnot(all.equal(z, y)) # Test missing values x <- c(1, NA, NaN, 2) storage.mode(x) <- mode y <- prod(x, na.rm = TRUE) print(y) z <- product(x, na.rm = TRUE) print(z) stopifnot(all.equal(z, y)) x <- c(1, NA, NaN, 2) storage.mode(x) <- mode y <- prod(x, na.rm = FALSE) print(y) z <- product(x, na.rm = FALSE) print(z) stopifnot(all(is.na(z), is.na(y))) x <- c(1, NaN, 2) storage.mode(x) <- mode y <- prod(x, na.rm = FALSE) print(y) stopifnot(is.na(y)) z <- product(x, na.rm = FALSE) print(z) stopifnot(is.na(z)) } # for (mode ...) # NAs following 0s x <- c(0L, NA_integer_) y <- prod(x, na.rm = FALSE) print(y) z <- product(x, na.rm = FALSE) print(z) stopifnot(identical(z, y)) matrixStats/tests/binMeans,binCounts.R0000644000175100001440000000730613073232324017602 0ustar hornikuserslibrary("matrixStats") library("stats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Naive R implementation of binMeans() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - binMeans0 <- function(y, x, bx, na.rm = TRUE, count = TRUE, right = FALSE) { n_smooth <- length(bx) - 1L res <- double(n_smooth) counts <- rep(NaN, times = n_smooth) if (na.rm) { keep <- !is.na(x) & !is.na(y) x <- x[keep] y <- y[keep] } # For each bin... for (kk in seq_len(n_smooth)) { if (right) { idxs <- which(bx[kk] < x & x <= bx[kk + 1L]) } else { idxs <- which(bx[kk] <= x & x < bx[kk + 1L]) } y_kk <- y[idxs] res[kk] <- mean(y_kk) counts[kk] <- length(idxs) } # for (kk ...) if (count) attr(res, "count") <- counts res } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Case #1 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- 1:200 nx <- length(x) y <- double(nx) y[1:50] <- 5 y[101:150] <- -5 y <- y + rnorm(nx) # Bins bx <- c(0.5, 50.5, 100.5, 150.5, 200.5) y_smooth0 <- binMeans0(y, x = x, bx = bx) y_smooth <- binMeans(y, x = x, bx = bx) n_smooth <- binCounts(x, bx = bx) # Sanity check stopifnot(all.equal(y_smooth, y_smooth0)) stopifnot(all.equal(attr(y_smooth, "count"), n_smooth)) y_smooth0r <- rev(binMeans0(y, x = -x, bx = rev(-bx), count = FALSE, right = TRUE)) y_smoothr <- rev(binMeans(y, x = -x, bx = rev(-bx), count = FALSE, right = TRUE)) # Sanity check stopifnot(all.equal(y_smooth0r, y_smooth0, check.attributes = FALSE)) stopifnot(all.equal(y_smoothr, y_smooth0r)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Case #2 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - nx <- 1e4 x <- runif(nx) y <- runif(nx) nb <- 20 bx <- do.call(seq, c(as.list(range(x)), length.out = nb)) bx1 <- c(bx[-1], bx[nb] + 1) y_smooth0 <- binMeans0(y, x = x, bx = bx1) y_smooth <- binMeans(y, x = x, bx = bx1) n_smooth <- binCounts(x, bx = bx1) y_smoothr <- rev(binMeans(y, x = -x, bx = rev(-bx1), right = TRUE)) # Sanity check stopifnot(all.equal(y_smooth, y_smooth0)) stopifnot(all.equal(attr(y_smooth, "count"), n_smooth)) stopifnot(all.equal(y_smoothr, y_smooth, check.attributes = FALSE)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Empty bins # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- c(6:8, 16:19) nx <- length(x) y <- runif(nx) bx <- c(0, 5, 10, 15, 20, 25) y_smooth0 <- binMeans0(y, x = x, bx = bx) y_smooth <- binMeans(y, x = x, bx = bx) n_smooth <- binCounts(x, bx = bx) stopifnot(all.equal(attr(y_smooth, "count"), n_smooth)) stopifnot(all.equal(y_smooth, y_smooth0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Missing values # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- 1:200 x[100] <- NA_integer_ nx <- length(x) y <- double(nx) y[1:50] <- 5 y[101:150] <- -5 y[123:125] <- NA_real_ y <- y + rnorm(nx) # Bins bx <- c(0.5, 50.5, 100.5, 150.5, 200.5) y_smooth0 <- binMeans0(y, x = x, bx = bx) y_smooth <- binMeans(y, x = x, bx = bx) # Sanity check stopifnot(all.equal(y_smooth, y_smooth0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Exception handling # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Zero bin bounderies (invalid bin definition) bx <- double(0L) res <- try(y_smooth <- binMeans(x = 1:10, y = 1:10, bx = bx), silent = TRUE) stopifnot(inherits(res, "try-error")) # One bin boundery (invalid bin definition) bx <- double(1L) res <- try(y_smooth <- binMeans(x = 1:10, y = 1:10, bx = bx), silent = TRUE) stopifnot(inherits(res, "try-error")) matrixStats/tests/allocVector.R0000644000175100001440000000112613073232324016354 0ustar hornikuserslibrary("matrixStats") allocVector_R <- function(length, value = NA) { x <- vector(mode = typeof(value), length = length) if (!is.finite(value) || value != 0) x[] <- value x } values <- list( -1L, 0L, +1L, NA_integer_, .Machine$integer.max, -1, 0, +1, NA_real_, NaN, -Inf, +Inf, .Machine$double.xmin, .Machine$double.xmax, .Machine$double.eps, .Machine$double.neg.eps, FALSE, TRUE, NA ) n <- 100 for (value in values) { x0 <- allocVector_R(n, value = value) x <- allocVector(n, value = value) str(list(n = n, value = value, x = x, x0 = x0)) stopifnot(identical(x, x0)) } matrixStats/tests/weightedMedian.R0000644000175100001440000000461513073232324017023 0ustar hornikuserslibrary("matrixStats") x <- 1:5 y <- weightedMedian(x) y <- weightedMedian(x, w = c(NA, Inf, NA, Inf, NA), na.rm = TRUE) print(y) y <- weightedMedian(x, w = c(NA, Inf, NA, Inf, NA), na.rm = FALSE) print(y) stopifnot(is.na(y)) x <- 1:10 n <- length(x) y1 <- median(x) # 5.5 y2 <- weightedMedian(x) # 5.5 stopifnot(all.equal(y1, y2)) w <- rep(1, times = n) y1 <- weightedMedian(x, w) # 5.5 (default) y2a <- weightedMedian(x, ties = "weighted") # 5.5 (default) y2b <- weightedMedian(x, ties = "min") # 5 y2c <- weightedMedian(x, ties = "max") # 6 stopifnot(all.equal(y2a, y1)) y3 <- weightedMedian(x, w) # 5.5 (default) # Pull the median towards zero w[1] <- 5 y1 <- weightedMedian(x, w) # 3.5 y <- c(rep(0, times = w[1]), x[-1]) # Only possible for integer weights y2 <- median(y) # 3.5 stopifnot(all.equal(y1, y2)) # Put even more weight on the zero w[1] <- 8.5 y <- weightedMedian(x, w) # 2 # All weight on the first value w[1] <- Inf y <- weightedMedian(x, w) # 1 # All weight on the last value w[1] <- 1 w[n] <- Inf y <- weightedMedian(x, w) # 10 # All weights set to zero w <- rep(0, times = n) y <- weightedMedian(x, w) # NA x <- 1:4 w <- rep(1, times = 4) for (mode in c("integer", "double")) { storage.mode(x) <- mode for (ties in c("weighted", "mean", "min", "max")) { cat(sprintf("ties = %s\n", ties)) y <- weightedMedian(x, w, ties = ties) } } set.seed(0x42) y <- weightedMedian(x = double(0L)) print(y) stopifnot(length(y) == 1L) stopifnot(is.na(y)) y <- weightedMedian(x = x[1]) print(y) stopifnot(length(y) == 1L) stopifnot(all.equal(y, x[1])) n <- 1e3 x <- runif(n) w <- runif(n, min = 0, max = 1) for (mode in c("integer", "double")) { storage.mode(x) <- mode for (ties in c("weighted", "mean", "min", "max")) { y <- weightedMedian(x, w, ties = ties) cat(sprintf("mode = %s, ties = %s, result = %g\n", mode, ties, y)) } } # A large vector n <- 1e5 x <- runif(n) w <- runif(n, min = 0, max = 1) y <- weightedMedian(x, w) y <- weightedMedian(x, w, ties = "min") # Single Number xs <- c(1, NA_integer_) ws <- c(1, NA_integer_) for (x in xs) { for (w in ws) { y <- weightedMedian(x = x, w = w) if (is.na(w)) z <- NA_real_ else z <- x[1] stopifnot(all.equal(y, z)) } } matrixStats/tests/rowMads.R0000644000175100001440000001311113073232324015510 0ustar hornikuserslibrary("matrixStats") rowMads_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = mad, na.rm = na.rm) }) } colMads_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 2L, FUN = mad, na.rm = na.rm) }) } rowMads_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- rowMedians(x, cols = cols, na.rm = na.rm) rowMads(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } colMads_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- colMedians(x, rows = rows, na.rm = na.rm) colMads(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 3x3 matrix (no ties) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(c(1, 2, 3, 2, 3, 4, 3, 4, 5) + 0.1, nrow = 3, ncol = 3) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) cat("rowMads():\n") r0 <- rowMads_R(x, na.rm = TRUE) r1 <- rowMads(x, na.rm = TRUE) r1b <- rowMads_center(x, na.rm = TRUE) r2 <- colMads(t(x), na.rm = TRUE) r2b <- colMads_center(t(x), na.rm = TRUE) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1b, r1)) stopifnot(all.equal(r2b, r2)) cat("colMads():\n") r0 <- colMads_R(x, na.rm = TRUE) r1 <- colMads(x, na.rm = TRUE) r1b <- colMads_center(x, na.rm = TRUE) r2 <- rowMads(t(x), na.rm = TRUE) r2b <- rowMads_center(t(x), na.rm = TRUE) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1b, r1)) stopifnot(all.equal(r2b, r2)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Ties: a 4x4 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(c(1:4, 2:5, 3:6, 4:7) + 0.1, nrow = 4, ncol = 4) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) cat("rowMads():\n") r0 <- rowMads_R(x, na.rm = TRUE) r1 <- rowMads(x, na.rm = TRUE) r2 <- colMads(t(x), na.rm = TRUE) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) cat("colMads():\n") r0 <- colMads_R(x, na.rm = TRUE) r1 <- colMads(x, na.rm = TRUE) r2 <- rowMads(t(x), na.rm = TRUE) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # No ties: a 3x3 matrix with an NA value # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(c(1, 2, 3, 2, 3, 4, 3, 4, 5) + 0.1, nrow = 3, ncol = 3) x[2, 2] <- NA_real_ cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) cat("rowMads():\n") r0 <- rowMads_R(x, na.rm = TRUE) r1 <- rowMads(x, na.rm = TRUE) r2 <- colMads(t(x), na.rm = TRUE) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) cat("colMads():\n") r0 <- colMads_R(x, na.rm = TRUE) r1 <- colMads(x, na.rm = TRUE) r2 <- rowMads(t(x), na.rm = TRUE) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # With and without some NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (add_na in c(FALSE, TRUE)) { cat("add_na = ", add_na, "\n", sep = "") x <- matrix(1:100, nrow = 20, ncol = 5) if (add_na) { x[13:17, c(2, 4)] <- NA_real_ } # Row/column ranges for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") cat("rowMads():\n") r0 <- rowMads_R(x, na.rm = na.rm) r1 <- rowMads(x, na.rm = na.rm) r2 <- colMads(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1, r2)) cat("colMads():\n") r0 <- colMads_R(x, na.rm = na.rm) r1 <- colMads(x, na.rm = na.rm) r2 <- rowMads(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1, r2)) } } # for (add_na ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(NA_real_, nrow = 20, ncol = 5) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowMads_R(x, na.rm = na.rm) if (na.rm) r0[is.na(r0)] <- NaN r1 <- rowMads(x, na.rm = na.rm) r2 <- colMads(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1, r2)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 1x1 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(0, nrow = 1, ncol = 1) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowMads_R(x, na.rm = na.rm) r1 <- rowMads(x, na.rm = na.rm) r2 <- colMads(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 0x0 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(double(0), nrow = 0, ncol = 0) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowMads_R(x, na.rm = na.rm) r1 <- rowMads(x, na.rm = na.rm) r2 <- colMads(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } matrixStats/tests/rowQuantiles_subset.R0000644000175100001440000000261713073232324020167 0ustar hornikuserslibrary("matrixStats") rowQuantiles_R <- function(x, probs, na.rm = FALSE, drop = TRUE, ...) { q <- apply(x, MARGIN = 1L, FUN = function(x, probs, na.rm) { if (!na.rm && any(is.na(x))) { na_value <- NA_real_ storage.mode(na_value) <- storage.mode(x) rep(na_value, times = length(probs)) } else { as.vector(quantile(x, probs = probs, na.rm = na.rm, ...)) } }, probs = probs, na.rm = na.rm) if (!is.null(dim(q))) q <- t(q) else dim(q) <- c(nrow(x), length(probs)) digits <- max(2L, getOption("digits")) colnames(q) <- sprintf("%.*g%%", digits, 100 * probs) if (drop) q <- drop(q) q } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) probs <- c(0, 0.25, 0.75, 1) for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowQuantiles, fsure = rowQuantiles_R, probs = probs, na.rm = na.rm, drop = FALSE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colQuantiles, fsure = rowQuantiles_R, probs = probs, na.rm = na.rm, drop = FALSE) } } } matrixStats/tests/rowCumprods.R0000644000175100001440000000665213073232324016434 0ustar hornikuserslibrary("matrixStats") rowCumprods_R <- function(x) { suppressWarnings({ y <- t(apply(x, MARGIN = 1L, FUN = cumprod)) }) dim(y) <- dim(x) y } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # With and without some NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { for (add_na in c(FALSE, TRUE)) { cat("add_na = ", add_na, "\n", sep = "") x <- matrix(1:100, nrow = 20, ncol = 5) if (add_na) { x[13:17, c(2, 4)] <- NA_real_ } cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) # Row/column ranges r0 <- rowCumprods_R(x) r1 <- rowCumprods(x) r2 <- t(colCumprods(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (add_na ...) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(NA_real_, nrow = 20, ncol = 5) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) r0 <- rowCumprods_R(x) r1 <- rowCumprods(x) r2 <- t(colCumprods(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 1x1 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(0, nrow = 1, ncol = 1) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) r0 <- rowCumprods_R(x) r1 <- rowCumprods(x) r2 <- t(colCumprods(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # BUG FIX TEST: Assert zeros don't trump NAs in integer matrices # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(NA_real_, nrow = 3, ncol = 2) x[1, 2] <- 0 x[2, 2] <- 1 x[3, 1] <- 0 storage.mode(x) <- mode cat("mode: ", mode, "\n", sep = "") str(x) r0 <- rowCumprods_R(x) r1 <- rowCumprods(x) r2 <- t(colCumprods(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Corner cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") value <- 0 storage.mode(value) <- mode # A 0x0 matrix x <- matrix(value, nrow = 0L, ncol = 0L) str(x) r0 <- matrix(value, nrow = nrow(x), ncol = ncol(x)) r1 <- rowCumprods(x) r2 <- t(colCumprods(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) # A 0xK matrix x <- matrix(value, nrow = 0L, ncol = 5L) str(x) r0 <- matrix(value, nrow = nrow(x), ncol = ncol(x)) r1 <- rowCumprods(x) r2 <- t(colCumprods(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) # A Nx0 matrix x <- matrix(value, nrow = 5L, ncol = 0L) str(x) r0 <- matrix(value, nrow = nrow(x), ncol = ncol(x)) r1 <- rowCumprods(x) r2 <- t(colCumprods(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (mode ...) matrixStats/tests/rowAllAnys_subset.R0000644000175100001440000002000113073232324017550 0ustar hornikuserslibrary("matrixStats") rowAlls_R <- function(x, value = TRUE, na.rm = FALSE, ...) { if (is.na(value)) { apply(is.na(x), MARGIN = 1L, FUN = all, na.rm = na.rm) } else { y <- x == value dim(y) <- dim(x) # for 0×N and M×0 cases apply(y, MARGIN = 1L, FUN = all, na.rm = na.rm) } } rowAnys_R <- function(x, value = TRUE, na.rm = FALSE, ...) { if (is.na(value)) { apply(is.na(x), MARGIN = 1L, FUN = any, na.rm = na.rm) } else { y <- x == value dim(y) <- dim(x) # for 0×N and M×0 cases apply(y, MARGIN = 1L, FUN = any, na.rm = na.rm) } } rowAnyMissings_R <- function(x, ...) { apply(x, MARGIN = 1L, FUN = anyMissing) } all_R <- function(x, value = TRUE, ...) { if (is.na(value)) { all(is.na(x), ...) } else { all(x == value, ...) } } any_R <- function(x, value = TRUE, ...) { if (is.na(value)) { any(is.na(x), ...) } else { any(x == value, ...) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -3, max = 3), nrow = 6, ncol = 6) storage.mode(x) <- "integer" x[2:3, ] <- NA_integer_ x[2, 1] <- 0L x[4:5, ] <- 0L x[4, 6] <- NA_integer_ for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = rowAlls, fsure = rowAlls_R, value = 0, na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, ftest = rowAlls, fsure = rowAlls_R, value = 0, na.rm = FALSE) validateIndicesTestMatrix(x, rows, cols, ftest = rowAlls, fsure = rowAlls_R, value = NA_integer_) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAlls, fsure = rowAlls_R, value = 0, na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAlls, fsure = rowAlls_R, value = 0, na.rm = FALSE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAlls, fsure = rowAlls_R, value = NA_integer_) validateIndicesTestMatrix(x, rows, cols, ftest = rowAnys, fsure = rowAnys_R, value = 0, na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, ftest = rowAnys, fsure = rowAnys_R, value = 0, na.rm = FALSE) validateIndicesTestMatrix(x, rows, cols, ftest = rowAnys, fsure = rowAnys_R, value = NA_integer_) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAnys, fsure = rowAnys_R, value = 0, na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAnys, fsure = rowAnys_R, value = 0, na.rm = FALSE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAnys, fsure = rowAnys_R, value = NA_integer_) validateIndicesTestMatrix(x, rows, cols, ftest = rowAnyMissings, fsure = rowAnyMissings_R) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAnyMissings, fsure = rowAnyMissings_R) } } for (rr in seq_len(nrow(x))) { for (idxs in index_cases) { validateIndicesTestVector(x[rr, ], idxs, ftest = allValue, fsure = all_R, value = 0, na.rm = TRUE) validateIndicesTestVector(x[rr, ], idxs, ftest = allValue, fsure = all_R, value = 0, na.rm = FALSE) validateIndicesTestVector(x[rr, ], idxs, ftest = allValue, fsure = all_R, value = NA_integer_) validateIndicesTestVector(x[rr, ], idxs, ftest = anyValue, fsure = any_R, value = 0, na.rm = TRUE) validateIndicesTestVector(x[rr, ], idxs, ftest = anyValue, fsure = any_R, value = 0, na.rm = FALSE) validateIndicesTestVector(x[rr, ], idxs, ftest = anyValue, fsure = any_R, value = NA_integer_) } } storage.mode(x) <- "character" for (rows in index_cases) { for (cols in index_cases) { validateIndicesTestMatrix(x, rows, cols, ftest = rowAlls, fsure = rowAlls_R, value = "0", na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, ftest = rowAlls, fsure = rowAlls_R, value = "0", na.rm = FALSE) validateIndicesTestMatrix(x, rows, cols, ftest = rowAlls, fsure = rowAlls_R, value = NA_character_) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAlls, fsure = rowAlls_R, value = "0", na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAlls, fsure = rowAlls_R, value = "0", na.rm = FALSE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAlls, fsure = rowAlls_R, value = NA_character_) validateIndicesTestMatrix(x, rows, cols, ftest = rowAnys, fsure = rowAnys_R, value = "0", na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, ftest = rowAnys, fsure = rowAnys_R, value = "0", na.rm = FALSE) validateIndicesTestMatrix(x, rows, cols, ftest = rowAnys, fsure = rowAnys_R, value = NA_character_) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAnys, fsure = rowAnys_R, value = "0", na.rm = TRUE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAnys, fsure = rowAnys_R, value = "0", na.rm = FALSE) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAnys, fsure = rowAnys_R, value = NA_character_) validateIndicesTestMatrix(x, rows, cols, ftest = rowAnyMissings, fsure = rowAnyMissings_R) validateIndicesTestMatrix(x, rows, cols, fcoltest = colAnyMissings, fsure = rowAnyMissings_R) } } for (rr in seq_len(nrow(x))) { for (idxs in index_cases) { validateIndicesTestVector(x[rr, ], idxs, ftest = allValue, fsure = all_R, value = "0", na.rm = TRUE) validateIndicesTestVector(x[rr, ], idxs, ftest = allValue, fsure = all_R, value = "0", na.rm = FALSE) validateIndicesTestVector(x[rr, ], idxs, ftest = allValue, fsure = all_R, value = NA_integer_) validateIndicesTestVector(x[rr, ], idxs, ftest = anyValue, fsure = any_R, value = "0", na.rm = TRUE) validateIndicesTestVector(x[rr, ], idxs, ftest = anyValue, fsure = any_R, value = "0", na.rm = FALSE) validateIndicesTestVector(x[rr, ], idxs, ftest = anyValue, fsure = any_R, value = NA_integer_) } } matrixStats/tests/rowTabulates.R0000644000175100001440000000174513073232324016562 0ustar hornikuserslibrary("matrixStats") nrow <- 6L ncol <- 5L nbr_of_unique_values <- 5L data <- matrix(1:nbr_of_unique_values, nrow = nrow, ncol = ncol) modes <- c("integer", "raw") for (mode in modes) { cat(sprintf("Mode: %s...\n", mode)) x <- data storage.mode(x) <- mode print(x) y <- rowTabulates(x) print(y) stopifnot(identical(dim(y), c(nrow, nbr_of_unique_values))) y <- colTabulates(x) print(y) stopifnot(identical(dim(y), c(ncol, nbr_of_unique_values))) # Count only certain values y <- rowTabulates(x, values = 1:3) print(y) stopifnot(identical(dim(y), c(nrow, 3L))) y <- colTabulates(x, values = 1:3) print(y) stopifnot(identical(dim(y), c(ncol, 3L))) # Raw y <- rowTabulates(x, values = as.raw(1:3)) print(y) stopifnot(identical(dim(y), c(nrow, 3L))) y2 <- colTabulates(t(x), values = as.raw(1:3)) print(y2) stopifnot(identical(dim(y2), c(nrow, 3L))) stopifnot(identical(y2, y)) cat(sprintf("Mode: %s...done\n", mode)) } # for (mode ...) matrixStats/tests/diff2_subset.R0000644000175100001440000000076013073232324016461 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- runif(6, min = -6, max = 6) for (l in 1:2) { for (d in 1:2) { for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = diff2, fsure = base::diff, lag = l, differences = d) } } } matrixStats/tests/weightedMean_subset.R0000644000175100001440000000146113073232324020067 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") for (mode in c("numeric", "integer")) { x <- runif(6, min = -6, max = 6) w <- runif(6, min = 0, max = 6) storage.mode(x) <- mode storage.mode(w) <- mode if (mode == "numeric") w[1] <- Inf for (idxs in index_cases) { validateIndicesTestVector_w(x, w, idxs, ftest = weightedMean, fsure = weighted.mean, na.rm = TRUE, refine = TRUE) validateIndicesTestVector_w(x, w, idxs, ftest = weightedMean, fsure = weighted.mean, na.rm = FALSE, refine = TRUE) } } matrixStats/tests/rowCounts.R0000644000175100001440000001036113073232324016103 0ustar hornikuserslibrary("matrixStats") rowCounts_R <- function(x, value = TRUE, na.rm = FALSE, ...) { if (is.na(value)) { counts <- apply(x, MARGIN = 1L, FUN = function(x) sum(is.na(x)) ) } else { counts <- apply(x, MARGIN = 1L, FUN = function(x) sum(x == value, na.rm = na.rm) ) } as.integer(counts) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Data type: integer and numeric # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(runif(20 * 5, min = -3, max = 3), nrow = 20, ncol = 5) x[sample.int(length(x), size = 7)] <- 0 storage.mode(x) <- mode for (na.rm in c(FALSE, TRUE)) { # Count zeros r0 <- rowCounts_R(x, value = 0, na.rm = na.rm) r1 <- rowCounts(x, value = 0, na.rm = na.rm) r2 <- colCounts(t(x), value = 0, na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r0)) # Count NAs r0 <- rowCounts_R(x, value = NA, na.rm = na.rm) r1 <- rowCounts(x, value = NA, na.rm = na.rm) r2 <- colCounts(t(x), value = NA, na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r0)) if (mode == "integer") { ux <- unique(as.vector(x)) r0 <- r1 <- r2 <- integer(nrow(x)) for (value in ux) { r0 <- r0 + rowCounts_R(x, value = value, na.rm = na.rm) r1 <- r1 + rowCounts(x, value = value, na.rm = na.rm) r2 <- r2 + colCounts(t(x), value = value, na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r0)) } stopifnot(all(r0 == ncol(x))) } # if (mode == "integer") } # for (na.rm ...) } # for (mode ...) # All NAs na_list <- list(NA_integer_, NA_real_, NaN) for (na_value in na_list) { x <- matrix(na_value, nrow = 20, ncol = 5) for (na.rm in c(FALSE, TRUE)) { r0 <- rowCounts_R(x, na.rm = na.rm) r1 <- rowCounts(x, na.rm = na.rm) r2 <- colCounts(t(x), na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r0)) # Count NAs r0 <- rowCounts_R(x, value = NA, na.rm = na.rm) r1 <- rowCounts(x, value = NA, na.rm = na.rm) r2 <- colCounts(t(x), value = NA, na.rm = na.rm) stopifnot(all(r0 == ncol(x))) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r0)) } } # for (na_value ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Data type: logical # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(FALSE, nrow = 20, ncol = 5) x[13:17, c(2, 4)] <- TRUE x[2:4, ] <- TRUE x[, 1] <- TRUE x[5, ] <- FALSE x[, 5] <- FALSE # Row/column counts for (na.rm in c(FALSE, TRUE)) { r0 <- rowCounts_R(x, na.rm = na.rm) r1 <- rowCounts(x, na.rm = na.rm) r2 <- colCounts(t(x), na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r0)) r_true <- rowCounts(x, value = TRUE, na.rm = na.rm) r_false <- rowCounts(x, value = FALSE, na.rm = na.rm) stopifnot(r_true + r_false == ncol(x)) c_true <- colCounts(x, value = TRUE, na.rm = na.rm) c_false <- colCounts(x, value = FALSE, na.rm = na.rm) stopifnot(c_true + c_false == nrow(x)) # Count NAs r0 <- rowCounts_R(x, value = NA, na.rm = na.rm) r1 <- rowCounts(x, value = NA, na.rm = na.rm) r2 <- colCounts(t(x), value = NA, na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Data type: character (not sure if this should be supported) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(rep(letters, length.out = 20 * 5), nrow = 20, ncol = 5) x[2:3, 3:4] <- NA_character_ # Row/column counts for (na.rm in c(FALSE, TRUE)) { for (value in c("g", NA_character_)) { r0 <- rowCounts_R(x, value = value, na.rm = na.rm) r1 <- rowCounts(x, value = value, na.rm = na.rm) r2 <- colCounts(t(x), value = value, na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r0)) c <- count(x[1, ], value = value, na.rm = na.rm) stopifnot(identical(c, r1[1])) c <- count(x[2, ], value = value, na.rm = na.rm) stopifnot(identical(c, r1[2])) } } # NA row x <- matrix(0, nrow = 2, ncol = 2) x[1, ] <- NA_integer_ r0 <- rowCounts(x, value = 0) r1 <- rowCounts_R(x, value = 0) stopifnot(identical(r0, r1)) matrixStats/tests/psortKM.R0000644000175100001440000000246113073232324015501 0ustar hornikuserslibrary("matrixStats") library("utils") ## utils::str # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Local functions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - psortKM_R <- function(x, k, m) { x <- sort(x) x[(k - m + 1):k] } psortKM_R2 <- function(x, k, m) { partial <- (k - m + 1):k x <- sort.int(x, partial = partial) x[partial] } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Consistency checks # - - - - - - - - - - - - - - - - - - - - - - - - - - - - set.seed(1) cat("Consistency checks:\n") x <- 1:500 x[298:300] <- 300 y <- sample(x) cat("x:\n") str(x) cat("sample(x):\n") str(y) for (k in c(1, 2, 300, 301, length(x))) { for (m in 1:min(5, k)) { px0 <- psortKM_R(x, k = k, m = m) px0b <- psortKM_R2(x, k = k, m = m) stopifnot(identical(px0b, px0)) px1 <- matrixStats:::.psortKM(x, k = k, m = m) cat(sprintf(".psortKM(x, k = %d, m = %d):\n", k, m)) print(px1) stopifnot(identical(px1, px0)) py0 <- psortKM_R(y, k = k, m = m) py0b <- psortKM_R2(y, k = k, m = m) stopifnot(identical(py0b, py0)) py1 <- matrixStats:::.psortKM(y, k = k, m = m) cat(sprintf(".psortKM(y, k = %d, m = %d):\n", k, m)) print(py1) stopifnot(identical(py1, py0)) stopifnot(identical(py1, px1)) } # for (m ...) } # for (k ...) matrixStats/tests/binCounts_subset.R0000644000175100001440000000174013073232324017432 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Local functions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - binCounts_hist <- function(x, bx, right = FALSE, ...) { n0 <- graphics::hist(x, breaks = bx, right = right, include.lowest = TRUE, plot = FALSE)$counts } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- runif(6, min = -6, max = 6) storage.mode(x) <- "integer" bx <- c(-6, 0, 3, 4, 10) for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = binCounts, fsure = binCounts_hist, bx = bx, right = FALSE) validateIndicesTestVector(x, idxs, ftest = binCounts, fsure = binCounts_hist, bx = bx, right = TRUE) } matrixStats/tests/rowProds_subset.R0000644000175100001440000000175013073232324017306 0ustar hornikuserslibrary("matrixStats") rowProds_R <- function(x, FUN = prod, na.rm = FALSE, ...) { apply(x, MARGIN = 1L, FUN = FUN, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) storage.mode(x) <- "integer" for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = rowProds, fsure = rowProds_R, method = "expSumLog", FUN = product, na.rm = na.rm) validateIndicesTestMatrix(x, rows, cols, fcoltest = colProds, fsure = rowProds_R, method = "expSumLog", FUN = product, na.rm = na.rm) } } } matrixStats/tests/rowDiffs.R0000644000175100001440000000427113073232324015666 0ustar hornikuserslibrary("matrixStats") rowDiffs_R <- function(x, lag = 1L, differences = 1L, ...) { ncol2 <- ncol(x) - lag * differences if (ncol2 <= 0) { return(matrix(x[integer(0L)], nrow = nrow(x), ncol = 0L)) } suppressWarnings({ y <- apply(x, MARGIN = 1L, FUN = diff, lag = lag, differences = differences) }) y <- t(y) dim(y) <- c(nrow(x), ncol2) y } set.seed(0x42) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # With and without some NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") for (add_na in c(FALSE, TRUE)) { cat("add_na = ", add_na, "\n", sep = "") x <- matrix(sample(20 * 8) + 0.1, nrow = 20, ncol = 8) if (add_na) { x[13:17, c(2, 4)] <- NA_real_ } storage.mode(x) <- mode str(x) for (lag in 1:4) { for (differences in 1:3) { cat(sprintf("mode: %s, lag = %d, differences = %d\n", mode, lag, differences)) # Row/column ranges r0 <- rowDiffs_R(x, lag = lag, differences = differences) r1 <- rowDiffs(x, lag = lag, differences = differences) r2 <- t(colDiffs(t(x), lag = lag, differences = differences)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1, r2)) } } } # for (add_na ...) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") x <- matrix(NA_real_, nrow = 20, ncol = 5) storage.mode(x) <- mode str(x) r0 <- rowDiffs_R(x) r1 <- rowDiffs(x) r2 <- t(colDiffs(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 1x1 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(0, nrow = 1, ncol = 1) r0 <- rowDiffs_R(x) r1 <- rowDiffs(x) r2 <- t(colDiffs(t(x))) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) matrixStats/tests/rowVarDiffs_mad,iqr_subset.R0000644000175100001440000000243513073232324021335 0ustar hornikuserslibrary("matrixStats") fcns <- list( madDiff = c(rowMadDiffs, colMadDiffs), iqrDiff = c(rowIQRDiffs, colIQRDiffs) ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") trim <- runif(1, min = 0, max = 0.5) for (fcn in names(fcns)) { cat(sprintf("subsetted tests on %s()...\n", fcn)) row_fcn <- fcns[[fcn]][[1L]] col_fcn <- fcns[[fcn]][[2L]] for (mode in c("numeric", "integer")) { x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6L, ncol = 6L) storage.mode(x) <- mode if (mode == "numeric") x[1:2, 3:4] <- Inf for (diff in 1:2) { for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix(x, rows, cols, ftest = row_fcn, fsure = row_fcn, na.rm = na.rm, diff = diff, trim = trim) validateIndicesTestMatrix(x, rows, cols, fcoltest = col_fcn, fsure = row_fcn, na.rm = na.rm, diff = diff, trim = trim) } } } } } cat(sprintf("%s()...DONE\n", fcn)) } matrixStats/tests/logSumExp.R0000644000175100001440000000620513073232324016025 0ustar hornikuserslibrary("matrixStats") library("stats") logSumExp_R <- function(lx, na.rm = FALSE) { log(sum(exp(lx), na.rm = na.rm)) } ## R-help thread \emph{'[R] Beyond double-precision?'} on May 9, 2009. for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") set.seed(1) x <- runif(20, min = 1.0, max = 3.0) storage.mode(x) <- mode str(x) ## The logarithm of the harmonic mean y0 <- log(1 / mean(1 / x)) print(y0) ## -1.600885 lx <- log(x) y1 <- log(length(x)) - logSumExp(-lx) print(y1) ## [1] -1.600885 # Sanity check stopifnot(all.equal(y1, y0)) y2 <- log(length(x)) - logSumExp_R(-lx) # Sanity check stopifnot(all.equal(y2, y0)) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Missing values # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## NA values lx <- c(1, 2, 3) lx[2] <- NA_real_ y0 <- logSumExp_R(lx, na.rm = FALSE) y <- logSumExp(lx, na.rm = FALSE) print(y) stopifnot(identical(y, NA_real_)) stopifnot(all.equal(y, y0)) y0 <- logSumExp_R(lx, na.rm = TRUE) y <- logSumExp(lx, na.rm = TRUE) print(y) stopifnot(all.equal(y, y0)) ## NaN values lx <- c(1, 2, 3) lx[2] <- NaN y0 <- logSumExp_R(lx, na.rm = FALSE) y <- logSumExp(lx, na.rm = FALSE) print(y) stopifnot(identical(y, NA_real_)) stopifnot(all.equal(y, y0)) y0 <- logSumExp_R(lx, na.rm = TRUE) y <- logSumExp(lx, na.rm = TRUE) print(y) stopifnot(all.equal(y, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Corner cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## Zero-length vectors lx <- numeric(0L) y0 <- logSumExp_R(lx) y <- logSumExp(lx) print(y) stopifnot(identical(y, -Inf)) stopifnot(all.equal(y, y0)) ## Vectors of length one lx <- 1.0 y0 <- logSumExp_R(lx) y <- logSumExp(lx) print(y) stopifnot(identical(y, lx)) stopifnot(all.equal(y, y0)) lx <- NA_real_ y0 <- logSumExp_R(lx, na.rm = TRUE) y <- logSumExp(lx, na.rm = TRUE) print(y) stopifnot(identical(y, -Inf)) stopifnot(all.equal(y, y0)) ## All missing values lx <- c(NA_real_, NA_real_) y0 <- logSumExp_R(lx, na.rm = TRUE) y <- logSumExp(lx, na.rm = TRUE) print(y) stopifnot(identical(y, -Inf)) stopifnot(all.equal(y, y0)) lx <- c(NA_real_, NA_real_) y0 <- logSumExp_R(lx, na.rm = FALSE) y <- logSumExp(lx, na.rm = FALSE) print(y) stopifnot(identical(y, NA_real_)) stopifnot(all.equal(y, y0)) ## +Inf values lx <- c(1, 2, +Inf) y0 <- logSumExp_R(lx) y <- logSumExp(lx) print(y) stopifnot(identical(y, +Inf)) stopifnot(all.equal(y, y0)) ## First element is a missing value, cf. PR #33 lx <- c(NA_real_, 1) y0 <- logSumExp_R(lx) print(y0) y <- logSumExp(lx, na.rm = FALSE) print(y) stopifnot(identical(y, NA_real_)) stopifnot(all.equal(y, y0)) y0 <- logSumExp_R(lx, na.rm = TRUE) print(y0) y <- logSumExp(lx, na.rm = TRUE) print(y) stopifnot(identical(y, 1)) stopifnot(all.equal(y, y0)) ## Multiple -Inf values, cf. issue #84 lx <- c(-Inf, -Inf) y0 <- logSumExp_R(lx) y <- logSumExp(lx) print(y) stopifnot(identical(y, -Inf)) stopifnot(all.equal(y, y0)) lx <- c(-Inf, 5, -Inf) y0 <- logSumExp_R(lx) y <- logSumExp(lx) print(y) stopifnot(identical(y, 5)) stopifnot(all.equal(y, y0)) matrixStats/tests/logSumExp_subset.R0000644000175100001440000000123313073232324017406 0ustar hornikuserslibrary("matrixStats") logSumExp_R <- function(lx, na.rm = FALSE) { log(sum(exp(lx), na.rm = na.rm)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- runif(6, min = -6, max = 6) for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = logSumExp, fsure = logSumExp_R, na.rm = FALSE) validateIndicesTestVector(x, idxs, ftest = logSumExp, fsure = logSumExp_R, na.rm = TRUE) } matrixStats/tests/rowSums2.R0000644000175100001440000001511213073232324015640 0ustar hornikuserslibrary("matrixStats") rowSums_R <- function(x, na.rm = FALSE, ...) { ## FIXME: sum() may overflow for integers, whereas ## base::rowSums() doesn't. What should rowSums2() do? ## apply(x, MARGIN = 1L, FUN = sum, na.rm = na.rm) rowSums(x, na.rm = na.rm) } colSums2_R <- function(x, na.rm = FALSE, ...) { ## FIXME: sum() may overflow for integers, whereas ## base::colSums() doesn't. What should colSums2() do? ## apply(x, MARGIN = 2L, FUN = sum, na.rm = na.rm) colSums(x, na.rm = na.rm) } for (mode in c("integer", "double")) { x <- matrix(1:9 + 0.1, nrow = 3, ncol = 3) storage.mode(x) <- mode y0 <- rowSums_R(x, na.rm = FALSE) y1 <- rowSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colSums2_R(x, na.rm = FALSE) y1 <- colSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Single-element matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Single-element matrix:\n") for (mode in c("integer", "double")) { x <- matrix(1, nrow = 1, ncol = 1) storage.mode(x) <- mode y0 <- rowSums_R(x, na.rm = FALSE) y1 <- rowSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colSums2_R(x, na.rm = FALSE) y1 <- colSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Empty matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Empty matrix:\n") for (mode in c("integer", "double")) { x <- matrix(integer(0), nrow = 0, ncol = 0) storage.mode(x) <- mode y0 <- rowSums_R(x, na.rm = FALSE) y1 <- rowSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colSums2_R(x, na.rm = FALSE) y1 <- colSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All NAs:\n") for (mode in c("integer", "double")) { x <- matrix(NA_integer_, nrow = 3, ncol = 3) storage.mode(x) <- mode y0 <- rowSums_R(x, na.rm = TRUE) y1 <- rowSums2(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) y0 <- colSums2_R(x, na.rm = TRUE) y1 <- colSums2(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All NaNs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All NaNs:\n") x <- matrix(NA_real_, nrow = 3, ncol = 3) y0 <- rowSums_R(x, na.rm = TRUE) y1 <- rowSums2(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) y0 <- colSums2_R(x, na.rm = TRUE) y1 <- colSums2(x, na.rm = TRUE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All Infs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All Infs:\n") x <- matrix(Inf, nrow = 3, ncol = 3) y0 <- rowSums_R(x, na.rm = FALSE) y1 <- rowSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colSums2_R(x, na.rm = FALSE) y1 <- colSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: All -Infs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: All -Infs:\n") x <- matrix(-Inf, nrow = 3, ncol = 3) y0 <- rowSums_R(x, na.rm = FALSE) y1 <- rowSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colSums2_R(x, na.rm = FALSE) y1 <- colSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Infs and -Infs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Infs and -Infs:\n") x <- matrix(c(-Inf, +Inf), nrow = 4, ncol = 4) y0 <- rowSums_R(x, na.rm = FALSE) y1 <- rowSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colSums2_R(x, na.rm = FALSE) y1 <- colSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: NaNs and NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Infs and -Infs:\n") x <- matrix(c(NaN, NA_real_), nrow = 4, ncol = 4) y0 <- rowSums(x, na.rm = FALSE) str(y0) stopifnot(all(is.na(y0)), length(unique(y0)) >= 1L) y1 <- rowSums2(x, na.rm = FALSE) str(y0) stopifnot(all(is.na(y1)), length(unique(y1)) >= 1L) stopifnot(all.equal(y1, y0)) y0 <- colSums(x, na.rm = FALSE) stopifnot(all(is.na(y0)), length(unique(y0)) == 1L) y1 <- colSums2(x, na.rm = FALSE) stopifnot(all(is.na(y1)), length(unique(y1)) == 1L) ## NOTE, due to compiler optimization, it is not guaranteed that NA is ## returned here (as one would expect). NaN might very well be returned, ## when both NA and NaN are involved. This is an accepted feature in R, ## which is documented in help("is.nan"). See also ## https://stat.ethz.ch/pipermail/r-devel/2017-April/074009.html. ## Thus, we cannot guarantee that y1 is identical to y0. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special case: Integer overflow with ties # - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("Special case: Integer overflow with ties:\n") x <- matrix(.Machine$integer.max, nrow = 4, ncol = 4) y0 <- rowSums_R(x, na.rm = FALSE) y1 <- rowSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) y0 <- colSums2_R(x, na.rm = FALSE) y1 <- colSums2(x, na.rm = FALSE) stopifnot(all.equal(y1, y0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Consistency checks # - - - - - - - - - - - - - - - - - - - - - - - - - - - - set.seed(1) cat("Consistency checks:\n") n_sims <- if (Sys.getenv("_R_CHECK_USE_VALGRIND_") != "") 4L else 20L for (kk in seq_len(n_sims)) { cat("Random test #", kk, "\n", sep = "") # Simulate data in a matrix of any shape dim <- sample(50:200, size = 2) n <- prod(dim) x <- rnorm(n, sd = 100) dim(x) <- dim # Add NAs? if ((kk %% 4) %in% c(3, 0)) { cat("Adding NAs\n") nna <- sample(n, size = 1) na_values <- c(NA_real_, NaN) t <- sample(na_values, size = nna, replace = TRUE) x[sample(length(x), size = nna)] <- t } # Integer or double? if ((kk %% 4) %in% c(2, 0)) { cat("Coercing to integers\n") storage.mode(x) <- "integer" } na.rm <- sample(c(TRUE, FALSE), size = 1) # rowSums2(): y0 <- rowSums_R(x, na.rm = na.rm) y1 <- rowSums2(x, na.rm = na.rm) stopifnot(all.equal(y1, y0)) y2 <- colSums2(t(x), na.rm = na.rm) stopifnot(all.equal(y2, y0)) # colSums2(): y0 <- colSums2_R(x, na.rm = na.rm) y1 <- colSums2(x, na.rm = na.rm) stopifnot(all.equal(y1, y0)) y2 <- rowSums2(t(x), na.rm = na.rm) stopifnot(all.equal(y2, y0)) } # for (kk ...) matrixStats/tests/rowWeightedMedians_subset.R0000644000175100001440000000223313073232324021255 0ustar hornikuserslibrary("matrixStats") rowWeightedMedians_R <- function(x, w, na.rm = FALSE, ...) { apply(x, MARGIN = 1L, FUN = weightedMedian, w = w, na.rm = na.rm, ...) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") for (mode in c("numeric", "integer")) { x <- matrix(runif(6 * 6, min = -6, max = 6), nrow = 6, ncol = 6) w <- runif(6, min = 0, max = 6) storage.mode(x) <- mode storage.mode(w) <- mode if (mode == "numeric") w[1] <- Inf for (rows in index_cases) { for (cols in index_cases) { for (na.rm in c(TRUE, FALSE)) { validateIndicesTestMatrix_w(x, w, rows, cols, ftest = rowWeightedMedians, fsure = rowWeightedMedians_R, na.rm = na.rm) validateIndicesTestMatrix_w(x, w, rows, cols, fcoltest = colWeightedMedians, fsure = rowWeightedMedians_R, na.rm = na.rm) } } } } matrixStats/tests/weightedMedian_subset.R0000644000175100001440000000252713073232324020410 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") for (mode in c("numeric", "integer")) { x <- runif(6, min = -6, max = 6) w <- runif(6, min = 0, max = 6) storage.mode(x) <- mode storage.mode(w) <- mode if (mode == "numeric") w[1] <- Inf for (idxs in index_cases) { validateIndicesTestVector_w(x, w, idxs, ftest = weightedMedian, fsure = weightedMedian, na.rm = TRUE) validateIndicesTestVector_w(x, w, idxs, ftest = weightedMedian, fsure = weightedMedian, na.rm = FALSE) for (ties in c("weighted", "mean", "min", "max")) { validateIndicesTestVector_w(x, w, idxs, ftest = weightedMedian, fsure = weightedMedian, na.rm = TRUE, ties = ties) validateIndicesTestVector_w(x, w, idxs, ftest = weightedMedian, fsure = weightedMedian, na.rm = FALSE, ties = ties) } } } matrixStats/tests/weightedVar.R0000644000175100001440000000446213073232324016356 0ustar hornikuserslibrary("matrixStats") weightedVar_R <- function(x, w) { mu <- weighted.mean(x, w = w) sum(w * (x - mu) ^ 2) / (sum(w) - 1) } n <- 10 x <- as.double(1:n) message("*** weightedVar() ...") message("- Zero elements") m0 <- var(integer(0)) m1 <- weightedVar(integer(0), w = integer(0)) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) message("- One elements") m0 <- var(1) m1 <- weightedVar(1) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) message("- Uniform weights (all w = 1)") m0 <- var(x) w <- rep(1, times = n) m1 <- weightedVar(x, w = w) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) message("- Uniform weights (all w = 3)") m0 <- var(rep(x, each = 3)) w <- rep(3, times = n) m1 <- weightedVar(x, w = w) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) message("- Uniform weights on the first five elements") idxs <- 1:5 m0 <- var(x[1:5]) w <- rep(0, times = n) w[idxs] <- 1 m1 <- weightedVar(x, w = w) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) message("- Uniform weights on every second elements") idxs <- seq(from = 1, to = n, by = 2) m0 <- var(x[idxs]) w <- rep(0, times = n) w[idxs] <- 1 m1 <- weightedVar(x, w = w) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) message("- All weights are zero") idxs <- integer(0L) m0 <- var(x[idxs]) w <- rep(0, times = n) w[idxs] <- 1 m1 <- weightedVar(x, w = w) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) message("- Infinite weights on first element") idxs <- 1L m0 <- var(x[idxs]) w <- rep(0, times = n) w[idxs] <- Inf m1 <- weightedVar(x, w = w) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) message("- Frequency weights") ## From https://en.wikipedia.org/wiki/Weighted_arithmetic_mean y <- c(2, 2, 4, 5, 5, 5) x <- unique(y) w <- table(y) stopifnot(names(w) == x) m0 <- weightedVar(x, w = w) m1 <- var(y) stopifnot(all.equal(m1, m0)) m2 <- weightedVar(x, w = w) str(list(m0 = m0, m1 = m1, m2 = m2)) stopifnot(all.equal(m2, m0)) ## From https://github.com/HenrikBengtsson/matrixStats/issues/72 large <- c(21, 8, 26, 1, 15, 33, 12, 25, 0, 84) years <- c(41706, 9301, 33678, 3082, 27040, 44188, 10049, 30591, 2275, 109831) m0 <- weightedVar(large, w = years) m1 <- weightedVar(large, w = years) str(list(m0 = m0, m1 = m1)) stopifnot(all.equal(m1, m0)) message("*** weightedVar() ... DONE") matrixStats/tests/varDiff_etal_subset.R0000644000175100001440000000207013073232324020051 0ustar hornikuserslibrary("matrixStats") fcns <- list( varDiff = varDiff, sdDiff = sdDiff, madDiff = madDiff, iqrDiff = iqrDiff ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") for (name in names(fcns)) { cat(sprintf("subsetted tests on %s()...\n", name)) fcn <- fcns[[name]] for (mode in c("numeric", "integer")) { x <- runif(6, min = -6, max = 6) storage.mode(x) <- mode trim <- runif(1, min = 0, max = 0.5) if (mode == "numeric") x[1] <- Inf for (diff in 1:2) { for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = fcn, fsure = fcn, na.rm = TRUE, diff = diff, trim = trim) validateIndicesTestVector(x, idxs, ftest = fcn, fsure = fcn, na.rm = FALSE, diff = diff, trim = trim) } } } cat(sprintf("%s()...DONE\n", name)) } matrixStats/tests/product_subset.R0000644000175100001440000000107213073232324017144 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") x <- runif(6, min = -6, max = 6) storage.mode(x) <- "integer" for (idxs in index_cases) { validateIndicesTestVector(x, idxs, ftest = product, fsure = prod, na.rm = TRUE) validateIndicesTestVector(x, idxs, ftest = product, fsure = prod, na.rm = FALSE) } matrixStats/tests/weightedVar_etal_subset.R0000644000175100001440000000200213073232324020734 0ustar hornikuserslibrary("matrixStats") fcns <- list( weightedVar = weightedVar, weightedSd = weightedSd, weightedMad = weightedMad ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetted tests # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - source("utils/validateIndicesFramework.R") for (name in names(fcns)) { cat(sprintf("subsetted tests on %s()...\n", name)) fcn <- fcns[[name]] for (mode in c("numeric", "integer")) { x <- runif(6, min = -6, max = 6) w <- runif(6, min = 0, max = 6) storage.mode(x) <- mode storage.mode(w) <- mode if (mode == "numeric") w[1] <- Inf for (idxs in index_cases) { validateIndicesTestVector_w(x, w, idxs, ftest = fcn, fsure = fcn, na.rm = TRUE) validateIndicesTestVector_w(x, w, idxs, ftest = fcn, fsure = fcn, na.rm = FALSE) } } cat(sprintf("%s()...DONE\n", name)) } matrixStats/tests/mean2.R0000644000175100001440000001170413073232324015104 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Consistency checks # - - - - - - - - - - - - - - - - - - - - - - - - - - - - set.seed(1) mean2_R <- function(x, na.rm = FALSE, idxs = NULL) { if (is.null(idxs)) { mean(x, na.rm = na.rm) } else { mean(x[idxs], na.rm = na.rm) } } # mean2_R() cat("Consistency checks:\n") for (kk in 1:20) { cat("Random test #", kk, "\n", sep = "") # Simulate data in a matrix of any shape n <- sample(1e3, size = 1L) x <- rnorm(n, sd = 100) # Add NAs? if ((kk %% 4) %in% c(3, 0)) { cat("Adding NAs\n") nna <- sample(n, size = 1L) na_values <- c(NA_real_, NaN) t <- sample(na_values, size = nna, replace = TRUE) x[sample(length(x), size = nna)] <- t } # Integer or double? if ((kk %% 4) %in% c(2, 0)) { cat("Coercing to integers\n") storage.mode(x) <- "integer" } na.rm <- sample(c(TRUE, FALSE), size = 1L) # Sum over all y0 <- mean2_R(x, na.rm = na.rm) y1 <- mean2(x, na.rm = na.rm) stopifnot(all.equal(y1, y0)) # Sum over subset nidxs <- sample(n, size = 1L) idxs <- sample(n, size = nidxs) y0 <- mean2_R(x, na.rm = na.rm, idxs = idxs) y1 <- mean2(x, na.rm = na.rm, idxs = idxs) stopifnot(all.equal(y1, y0)) } # for (kk ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (na.rm in c(FALSE, TRUE)) { # Averaging over zero elements (integers) x <- integer(0) s1 <- mean(x, na.rm = na.rm) s2 <- mean2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) x <- 1:10 idxs <- integer(0) s1 <- mean(x[idxs], na.rm = na.rm) s2 <- mean2(x, idxs = idxs, na.rm = na.rm) stopifnot(identical(s1, s2)) # Averaging over NA_integer_:s x <- rep(NA_integer_, times = 10L) s1 <- mean(x, na.rm = na.rm) s2 <- mean2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) x <- rep(NA_integer_, times = 10L) idxs <- 1:5 s1 <- mean(x[idxs], na.rm = na.rm) s2 <- mean2(x, idxs = idxs, na.rm = na.rm) stopifnot(identical(s1, s2)) # Averaging over zero elements (doubles) x <- double(0) s1 <- mean(x) s2 <- mean2(x) stopifnot(identical(s1, s2)) x <- as.double(1:10) idxs <- integer(0) s1 <- mean(x[idxs]) s2 <- mean2(x, idxs = idxs) stopifnot(identical(s1, s2)) # Averaging over NA_real_:s x <- rep(NA_real_, times = 10L) s1 <- mean(x, na.rm = na.rm) s2 <- mean2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) x <- rep(NA_real_, times = 10L) idxs <- 1:5 s1 <- mean(x[idxs], na.rm = na.rm) s2 <- mean2(x, idxs = idxs, na.rm = na.rm) stopifnot(identical(s1, s2)) # Averaging over -Inf:s x <- rep(-Inf, times = 3L) s1 <- mean(x, na.rm = na.rm) s2 <- mean2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) # Averaging over +Inf:s x <- rep(+Inf, times = 3L) s1 <- mean(x, na.rm = na.rm) s2 <- mean2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) # Averaging over mix of -Inf:s and +Inf:s x <- rep(c(-Inf, +Inf), times = 3L) s1 <- mean(x, na.rm = na.rm) s2 <- mean2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) # Averaging over mix of -Inf:s and +Inf:s and numerics x <- rep(c(-Inf, +Inf, 3.14), times = 2L) s1 <- mean(x, na.rm = na.rm) s2 <- mean2(x, na.rm = na.rm) stopifnot(identical(s1, s2)) # Averaging over mix of NaN, NA, +Inf, and numerics x <- c(NaN, NA, +Inf, 3.14) s1 <- mean(x, na.rm = na.rm) s2 <- mean2(x, na.rm = na.rm) if (na.rm) { stopifnot(identical(s2, s1)) } else { stopifnot(is.na(s1), is.na(s2)) ## NOTE, due to compiler optimization, it is not guaranteed that NA is ## returned here (as one would expect). NaN might very well be returned, ## when both NA and NaN are involved. This is an accepted feature in R, ## which is documented in help("is.nan"). See also ## https://stat.ethz.ch/pipermail/r-devel/2017-April/074009.html. ## Thus, we cannot guarantee that s1 is identical to s0. } # Averaging over mix of NaN, NA, +Inf, and numerics x <- c(NA, NaN, +Inf, 3.14) s1 <- mean(x, na.rm = na.rm) s2 <- mean2(x, na.rm = na.rm) if (na.rm) { stopifnot(identical(s2, s1)) } else { stopifnot(is.na(s1), is.na(s2)) ## NOTE, due to compiler optimization, it is not guaranteed that NA is ## returned here (as one would expect). NaN might very well be returned, ## when both NA and NaN are involved. This is an accepted feature in R, ## which is documented in help("is.nan"). See also ## https://stat.ethz.ch/pipermail/r-devel/2017-April/074009.html. ## Thus, we cannot guarantee that s1 is identical to s0. } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'idxs' # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- 1:10 idxs_list <- list( integer = 1:5, double = as.double(1:5), logical = (x <= 5) ) for (idxs in idxs_list) { cat("idxs:\n") str(idxs) s1 <- mean(x[idxs], na.rm = TRUE) s2 <- mean2(x, idxs = idxs, na.rm = TRUE) stopifnot(identical(s1, s2)) } matrixStats/tests/rowSds.R0000644000175100001440000000572213073232324015366 0ustar hornikuserslibrary("matrixStats") rowSds_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 1L, FUN = sd, na.rm = na.rm) }) } colSds_R <- function(x, na.rm = FALSE) { suppressWarnings({ apply(x, MARGIN = 2L, FUN = sd, na.rm = na.rm) }) } rowSds_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- rowWeightedMeans(x, cols = cols, na.rm = na.rm) rowSds(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } colSds_center <- function(x, rows = NULL, cols = NULL, na.rm = FALSE) { center <- colWeightedMeans(x, rows = rows, na.rm = na.rm) colSds(x, rows = rows, cols = cols, center = center, na.rm = na.rm) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # With and without some NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { for (add_na in c(FALSE, TRUE)) { cat("add_na = ", add_na, "\n", sep = "") x <- matrix(1:100 + 0.1, nrow = 20, ncol = 5) if (add_na) { x[13:17, c(2, 4)] <- NA_real_ } cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) # Row/column ranges for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowSds_R(x, na.rm = na.rm) r1 <- rowSds(x, na.rm = na.rm) r1b <- rowSds_center(x, na.rm = na.rm) r2 <- colSds(t(x), na.rm = na.rm) r2b <- colSds_center(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1b, r1)) stopifnot(all.equal(r2b, r2)) } } # for (add_na ...) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # All NAs # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { x <- matrix(NA_real_, nrow = 20, ncol = 5) cat("mode: ", mode, "\n", sep = "") storage.mode(x) <- mode str(x) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowSds_R(x, na.rm = na.rm) r1 <- rowSds(x, na.rm = na.rm) r1b <- rowSds_center(x, na.rm = na.rm) r2 <- colSds(t(x), na.rm = na.rm) r2b <- colSds_center(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1b, r1)) stopifnot(all.equal(r2b, r2)) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A 1x1 matrix # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(0, nrow = 1, ncol = 1) for (na.rm in c(FALSE, TRUE)) { cat("na.rm = ", na.rm, "\n", sep = "") r0 <- rowSds_R(x, na.rm = na.rm) r1 <- rowSds(x, na.rm = na.rm) r1b <- rowSds_center(x, na.rm = na.rm) r2 <- colSds(t(x), na.rm = na.rm) r2b <- colSds_center(t(x), na.rm = na.rm) stopifnot(all.equal(r1, r2)) stopifnot(all.equal(r1, r0)) stopifnot(all.equal(r2, r0)) stopifnot(all.equal(r1b, r1)) stopifnot(all.equal(r2b, r2)) } matrixStats/tests/anyMissing.R0000644000175100001440000000474013073232324016225 0ustar hornikuserslibrary("matrixStats") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Setup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - data <- data.frame( logical = c(TRUE, FALSE, TRUE, FALSE), integer = 1:4, double = seq(from = 1.0, to = 4.0, by = 1.0), complex = seq(from = 1.0, to = 4.0, by = 1.0) + 1.0i, character = I(letters[1:4]) ) modes <- names(data) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Special cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("NULL...\n") stopifnot(identical(anyMissing(NULL), FALSE)) cat("NULL...done\n") cat("raw...\n") stopifnot(identical(anyMissing(as.raw(0:3)), FALSE)) cat("raw...done\n") cat("list(NULL)...\n") stopifnot(identical(anyMissing(list(NULL)), FALSE)) cat("list(NULL)...done\n") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Scalars, vectors, and matrices of various modes # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in modes) { cat(sprintf("Mode: %s...\n", mode)) values <- data[[mode]] # Scalars cat(" scalar\n") x <- values[1L] print(x) stopifnot(identical(anyMissing(x), FALSE)) is.na(x) <- TRUE print(x) stopifnot(identical(anyMissing(x), TRUE)) # Vectors cat(" vector\n") x <- values print(x) stopifnot(identical(anyMissing(x), FALSE)) is.na(x)[2L] <- TRUE print(x) stopifnot(identical(anyMissing(x), TRUE)) # Matrices cat(" matrix\n") x <- matrix(c(values, values), ncol = 2L) print(x) stopifnot(identical(anyMissing(x), FALSE)) is.na(x)[2L] <- TRUE print(x) stopifnot(identical(anyMissing(x), TRUE)) cat(sprintf("Mode: %s...done\n", mode)) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Data frames # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("data.frame...\n") x <- data stopifnot(identical(anyMissing(x), FALSE)) for (mode in modes) { x <- data is.na(x[[mode]])[2L] <- TRUE print(x) stopifnot(identical(anyMissing(x), TRUE)) } # for (mode ...) cat("data.frame...done\n") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Lists # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cat("list...\n") x <- as.list(data) stopifnot(identical(anyMissing(x), FALSE)) for (mode in modes) { x <- as.list(data) is.na(x[[mode]])[2L] <- TRUE print(x) stopifnot(identical(anyMissing(x), TRUE)) } # for (mode ...) cat("list...done\n") matrixStats/tests/weightedVar_etal.R0000644000175100001440000000347013073232324017361 0ustar hornikuserslibrary("matrixStats") fcns <- list( weightedVar = weightedVar, weightedSd = weightedSd, weightedMad = weightedMad ) for (name in names(fcns)) { cat(sprintf("%s()...\n", name)) fcn <- fcns[[name]] for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") n <- 15L x <- runif(n, min = -5, max = 5) storage.mode(x) <- mode str(x) for (add_na in c(FALSE, TRUE)) { cat("add_na: ", add_na, "\n", sep = "") if (add_na) { x[c(5, 7)] <- NA } str(x) for (na.rm in c(FALSE, TRUE)) { cat("na.rm: ", na.rm, "\n", sep = "") cat("Weights are not specified (all are 1)\n") m1 <- fcn(x, na.rm = na.rm) str(list(m1 = m1)) cat("All weights are 1\n") w <- rep(1, times = n) m1 <- fcn(x, w, na.rm = na.rm) str(list(m1 = m1)) cat("First weight is 5\n") # Pull the mean towards zero w[1] <- 5 str(w) m1 <- fcn(x, w, na.rm = na.rm) str(list(m1 = m1)) cat("All weights are 0\n") # All weights set to zero w <- rep(0, times = n) m1 <- fcn(x, w, na.rm = na.rm) str(list(m1 = m1)) cat("First weight is 8.5\n") # Put even more weight on the zero w[1] <- 8.5 m1 <- fcn(x, w, na.rm = na.rm) str(list(m1 = m1)) cat("First weight is Inf\n") # All weight on the first value w[1] <- Inf m1 <- fcn(x, w, na.rm = na.rm) str(list(m1 = m1)) cat("Last weight is Inf\n") # All weight on the last value w[1] <- 1 w[n] <- Inf m1 <- fcn(x, w, na.rm = na.rm) str(list(m1 = m1)) } # for (na.rm ...) } # for (add_na ...) } # for (mode ...) cat(sprintf("%s()...DONE\n", name)) } # for (name ...) matrixStats/tests/utils/0000755000175100001440000000000013070644022015113 5ustar hornikusersmatrixStats/tests/utils/validateIndicesFramework.R0000644000175100001440000001302313070644022022203 0ustar hornikuserslibrary("matrixStats") validateIndicesTestVector <- function(x, idxs, ftest, fsure, debug = FALSE, ...) { if (debug) cat(sprintf("idxs=%s, type=%s\n", toString(idxs), toString(typeof(idxs)))) suppressWarnings({ actual <- tryCatch(ftest(x, idxs = idxs, ...), error = function(c) "error") expect <- tryCatch({ if (!is.null(idxs)) x <- x[idxs] fsure(x, ...) }, error = function(c) "error") }) if (debug) cat(sprintf("actual=%s\nexpect=%s\n", toString(actual), toString(expect))) stopifnot(all.equal(actual, expect)) } validateIndicesTestVector_w <- function(x, w, idxs, ftest, fsure, debug = FALSE, ...) { if (debug) cat(sprintf("idxs=%s, type=%s\n", toString(idxs), toString(typeof(idxs)))) suppressWarnings({ actual <- tryCatch(ftest(x, w, idxs = idxs, ...), error = function(c) "error") expect <- tryCatch({ if (!is.null(idxs)) { x <- x[idxs] w <- w[idxs] } fsure(x, w, ...) }, error = function(c) "error") }) if (debug) cat(sprintf("actual=%s\nexpect=%s\n", toString(actual), toString(expect))) stopifnot(all.equal(actual, expect)) } validateIndicesTestMatrix <- function(x, rows, cols, ftest, fcoltest, fsure, debug = FALSE, ...) { if (debug) { cat(sprintf("rows=%s; type=%s\n", toString(rows), toString(typeof(rows)))) cat(sprintf("cols=%s; type=%s\n", toString(cols), toString(typeof(cols)))) } suppressWarnings({ if (missing(fcoltest)) { actual <- tryCatch(ftest(x, rows = rows, cols = cols, ...), error = function(c) "error") } else { actual <- tryCatch(fcoltest(t(x), rows = cols, cols = rows, ...), error = function(c) "error") } expect <- tryCatch({ if (!is.null(rows) && !is.null(cols)) { x <- x[rows, cols, drop = FALSE] } else if (!is.null(rows)) { x <- x[rows, , drop = FALSE] } else if (!is.null(cols)) { x <- x[, cols, drop = FALSE] } fsure(x, ...) }, error = function(c) "error") }) if (debug) cat(sprintf("actual=%s\nexpect=%s\n", toString(actual), toString(expect))) stopifnot(all.equal(actual, expect)) } validateIndicesTestMatrix_w <- function(x, w, rows, cols, ftest, fcoltest, fsure, debug = FALSE, ...) { if (debug) { cat(sprintf("rows=%s; type=%s\n", toString(rows), toString(typeof(rows)))) cat(sprintf("cols=%s; type=%s\n", toString(cols), toString(typeof(cols)))) } suppressWarnings({ if (missing(fcoltest)) { actual <- tryCatch(ftest(x, w, rows = rows, cols = cols, ...), error = function(c) "error") } else { actual <- tryCatch(fcoltest(t(x), w, rows = cols, cols = rows, ...), error = function(c) "error") } expect <- tryCatch({ if (!is.null(rows) && !is.null(cols)) { x <- x[rows, cols, drop = FALSE] w <- w[cols] } else if (!is.null(rows)) { x <- x[rows, , drop = FALSE] } else if (!is.null(cols)) { x <- x[, cols, drop = FALSE] w <- w[cols] } fsure(x, w, ...) }, error = function(c) "error") }) if (debug) cat(sprintf("actual=%s\nexpect=%s\n", toString(actual), toString(expect))) stopifnot(all.equal(actual, expect)) } index_cases <- list() # negative indices with duplicates index_cases[[length(index_cases) + 1]] <- c(-4, 0, 0, -3, -1, -3, -1) # positive indices index_cases[[length(index_cases) + 1]] <- c(3, 5, 1) # positive indices with duplicates index_cases[[length(index_cases) + 1]] <- c(3, 0, 0, 5, 1, 5, 5) # positive indices out of ranges index_cases[[length(index_cases) + 1]] <- 4:9 # negative out of ranges: just ignore index_cases[[length(index_cases) + 1]] <- c(-5, 0, -3, -1, -9) # negative indices exclude all index_cases[[length(index_cases) + 1]] <- -1:-6 # idxs is single number index_cases[[length(index_cases) + 1]] <- 4 index_cases[[length(index_cases) + 1]] <- -4 index_cases[[length(index_cases) + 1]] <- 0 # idxs is empty index_cases[[length(index_cases) + 1]] <- integer() # NA in idxs index_cases[[length(index_cases) + 1]] <- c(NA_real_, 0, 2) # Inf in idxs index_cases[[length(index_cases) + 1]] <- c(-Inf, -1) index_cases[[length(index_cases) + 1]] <- c(NA_real_, 0, 2, Inf) # single logical index_cases[[length(index_cases) + 1]] <- NA index_cases[[length(index_cases) + 1]] <- TRUE index_cases[[length(index_cases) + 1]] <- FALSE # full logical idxs index_cases[[length(index_cases) + 1]] <- c(FALSE, TRUE, FALSE, TRUE, TRUE, FALSE) # too many logical idxs index_cases[[length(index_cases) + 1]] <- c(FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE) # insufficient idxs index_cases[[length(index_cases) + 1]] <- c(FALSE, TRUE) index_cases[[length(index_cases) + 1]] <- c(FALSE, TRUE, NA) index_cases[[length(index_cases) + 1]] <- c(FALSE, TRUE, NA, FALSE) # NULL index_cases[length(index_cases) + 1] <- list(NULL) index_error_cases <- list() # mixed positive and negative indices index_error_cases[[length(index_cases) + 1]] <- 1:-1 # mixed positive, negative and zero indices index_error_cases[[length(index_cases) + 1]] <- c(-4, 0, 0, 1) # NA in idxs index_error_cases[[length(index_cases) + 1]] <- c(NA_real_, -2) matrixStats/tests/rowIQRs.R0000644000175100001440000000364613073232324015456 0ustar hornikuserslibrary("matrixStats") rowIQRs_R <- function(x, na.rm = FALSE) { quantile_na <- function(x, ..., na.rm = FALSE) { if (!na.rm && anyMissing(x)) return(c(NA_real_, NA_real_)) quantile(x, ..., na.rm = na.rm) } q <- apply(x, MARGIN = 1L, FUN = quantile_na, probs = c(0.25, 0.75), na.rm = na.rm) dim(q) <- c(2L, nrow(x)) q[2L, , drop = TRUE] - q[1L, , drop = TRUE] } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Test with multiple quantiles # - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") x <- matrix(1:100 + 0.1, nrow = 10, ncol = 10) storage.mode(x) <- mode str(x) for (add_na in c(FALSE, TRUE)) { if (add_na) { x[3:5, 6:9] <- NA } for (na.rm in c(FALSE, TRUE)) { probs <- c(0, 0.5, 1) q0 <- rowIQRs_R(x, na.rm = na.rm) print(q0) q1 <- rowIQRs(x, na.rm = na.rm) print(q1) stopifnot(all.equal(q1, q0)) q2 <- colIQRs(t(x), na.rm = na.rm) stopifnot(all.equal(q2, q0)) q <- iqr(x[3, ], na.rm = na.rm) print(q) } # for (na.rm ...) } # for (add_na ...) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Test corner cases # - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") # Empty vectors x <- integer(0L) storage.mode(x) <- mode str(x) q <- iqr(x) print(q) stopifnot(identical(q, NA_real_)) # Scalar x <- 1L storage.mode(x) <- mode str(x) q <- iqr(x) str(q) stopifnot(identical(q, 0)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Single row matrices # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(1, nrow = 1L, ncol = 2L) q <- rowIQRs(x) stopifnot(identical(q, 0)) x <- matrix(1, nrow = 2L, ncol = 1L) q <- colIQRs(x) stopifnot(identical(q, 0)) matrixStats/tests/rowAllAnys.R0000644000175100001440000001356113073232324016200 0ustar hornikuserslibrary("matrixStats") rowAlls_R <- function(x, value = TRUE, na.rm = FALSE, ...) { if (is.na(value)) { apply(is.na(x), MARGIN = 1L, FUN = all, na.rm = na.rm) } else { y <- x == value dim(y) <- dim(x) # for 0×N and M×0 cases apply(y, MARGIN = 1L, FUN = all, na.rm = na.rm) } } rowAnys_R <- function(x, value = TRUE, na.rm = FALSE, ...) { if (is.na(value)) { apply(is.na(x), MARGIN = 1L, FUN = any, na.rm = na.rm) } else { y <- x == value dim(y) <- dim(x) # for 0×N and M×0 cases apply(y, MARGIN = 1L, FUN = any, na.rm = na.rm) } } rowAnyMissings_R <- function(x, ...) { apply(x, MARGIN = 1L, FUN = anyMissing) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Data type: logical # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(FALSE, nrow = 20, ncol = 5) x[13:17, c(2, 4)] <- TRUE x[2:4, ] <- TRUE x[, 1] <- TRUE x[5, ] <- FALSE x[, 5] <- FALSE x[3, ] <- FALSE x[4, ] <- TRUE for (kk in 1:3) { if (kk == 2) { x[2, 2] <- NA } else if (kk == 3) { x[, 2] <- NA x[2, ] <- NA } # Row/column all for (na.rm in c(FALSE, TRUE)) { m0 <- rowAlls_R(x, na.rm = na.rm) m1 <- rowAlls(x, na.rm = na.rm) m2 <- colAlls(t(x), na.rm = na.rm) str(list("all()", m0 = m0, m1 = m1, m2 = m2)) stopifnot(identical(m1, m0)) stopifnot(identical(m2, m0)) } # Row/column any for (na.rm in c(FALSE, TRUE)) { m0 <- rowAnys_R(x, na.rm = na.rm) m1 <- rowAnys(x, na.rm = na.rm) m2 <- colAnys(t(x), na.rm = na.rm) str(list("any()", m0 = m0, m1 = m1, m2 = m2)) stopifnot(identical(m1, m0)) stopifnot(identical(m2, m0)) m0 <- rowAnyMissings_R(x) m1 <- rowAnyMissings(x) m2 <- colAnyMissings(t(x)) str(list("anyMissing()", m0 = m0, m1 = m1, m2 = m2)) stopifnot(identical(m1, m0)) stopifnot(identical(m2, m0)) } } # for (kk ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Data type: integer # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(rep(1:28, length.out = 20 * 5), nrow = 10, ncol = 5) x[2, ] <- 7L x[3, 1] <- 7L x[2:3, 3:4] <- NA_integer_ # Row/column counts value <- 7L for (na.rm in c(FALSE, TRUE)) { ## All r0 <- rowAlls_R(x, value = value, na.rm = na.rm) r1 <- rowAlls(x, value = value, na.rm = na.rm) r2 <- colAlls(t(x), value = value, na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r1)) for (rr in seq_len(nrow(x))) { c <- allValue(x[rr, ], value = value, na.rm = na.rm) stopifnot(identical(c, r1[rr])) c <- allValue(x[rr, ], value = value, na.rm = na.rm) stopifnot(identical(c, r1[rr])) } ## Any r0 <- rowAnys_R(x, value = value, na.rm = na.rm) r1 <- rowAnys(x, value = value, na.rm = na.rm) r2 <- colAnys(t(x), value = value, na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r1)) for (rr in seq_len(nrow(x))) { c <- anyValue(x[rr, ], value = value, na.rm = na.rm) stopifnot(identical(c, r1[rr])) c <- anyValue(x[rr, ], value = value, na.rm = na.rm) stopifnot(identical(c, r1[rr])) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # rowAlls(x) et al. on numeric 'x' with logical 'value' # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(0, nrow = 4L, ncol = 4L) x[2:4, 2] <- (1:3) / 3 x[2, 2:4] <- (1:3) / 3 x[3:4, 3] <- (3:4) / 3 x[3, 3:4] <- (3:4) / 3 x[4, 4] <- NA_real_ for (na.rm in c(FALSE, TRUE)) { y0 <- suppressWarnings(apply(x, MARGIN = 1L, FUN = any, na.rm = na.rm)) y <- rowAnys(x, na.rm = na.rm) stopifnot(identical(y, y0)) y0 <- suppressWarnings(apply(x, MARGIN = 2L, FUN = any, na.rm = na.rm)) y <- colAnys(x, na.rm = na.rm) stopifnot(identical(y, y0)) y0 <- suppressWarnings(apply(x, MARGIN = 1L, FUN = all, na.rm = na.rm)) y <- rowAlls(x, na.rm = na.rm) stopifnot(identical(y, y0)) y0 <- suppressWarnings(apply(x, MARGIN = 2L, FUN = all, na.rm = na.rm)) y <- colAlls(x, na.rm = na.rm) stopifnot(identical(y, y0)) print(y0) } ## for (na.rm ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Data type: character (not sure if this should be supported) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all_R <- function(x, value = TRUE, ...) { if (is.na(value)) { all(is.na(x), ...) } else { all(x == value, ...) } } any_R <- function(x, value = TRUE, ...) { if (is.na(value)) { any(is.na(x), ...) } else { any(x == value, ...) } } x <- matrix(rep(letters, length.out = 20 * 5), nrow = 20, ncol = 5) x[2, ] <- "g" x[2:4, 3:4] <- NA_character_ # Row/column counts for (value in c("g", NA_character_)) { for (na.rm in c(FALSE, TRUE)) { ## All r0 <- rowAlls_R(x, value = value, na.rm = na.rm) r1 <- rowAlls(x, value = value, na.rm = na.rm) r2 <- colAlls(t(x), value = value, na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r1)) for (rr in seq_len(nrow(x))) { c0 <- all_R(x[rr, ], value, na.rm = na.rm) c <- allValue(x[rr, ], value = value, na.rm = na.rm) stopifnot(identical(c, r1[rr])) stopifnot(identical(c, c0)) } ## Any r0 <- rowAnys_R(x, value = value, na.rm = na.rm) r1 <- rowAnys(x, value = value, na.rm = na.rm) r2 <- colAnys(t(x), value = value, na.rm = na.rm) stopifnot(identical(r1, r0)) stopifnot(identical(r2, r1)) for (rr in seq_len(nrow(x))) { c0 <- any_R(x[rr, ], value, na.rm = na.rm) c <- anyValue(x[rr, ], value = value, na.rm = na.rm) stopifnot(identical(c, c0)) stopifnot(identical(c, r1[rr])) } } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # NA 0 test # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(0, nrow = 3, ncol = 3) x[1, ] <- c(NA_real_, NA_real_, 0) x[3, ] <- c(1, 0, 1) r0 <- rowAnys_R(x, value = 0) r1 <- rowAnys(x, value = 0) stopifnot(identical(r0, r1)) matrixStats/tests/rowQuantiles.R0000644000175100001440000000745413073232324016606 0ustar hornikuserslibrary("matrixStats") rowQuantiles_R <- function(x, probs, na.rm = FALSE, drop = TRUE, ...) { q <- apply(x, MARGIN = 1L, FUN = function(x, probs, na.rm) { if (!na.rm && any(is.na(x))) { na_value <- NA_real_ storage.mode(na_value) <- storage.mode(x) rep(na_value, times = length(probs)) } else { as.vector(quantile(x, probs = probs, na.rm = na.rm, ...)) } }, probs = probs, na.rm = na.rm) if (!is.null(dim(q))) q <- t(q) else dim(q) <- c(nrow(x), length(probs)) digits <- max(2L, getOption("digits")) colnames(q) <- sprintf("%.*g%%", digits, 100 * probs) if (drop) q <- drop(q) q } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Test with multiple quantiles # - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") x <- matrix(1:40 + 0.1, nrow = 8, ncol = 5) storage.mode(x) <- mode str(x) probs <- c(0, 0.5, 1) q0 <- rowQuantiles_R(x, probs = probs) print(q0) q1 <- rowQuantiles(x, probs = probs) print(q1) stopifnot(all.equal(q1, q0)) q2 <- colQuantiles(t(x), probs = probs) stopifnot(all.equal(q2, q0)) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Test with a single quantile # - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (mode in c("integer", "double")) { cat("mode: ", mode, "\n", sep = "") x <- matrix(1:40, nrow = 8, ncol = 5) storage.mode(x) <- mode str(x) probs <- c(0.5) q0 <- rowQuantiles_R(x, probs = probs) print(q0) q1 <- rowQuantiles(x, probs = probs) print(q1) stopifnot(all.equal(q1, q0)) q2 <- colQuantiles(t(x), probs = probs) stopifnot(all.equal(q2, q0)) } # for (mode ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Consistency checks # - - - - - - - - - - - - - - - - - - - - - - - - - - - - set.seed(1) probs <- seq(from = 0, to = 1, by = 0.25) cat("Consistency checks:\n") n_sims <- if (Sys.getenv("_R_CHECK_USE_VALGRIND_") != "") 4L else 20L for (kk in seq_len(n_sims)) { cat("Random test #", kk, "\n", sep = "") # Simulate data in a matrix of any shape dim <- sample(20:60, size = 2L) n <- prod(dim) x <- rnorm(n, sd = 100) dim(x) <- dim # Add NAs? has_na <- (kk %% 4) %in% c(3, 0) if (has_na) { cat("Adding NAs\n") nna <- sample(n, size = 1) na_values <- c(NA_real_, NaN) t <- sample(na_values, size = nna, replace = TRUE) x[sample(length(x), size = nna)] <- t } # Integer or double? if ((kk %% 4) %in% c(2, 0)) { cat("Coercing to integers\n") storage.mode(x) <- "integer" } str(x) # rowQuantiles(): q0 <- rowQuantiles_R(x, probs = probs, na.rm = has_na) q1 <- rowQuantiles(x, probs = probs, na.rm = has_na) stopifnot(all.equal(q1, q0)) q2 <- colQuantiles(t(x), probs = probs, na.rm = has_na) stopifnot(all.equal(q2, q0)) } # for (kk ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Empty matrices # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(NA_real_, nrow = 0L, ncol = 0L) probs <- c(0, 0.25, 0.75, 1) q <- rowQuantiles(x, probs = probs) stopifnot(identical(dim(q), c(nrow(x), length(probs)))) q <- colQuantiles(x, probs = probs) stopifnot(identical(dim(q), c(ncol(x), length(probs)))) x <- matrix(NA_real_, nrow = 2L, ncol = 0L) q <- rowQuantiles(x, probs = probs) stopifnot(identical(dim(q), c(nrow(x), length(probs)))) x <- matrix(NA_real_, nrow = 0L, ncol = 2L) q <- colQuantiles(x, probs = probs) stopifnot(identical(dim(q), c(ncol(x), length(probs)))) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Single column matrices # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- matrix(1, nrow = 2L, ncol = 1L) q <- rowQuantiles(x, probs = probs) print(q) x <- matrix(1, nrow = 1L, ncol = 2L) q <- colQuantiles(x, probs = probs) print(q) matrixStats/src/0000755000175100001440000000000013073627232013407 5ustar hornikusersmatrixStats/src/productExpSumLog_lowlevel_template.h0000644000175100001440000000535113073627232022654 0ustar hornikusers/*********************************************************************** TEMPLATE: double productExpSumLog_[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int hasna Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { LDOUBLE y = 0.0, t; R_xlen_t ii; int isneg = 0; int hasZero = 0; #ifdef IDXS_TYPE IDXS_C_TYPE *cidxs = (IDXS_C_TYPE*) idxs; #endif /* Calculate sum(log(abs(x))) */ for (ii = 0 ; ii < nidxs; ii++) { t = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), X_NA); /* Missing values? */ if (narm) { if (X_ISNAN(t)) continue; } #if X_TYPE == 'i' /* Early stopping? */ if (X_ISNAN(t)) { y = NA_REAL; break; } else if (t < 0) { isneg = !isneg; t = -t; } else if (t == 0) { hasZero = 1; /* Early stopping? */ if (narm) break; } #elif X_TYPE == 'r' if (t < 0) { isneg = !isneg; t = -t; } #endif t = log(t); y += t; /* Rprintf("#%d: x=%g, is.nan(x)=%d, abs(x)=%g, is.nan(abs(x))=%d, log(abs(x))=%g, is.nan(log(abs(x)))=%d, sum=%g, is.nan(sum)=%d\n", ii, x[ii], R_IsNaN(x[ii]), X_ABS(x[ii]), R_IsNaN(abs(x[ii])), t, R_IsNaN(y), y, R_IsNaN(y)); */ #if X_TYPE == 'r' /* Early stopping? Special for long LDOUBLE vectors */ if (ii % 1048576 == 0 && ISNAN(y)) break; #endif } if (ISNAN(y)) { /* If there where NA and/or NaN elements, then 'y' will at this point be NaN. The information on an NA value is lost when calculating fabs(NA), which returns NaN. For consistency with integers, we return NA in all cases. */ y = NA_REAL; } else if (hasZero) { /* no NA in 'x' and 'x' contains zero */ y = 0; } else { y = exp(y); /* Update sign */ if (isneg) { y = -y; } /* 2flow or underflow? */ if (y > DOUBLE_XMAX) { y = R_PosInf; } else if (y < -DOUBLE_XMAX) { y = R_NegInf; } } return (double)y; } /*************************************************************************** HISTORY: 2015-07-04 [DJ] o Supported subsetted computation. 2014-11-06 [HB] o CLEANUP: Moving away from R data types in low-level C functions. 2014-06-04 [HB] o Created. **************************************************************************/ matrixStats/src/productExpSumLog.c0000644000175100001440000000275613073627232017051 0ustar hornikusers/*************************************************************************** Public methods: SEXP productExpSumLog(SEXP x, SEXP idxs, SEXP naRm, SEXP hasNA) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "productExpSumLog_lowlevel.h" SEXP productExpSumLog(SEXP x, SEXP idxs, SEXP naRm, SEXP hasNA) { SEXP ans = NILSXP; R_xlen_t nx; double res = NA_REAL; int narm, hasna; /* Argument 'x': */ assertArgVector(x, (R_TYPE_INT | R_TYPE_REAL), "x"); nx = xlength(x); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'idxs': */ R_xlen_t nidxs; int idxsType; void *cidxs = validateIndices(idxs, nx, 1, &nidxs, &idxsType); /* Double matrices are more common to use. */ if (isReal(x)) { res = productExpSumLog_dbl[idxsType](REAL(x), nx, cidxs, nidxs, narm, hasna); } else if (isInteger(x)) { res = productExpSumLog_int[idxsType](INTEGER(x), nx, cidxs, nidxs, narm, hasna); } /* Return results */ PROTECT(ans = allocVector(REALSXP, 1)); REAL(ans)[0] = res; UNPROTECT(1); return(ans); } // productExpSumLog() /*************************************************************************** HISTORY: 2015-07-04 [DJ] o Supported subsetted computation. 2014-06-04 [HB] o Created. **************************************************************************/ matrixStats/src/weightedMean.c0000644000175100001440000000332113073627232016153 0ustar hornikusers/*************************************************************************** Public methods: SEXP weightedMean(SEXP x, SEXP w, SEXP idxs, SEXP naRm, SEXP refine) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include #include "weightedMean_lowlevel.h" SEXP weightedMean(SEXP x, SEXP w, SEXP idxs, SEXP naRm, SEXP refine) { SEXP ans; int narm, refine2; double avg = NA_REAL; R_xlen_t nx, nw; /* Argument 'x': */ assertArgVector(x, (R_TYPE_INT | R_TYPE_REAL), "x"); nx = xlength(x); /* Argument 'x': */ assertArgVector(w, (R_TYPE_REAL), "w"); nw = xlength(w); if (nx != nw) { error("Argument 'x' and 'w' are of different lengths: %d != %d", nx, nw); } /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'refine': */ refine2 = asLogicalNoNA(refine, "refine"); /* Argument 'idxs': */ R_xlen_t nidxs; int idxsType; void *cidxs = validateIndices(idxs, nx, 1, &nidxs, &idxsType); /* Double matrices are more common to use. */ if (isReal(x)) { avg = weightedMean_dbl[idxsType](REAL(x), nx, REAL(w), cidxs, nidxs, narm, refine2); } else if (isInteger(x)) { avg = weightedMean_int[idxsType](INTEGER(x), nx, REAL(w), cidxs, nidxs, narm, refine2); } /* Return results */ PROTECT(ans = allocVector(REALSXP, 1)); REAL(ans)[0] = avg; UNPROTECT(1); return(ans); } // weightedMean() /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-12-08 [HB] o Created. **************************************************************************/ matrixStats/src/productExpSumLog_lowlevel.h0000644000175100001440000000200413073627232020751 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): double productExpSumLog_int_aidxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int hasna) double productExpSumLog_int_iidxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int hasna) double productExpSumLog_int_didxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int hasna) double productExpSumLog_dbl_aidxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int hasna) double productExpSumLog_dbl_iidxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int hasna) double productExpSumLog_dbl_didxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int hasna) */ #define METHOD productExpSumLog #define RETURN_TYPE double #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int hasna #define X_TYPE 'i' #include "000.templates-gen-vector.h" #define X_TYPE 'r' #include "000.templates-gen-vector.h" matrixStats/src/x_OP_y.c0000644000175100001440000001376013073627232014757 0ustar hornikusers#include #include "000.types.h" #include "x_OP_y_lowlevel.h" SEXP x_OP_y(SEXP x, SEXP y, SEXP dim, SEXP operator, SEXP xrows, SEXP xcols, SEXP yidxs, SEXP commute, SEXP naRm, SEXP hasNA, SEXP byRow) { SEXP ans = NILSXP; int narm, hasna, byrow, commute2; int op; R_xlen_t nrow, ncol, ny; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'y': */ assertArgVector(y, (R_TYPE_INT | R_TYPE_REAL), "y"); ny = xlength(y); /* Argument 'byRow': */ byrow = asLogicalNoNA(byRow, "byrow"); /* Argument 'commute2': */ commute2 = asLogicalNoNA(commute, "commute"); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'xrows', 'xcols' and 'yidxs': */ R_xlen_t nxrows, nxcols, nyidxs; int xrowsType, xcolsType, yidxsType; void *cxrows = validateIndices(xrows, nrow, 0, &nxrows, &xrowsType); void *cxcols = validateIndices(xcols, ncol, 0, &nxcols, &xcolsType); void *cyidxs = validateIndices(yidxs, ny, 1, &nyidxs, &yidxsType); /* Argument 'operator': */ op = asInteger(operator); if (op == 1) { /* Addition */ if (isReal(x) || isReal(y)) { PROTECT(ans = allocMatrix(REALSXP, nxrows, nxcols)); if (isReal(x) && isReal(y)) { x_OP_y_Add_dbl_dbl[xrowsType][xcolsType][yidxsType]( REAL(x), nrow, ncol, REAL(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } else if (isReal(x) && isInteger(y)) { x_OP_y_Add_dbl_int[xrowsType][xcolsType][yidxsType]( REAL(x), nrow, ncol, INTEGER(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } else if (isInteger(x) && isReal(y)) { x_OP_y_Add_int_dbl[xrowsType][xcolsType][yidxsType]( INTEGER(x), nrow, ncol, REAL(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } UNPROTECT(1); } else { PROTECT(ans = allocMatrix(INTSXP, nxrows, nxcols)); x_OP_y_Add_int_int[xrowsType][xcolsType][yidxsType]( INTEGER(x), nrow, ncol, INTEGER(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, INTEGER(ans), xlength(ans)); UNPROTECT(1); } } if (op == 2) { /* Subtraction */ if (isReal(x) || isReal(y)) { PROTECT(ans = allocMatrix(REALSXP, nxrows, nxcols)); if (isReal(x) && isReal(y)) { x_OP_y_Sub_dbl_dbl[xrowsType][xcolsType][yidxsType]( REAL(x), nrow, ncol, REAL(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } else if (isReal(x) && isInteger(y)) { x_OP_y_Sub_dbl_int[xrowsType][xcolsType][yidxsType]( REAL(x), nrow, ncol, INTEGER(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } else if (isInteger(x) && isReal(y)) { x_OP_y_Sub_int_dbl[xrowsType][xcolsType][yidxsType]( INTEGER(x), nrow, ncol, REAL(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } UNPROTECT(1); } else { PROTECT(ans = allocMatrix(INTSXP, nxrows, nxcols)); x_OP_y_Sub_int_int[xrowsType][xcolsType][yidxsType]( INTEGER(x), nrow, ncol, INTEGER(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, INTEGER(ans), xlength(ans)); UNPROTECT(1); } } else if (op == 3) { /* Multiplication */ if (isReal(x) || isReal(y)) { PROTECT(ans = allocMatrix(REALSXP, nxrows, nxcols)); if (isReal(x) && isReal(y)) { x_OP_y_Mul_dbl_dbl[xrowsType][xcolsType][yidxsType]( REAL(x), nrow, ncol, REAL(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } else if (isReal(x) && isInteger(y)) { x_OP_y_Mul_dbl_int[xrowsType][xcolsType][yidxsType]( REAL(x), nrow, ncol, INTEGER(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } else if (isInteger(x) && isReal(y)) { x_OP_y_Mul_int_dbl[xrowsType][xcolsType][yidxsType]( INTEGER(x), nrow, ncol, REAL(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } UNPROTECT(1); } else { PROTECT(ans = allocMatrix(INTSXP, nxrows, nxcols)); x_OP_y_Mul_int_int[xrowsType][xcolsType][yidxsType]( INTEGER(x), nrow, ncol, INTEGER(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, INTEGER(ans), xlength(ans)); UNPROTECT(1); } } else if (op == 4) { /* Division */ PROTECT(ans = allocMatrix(REALSXP, nxrows, nxcols)); if (isReal(x) && isReal(y)) { x_OP_y_Div_dbl_dbl[xrowsType][xcolsType][yidxsType]( REAL(x), nrow, ncol, REAL(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } else if (isReal(x) && isInteger(y)) { x_OP_y_Div_dbl_int[xrowsType][xcolsType][yidxsType]( REAL(x), nrow, ncol, INTEGER(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } else if (isInteger(x) && isReal(y)) { x_OP_y_Div_int_dbl[xrowsType][xcolsType][yidxsType]( INTEGER(x), nrow, ncol, REAL(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } else if (isInteger(x) && isInteger(y)) { x_OP_y_Div_int_int[xrowsType][xcolsType][yidxsType]( INTEGER(x), nrow, ncol, INTEGER(y), ny, cxrows, nxrows, cxcols, nxcols, cyidxs, nyidxs, byrow, commute2, narm, hasna, REAL(ans), xlength(ans)); } UNPROTECT(1); } return(ans); } /* x_OP_y() */ matrixStats/src/rowCumprods_lowlevel_template.h0000644000175100001440000001030013073627232021702 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowCumprods_[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, ANS_C_TYPE *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD: the name of the resulting function - X_TYPE: 'i' or 'r' Authors: Henrik Bengtsson. Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj, kk, kk_prev, idx; R_xlen_t colBegin; X_C_TYPE xvalue; LDOUBLE value; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif #if ANS_TYPE == 'i' double R_INT_MIN_d = (double)R_INT_MIN, R_INT_MAX_d = (double)R_INT_MAX; /* OK, i.e. no integer overflow yet? */ int warn = 0, ok, *oks = NULL; #endif if (ncols == 0 || nrows == 0) return; if (byrow) { #if ANS_TYPE == 'i' oks = (int *) R_alloc(nrows, sizeof(int)); #endif colBegin = R_INDEX_OP(COL_INDEX(ccols,0), *, nrow); for (kk=0; kk < nrows; kk++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,kk)); xvalue = R_INDEX_GET(x, idx, X_NA); ans[kk] = (ANS_C_TYPE) xvalue; #if ANS_TYPE == 'i' oks[kk] = !X_ISNA(xvalue); #endif } kk_prev = 0; for (jj=1; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); #if ANS_TYPE == 'i' if (oks[ii]) { if (X_ISNA(xvalue)) { oks[ii] = 0; ans[kk] = ANS_NA; } else { value = (LDOUBLE) ans[kk_prev] * (LDOUBLE) xvalue; /* Integer overflow? */ if (value < R_INT_MIN_d || value > R_INT_MAX_d) { oks[ii] = 0; warn = 1; ans[kk] = ANS_NA; } else { ans[kk] = (ANS_C_TYPE) value; } } } else { ans[kk] = ANS_NA; } #else ans[kk] = (ANS_C_TYPE) ((LDOUBLE) ans[kk_prev] * (LDOUBLE) xvalue); #endif kk++; kk_prev++; R_CHECK_USER_INTERRUPT(kk); } /* for (ii ...) */ } /* for (jj ...) */ } else { kk = 0; for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); value = 1; #if ANS_TYPE == 'i' ok = 1; #endif for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); #if ANS_TYPE == 'i' if (ok) { if (X_ISNA(xvalue)) { ok = 0; ans[kk] = ANS_NA; } else { value *= (LDOUBLE) xvalue; /* Integer overflow? */ if (value < R_INT_MIN_d || value > R_INT_MAX_d) { ok = 0; warn = 1; ans[kk] = ANS_NA; } else { ans[kk] = (ANS_C_TYPE) value; } } } else { ans[kk] = ANS_NA; } #else value *= xvalue; ans[kk] = (ANS_C_TYPE) value; #endif kk++; R_CHECK_USER_INTERRUPT(kk); } /* for (ii ...) */ } /* for (jj ...) */ } /* if (byrow) */ #if ANS_TYPE == 'i' /* Warn on integer overflow? */ if (warn) { warning("Integer overflow. Detected one or more elements whose absolute values were out of the range [%d,%d] that can be used to for integers. Such values are set to NA_integer_.", R_INT_MIN, R_INT_MAX); } #endif } /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-26 [HB] o Created from rowVars_TYPE-template.h. **************************************************************************/ matrixStats/src/rowOrderStats.c0000644000175100001440000000552513073627232016404 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowOrderStats(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP which) Authors: Henrik Bengtsson. Adopted from rowQ() by R. Gentleman. To do: Add support for missing values. Copyright Henrik Bengtsson, 2007-2014 **************************************************************************/ #include #include "000.types.h" #include "rowOrderStats_lowlevel.h" SEXP rowOrderStats(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP which) { SEXP ans = NILSXP; R_xlen_t nrow, ncol, qq; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'which': */ if (length(which) != 1) error("Argument 'which' must be a single number."); if (!isNumeric(which)) error("Argument 'which' must be a numeric number."); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; int rowsHasna, colsHasna; void *crows = validateIndicesCheckNA(rows, nrow, 0, &nrows, &rowsType, &rowsHasna); void *ccols = validateIndicesCheckNA(cols, ncol, 0, &ncols, &colsType, &colsHasna); // Check missing rows if (rowsHasna && ncols > 0) { error("Argument 'rows' must not contain missing value"); } // Check missing cols if (colsHasna && nrows > 0) { error("Argument 'cols' must not contain missing value"); } /* Subtract one here, since rPsort does zero based addressing */ qq = asInteger(which) - 1; /* Assert that 'qq' is a valid index */ if (qq < 0 || qq >= ncols) { error("Argument 'which' is out of range."); } /* Double matrices are more common to use. */ if (isReal(x)) { PROTECT(ans = allocVector(REALSXP, nrows)); rowOrderStats_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, qq, REAL(ans)); UNPROTECT(1); } else if (isInteger(x)) { PROTECT(ans = allocVector(INTSXP, nrows)); rowOrderStats_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, qq, INTEGER(ans)); UNPROTECT(1); } return(ans); } // rowOrderStats() /*************************************************************************** HISTORY: 2015-07-11 [DJ] o Supported subsetted computation. 2009-02-04 [HB] o BUG FIX: For some errors in rowOrderStats(), the stack would not become UNPROTECTED before calling error. 2008-03-25 [HB] o Renamed from 'rowQuantiles' to 'rowOrderStats'. 2007-08-10 [HB] o Removed arguments for NAs since rowOrderStats() still don't support it. 2005-11-24 [HB] o Cool, it works and compiles nicely. o Preallocate colOffset to speed up things even more. o Added more comments and error checking. o Adopted from rowQ() in Biobase of Bioconductor. **************************************************************************/ matrixStats/src/weightedMedian_lowlevel.h0000644000175100001440000000231413073627232020407 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" #include /* Native API (dynamically generated via macros): double weightedMedian_int_aidxs(int *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int interpolate, int ties) double weightedMedian_int_iidxs(int *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int interpolate, int ties) double weightedMedian_int_didxs(int *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int interpolate, int ties) double weightedMedian_dbl_aidxs(double *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int interpolate, int ties) double weightedMedian_dbl_iidxs(double *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int interpolate, int ties) double weightedMedian_dbl_didxs(double *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int interpolate, int ties) */ #define METHOD weightedMedian #define RETURN_TYPE double #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int interpolate, int ties #define X_TYPE 'i' #include "000.templates-gen-vector.h" #define X_TYPE 'r' #include "000.templates-gen-vector.h" matrixStats/src/binMeans.c0000644000175100001440000000535313073627232015315 0ustar hornikusers/*************************************************************************** Public methods: binMeans(SEXP y, SEXP x, SEXP bx, SEXP retCount, SEXP right) Copyright Henrik Bengtsson, 2012-2013 **************************************************************************/ #include #include "000.types.h" #include #include "binMeans_lowlevel.h" SEXP binMeans(SEXP y, SEXP x, SEXP bx, SEXP retCount, SEXP right) { SEXP ans = NILSXP, count = NILSXP; R_xlen_t nx, ny, nbins; int closedRight, retcount; int *count_ptr = NULL; /* Argument 'y': */ assertArgVector(y, (R_TYPE_REAL), "y"); ny = xlength(y); /* Argument 'x': */ assertArgVector(x, (R_TYPE_REAL), "x"); nx = xlength(x); if (nx != ny) { error("Argument 'y' and 'x' are of different lengths: %d != %d", ny, nx); } /* Argument 'bx': */ assertArgVector(bx, (R_TYPE_REAL), "bx"); nbins = xlength(bx)-1; if (nbins <= 0) { error("Argument 'bx' must specify at least two bin boundaries (= one bin): %d", xlength(bx)); } /* Argument 'right': */ closedRight = asLogicalNoNA(right, "right"); /* Argument 'retCount': */ retcount = asLogicalNoNA(retCount, "retCount"); PROTECT(ans = allocVector(REALSXP, nbins)); if (retcount) { PROTECT(count = allocVector(INTSXP, nbins)); count_ptr = INTEGER(count); } if (closedRight) { binMeans_R(REAL(y), ny, REAL(x), nx, REAL(bx), nbins, REAL(ans), count_ptr); } else { binMeans_L(REAL(y), ny, REAL(x), nx, REAL(bx), nbins, REAL(ans), count_ptr); } if (retcount) { setAttrib(ans, install("count"), count); UNPROTECT(1); // 'count' } UNPROTECT(1); // 'ans' return ans; return(ans); } // binMeans() /*************************************************************************** HISTORY: 2015-05-30 [HB] o Added protected against 'bx' too short. 2014-10-06 [HB] o CLEANUP: All argument validation is now done by the high-level C API. 2014-06-02 [HB] o CLEANUP: Removed unused variable in binMeans(). 2013-10-08 [HB] o Now binCounts() calls binCounts_(). 2013-05-10 [HB] o SPEEDUP: binMeans() no longer tests in every iteration (=for every data point) whether the last bin has been reached or not. 2012-10-10 [HB] o BUG FIX: binMeans() would return random/garbage means/counts for bins that were beyond the last data point. o BUG FIX: In some cases binMeans() could try to go past the last bin. 2012-10-03 [HB] o Created binMeans(), which was adopted from from code proposed by Martin Morgan (Fred Hutchinson Cancer Research Center, Seattle) as a reply to HB's R-devel thread 'Fastest non-overlapping binning mean function out there?' on Oct 3, 2012. **************************************************************************/ matrixStats/src/mean2.c0000644000175100001440000000266013073627232014561 0ustar hornikusers/*************************************************************************** Public methods: SEXP mean2(SEXP x, SEXP idxs, SEXP naRm, SEXP refine) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "mean2_lowlevel.h" SEXP mean2(SEXP x, SEXP idxs, SEXP naRm, SEXP refine) { SEXP ans; R_xlen_t nx; int narm, refine2; double avg = NA_REAL; /* Argument 'x': */ assertArgVector(x, (R_TYPE_INT | R_TYPE_REAL), "x"); nx = xlength(x); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'refine': */ refine2 = asLogicalNoNA(refine, "refine"); /* Argument 'idxs': */ R_xlen_t nidxs; int idxsType; void *cidxs = validateIndices(idxs, nx, 1, &nidxs, &idxsType); /* Double matrices are more common to use. */ if (isReal(x)) { avg = mean2_dbl[idxsType](REAL(x), nx, cidxs, nidxs, narm, refine2); } else if (isInteger(x)) { avg = mean2_int[idxsType](INTEGER(x), nx, cidxs, nidxs, narm, refine2); } /* Return results */ PROTECT(ans = allocVector(REALSXP, 1)); REAL(ans)[0] = avg; UNPROTECT(1); return(ans); } // mean2() /*************************************************************************** HISTORY: 2015-07-04 [DJ] o Supported subsetted computation. 2014-11-02 [HB] o Created. **************************************************************************/ matrixStats/src/rowCummaxs.c0000644000175100001440000000325413073627232015724 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowCummaxs(SEXP x, ...) SEXP colCummaxs(SEXP x, ...) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "rowCummaxs_lowlevel.h" SEXP rowCummaxs(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP byRow) { int byrow; SEXP ans = NILSXP; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); /* Double matrices are more common to use. */ if (isReal(x)) { PROTECT(ans = allocMatrix(REALSXP, nrows, ncols)); rowCummaxs_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, REAL(ans)); UNPROTECT(1); } else if (isInteger(x)) { PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); rowCummaxs_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, INTEGER(ans)); UNPROTECT(1); } return(ans); } /* rowCummaxs() */ #undef COMP /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-26 [HB] o Created from rowVars.c. **************************************************************************/ matrixStats/src/rowCumMinMaxs_lowlevel_template.h0000644000175100001440000000732713073627232022146 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowCummins_[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, ANS_C_TYPE *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD: the name of the resulting function - X_TYPE: 'i' or 'r' Authors: Henrik Bengtsson. Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) */ #include "000.templates-types.h" #if COMP == '<' #define OP < #elif COMP == '>' #define OP > #endif RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj, kk, kk_prev, idx; R_xlen_t colBegin; ANS_C_TYPE value; int ok; int *oks = NULL; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif if (ncols == 0 || nrows == 0) return; if (byrow) { oks = (int *) R_alloc(nrows, sizeof(int)); colBegin = R_INDEX_OP(COL_INDEX(ccols,0), *, nrow); for (kk=0; kk < nrows; kk++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,kk)); value = (ANS_C_TYPE) R_INDEX_GET(x, idx, X_NA); if (ANS_ISNAN(value)) { oks[kk] = 0; value = ANS_NA; ans[kk] = ANS_NA; } else { oks[kk] = 1; ans[kk] = value; } } kk_prev = 0; for (jj=1; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); value = (ANS_C_TYPE) R_INDEX_GET(x, idx, X_NA); if (oks[ii]) { if (ANS_ISNAN(value)) { oks[ii] = 0; ans[kk] = ANS_NA; } else { if (value OP ans[kk_prev]) { ans[kk] = value; } else { ans[kk] = (ANS_C_TYPE) ans[kk_prev]; } } } else { ans[kk] = ANS_NA; } kk++; kk_prev++; R_CHECK_USER_INTERRUPT(kk); } /* for (ii ...) */ } /* for (jj ...) */ } else { kk = 0; for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,0)); value = (ANS_C_TYPE) R_INDEX_GET(x, idx, X_NA); if (ANS_ISNAN(value)) { ok = 0; value = ANS_NA; ans[kk] = ANS_NA; } else { ok = 1; ans[kk] = value; } kk_prev = kk; kk++; for (ii=1; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); value = (ANS_C_TYPE) R_INDEX_GET(x, idx, X_NA); if (ok) { if (ANS_ISNAN(value)) { ok = 0; value = ANS_NA; ans[kk] = ANS_NA; } else { if (value OP ans[kk_prev]) { ans[kk] = value; } else { ans[kk] = (ANS_C_TYPE) ans[kk_prev]; } } kk++; kk_prev++; } else { ans[kk] = ANS_NA; kk++; } R_CHECK_USER_INTERRUPT(kk); } /* for (ii ...) */ } /* for (jj ...) */ } /* if (byrow) */ } #undef OP /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-26 [HB] o Created from rowVars_TYPE-template.h. **************************************************************************/ matrixStats/src/rowMads_lowlevel_template.h0000644000175100001440000001635113073627232021006 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowMads_(ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, double scale, int narm, int hasna, int byrow, double *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD: the name of the resulting function - X_TYPE: 'i' or 'r' Authors: Adopted from rowQuantiles.c by R. Gentleman. Template by Henrik Bengtsson. Copyright: Henrik Bengtsson, 2007-2013 ***********************************************************************/ #include #include #include "000.types.h" #include /* abs() and fabs() */ /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { int isOdd; R_xlen_t ii, jj, kk, qq, idx; R_xlen_t *colOffset; X_C_TYPE *values, value, mu; double *values_d, value_d, mu_d; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif /* R allocate memory for the 'values'. This will be taken care of by the R garbage collector later on. */ values = (X_C_TYPE *) R_alloc(ncols, sizeof(X_C_TYPE)); values_d = (double *) R_alloc(ncols, sizeof(double)); /* If there are no missing values, don't try to remove them. */ if (hasna == FALSE) narm = FALSE; /* When narm == FALSE, isOdd and qq are the same for all rows */ if (narm == FALSE) { isOdd = (ncols % 2 == 1); qq = (R_xlen_t)(ncols/2) - 1; } else { isOdd = FALSE; qq = 0; } value = 0; /* Pre-calculate the column offsets */ colOffset = (R_xlen_t *) R_alloc(ncols, sizeof(R_xlen_t)); // HJ begin if (byrow) { for (jj=0; jj < ncols; jj++) colOffset[jj] = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); } else { for (jj=0; jj < ncols; jj++) colOffset[jj] = COL_INDEX(ccols,jj); } // HJ end hasna = TRUE; if (hasna == TRUE) { for (ii=0; ii < nrows; ii++) { R_xlen_t rowIdx = byrow ? ROW_INDEX(crows,ii) : R_INDEX_OP(ROW_INDEX(crows,ii), *, ncol); //HJ kk = 0; /* The index of the last non-NA value detected */ for (jj=0; jj < ncols; jj++) { idx = R_INDEX_OP(rowIdx, +, colOffset[jj]); value = R_INDEX_GET(x, idx, X_NA); //HJ if (X_ISNAN(value)) { if (narm == FALSE) { kk = -1; break; } } else { values[kk] = value; kk = kk + 1; } } /* for (jj ...) */ /* Note that 'values' will never contain NA/NaNs */ if (kk == 0) { ans[ii] = NA_REAL; } else if (kk == 1) { ans[ii] = 0; } else if (kk == -1) { ans[ii] = R_NaReal; } else { /* When narm == TRUE, isOdd and qq may change with row */ if (narm == TRUE) { isOdd = (kk % 2 == 1); qq = (R_xlen_t)(kk/2) - 1; } /* Permute x[0:kk-1] so that x[qq] is in the correct place with smaller values to the left, ... */ X_PSORT(values, kk, qq+1); value = values[qq+1]; /* Calculate mu and sigma */ if (isOdd == TRUE) { /* Since there are an odd number of values, then we also know that 'mu' is one of the values in 'x', which in turn mean we don't have to coerce integers to doubles, if 'x' is an integer. Simple benchmarking shows that it significantly faster to avoid coercion. */ mu = value; /* (a) Subtract mu and absolute value, i.e. x <- |x-mu| */ for (jj=0; jj < kk; jj++) { value = (values[jj] - mu); values[jj] = X_ABS(value); } /* (b) Calculate median of |x-mu| */ /* Permute x[0:kk-1] so that x[qq] is in the correct place with smaller values to the left, ... */ X_PSORT(values, kk, qq+1); value = values[qq+1]; ans[ii] = scale * (double)value; } else { /* Here we have to coerce to doubles since 'mu' is an average. */ /* Permute x[0:qq-2] so that x[qq-1] is in the correct place with smaller values to the left, ... */ X_PSORT(values, qq+1, qq); #if X_TYPE == 'i' /* If the difference between two integers is an even number, then their means is also an integer, and then we can avoid coercion to double also here. This should happen roughly half the time we end up here which is worth optimizing for. Simple benchmarking show a significant difference in speed, particular for the column-based version. */ if ((values[qq] - value) % 2 == 0) { /* No need to coerce */ mu = (values[qq] + value)/2; /* (a) Subtract mu and absolute value, i.e. x <- |x-mu| */ for (jj=0; jj < kk; jj++) { value = (values[jj] - mu); values[jj] = X_ABS(value); } /* (b) Calculate median of |x-mu| */ /* Permute x[0:kk-1] so that x[qq] is in the correct place with smaller values to the left, ... */ X_PSORT(values, kk, qq+1); X_PSORT(values, qq+1, qq); ans[ii] = scale * ((double)values[qq] + (double)values[qq+1])/2; /* Done, continue to next vector */ continue; } #endif mu_d = ((double)values[qq] + (double)value)/2; /* (a) Subtract mu and square, i.e. x <- (x-mu)^2 */ for (jj=0; jj < kk; jj++) { value_d = ((double)values[jj] - mu_d); values_d[jj] = fabs(value_d); } /* (b) Calculate median */ /* Permute x[0:kk-1] so that x[qq-1] and x[qq] are in the correct places with smaller values to the left, ... */ rPsort(values_d, kk, qq+1); rPsort(values_d, qq+1, qq); ans[ii] = scale * (values_d[qq] + values_d[qq+1])/2; } } /* if (kk == 0) */ R_CHECK_USER_INTERRUPT(ii); } /* for (ii ...) */ } else { for (ii=0; ii < nrows; ii++) { R_xlen_t rowIdx = byrow ? ROW_INDEX_NONA(crows,ii) : ROW_INDEX_NONA(crows,ii)*ncol; //HJ for (jj=0; jj < ncols; jj++) values[jj] = x[rowIdx+colOffset[jj]]; //HJ /* Permute x[0:ncols-1] so that x[qq] is in the correct place with smaller values to the left, ... */ X_PSORT(values, ncols, qq+1); value = values[qq+1]; if (isOdd == TRUE) { ans[ii] = (double)value; } else { /* Permute x[0:qq-2] so that x[qq-1] is in the correct place with smaller values to the left, ... */ X_PSORT(values, qq+1, qq); ans[ii] = ((double)values[qq] + value)/2; } R_CHECK_USER_INTERRUPT(ii); } /* for (ii ...) */ } /* if (hasna ...) */ } /*************************************************************************** HISTORY: 2015-06-13 [DJ] o Supported subsetted computation. 2014-11-17 [HB] o Created from rowMedians_TYPE-template.h. **************************************************************************/ matrixStats/src/signTabulate_lowlevel.h0000644000175100001440000000164213073627232020116 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void signTabulate_int_aidxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, double *ans) void signTabulate_int_iidxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, double *ans) void signTabulate_int_didxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, double *ans) void signTabulate_dbl_aidxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, double *ans) void signTabulate_dbl_iidxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, double *ans) void signTabulate_dbl_didxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, double *ans) */ #define METHOD signTabulate #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, double *ans #define X_TYPE 'i' #include "000.templates-gen-vector.h" #define X_TYPE 'r' #include "000.templates-gen-vector.h" matrixStats/src/binCounts_lowlevel.h0000644000175100001440000000066013073627232017437 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" #include /* Native API (dynamically generated via macros): void binCounts_L(double *x, R_xlen_t nx, double *bx, R_xlen_t nbins, int *count) void binCounts_R(double *x, R_xlen_t nx, double *bx, R_xlen_t nbins, int *count) */ #define BIN_BY 'L' #include "binCounts_lowlevel_template.h" #define BIN_BY 'R' #include "binCounts_lowlevel_template.h" matrixStats/src/allocMatrix2.c0000644000175100001440000001062113073627232016114 0ustar hornikusers#include #include "000.types.h" #include /* Checks whether setting bytes of an int/double to all zeroes corresponds to assigning a zero value. Note that the bit representation of int's and double's may not be the same on all architectures. */ int memset_zero_ok_int() { int t = 1; memset(&t, 0, sizeof(t)); return (t == 0); } int memset_zero_ok_double() { double t = 1; memset(&t, 0, sizeof(t)); return (t == 0); } /* For debugging purposes */ /* SEXP memsetZeroable() { SEXP ans; PROTECT(ans = allocVector(LGLSXP, 2)); LOGICAL(ans)[1] = memset_zero_ok_int(); LOGICAL(ans)[2] = memset_zero_ok_double(); UNPROTECT(1); return(ans); } */ void fillWithValue(SEXP ans, SEXP value) { R_xlen_t i, n; SEXPTYPE type; double *ans_ptr_d, value_d; int *ans_ptr_i, value_i; int *ans_ptr_l, value_l; /* Argument 'ans': */ if (!isVectorAtomic(ans)) { error("Argument 'ans' must be a vector."); } n = xlength(ans); /* Argument 'value': */ if (!isVectorAtomic(value) || xlength(value) != 1) { error("Argument 'value' must be a scalar."); } type = TYPEOF(value); switch (type) { case INTSXP: value_i = asInteger(value); ans_ptr_i = INTEGER(ans); if (value_i == 0 && memset_zero_ok_int()) { memset(ans_ptr_i, 0, n*sizeof(value_i)); } else { for (i=0; i < n; i++) ans_ptr_i[i] = value_i; } break; case REALSXP: value_d = asReal(value); ans_ptr_d = REAL(ans); if (value_d == 0 && memset_zero_ok_double()) { memset(ans_ptr_d, 0, n*sizeof(value_d)); } else { for (i=0; i < n; i++) ans_ptr_d[i] = value_d; } break; case LGLSXP: value_l = asLogical(value); ans_ptr_l = LOGICAL(ans); if (value_l == 0 && memset_zero_ok_int()) { memset(ans_ptr_l, 0, n*sizeof(value_l)); } else { for (i=0; i < n; i++) ans_ptr_l[i] = value_l; } break; default: error("Argument 'value' must be either of type integer, numeric or logical."); break; } } /* fillWithValue() */ SEXP allocVector2(SEXP length, SEXP value) { SEXP ans; SEXPTYPE type; R_xlen_t n = 0; /* Argument 'length': */ if (isInteger(length) && xlength(length) == 1) { n = (R_xlen_t)asInteger(length); } else if (isReal(length) && xlength(length) == 1) { n = (R_xlen_t)asReal(length); } else { error("Argument 'length' must be a single numeric."); } if (n < 0) error("Argument 'length' is negative."); /* Argument 'value': */ if (!isVectorAtomic(value) || xlength(value) != 1) { error("Argument 'value' must be a scalar."); } type = TYPEOF(value); PROTECT(ans = allocVector(type, n)); fillWithValue(ans, value); UNPROTECT(1); return(ans); } /* allocVector2() */ SEXP allocMatrix2(SEXP nrow, SEXP ncol, SEXP value) { SEXP ans; SEXPTYPE type; int nc, nr; /* Argument 'nrow' & 'ncol': */ if (!isInteger(nrow) || xlength(nrow) != 1) { error("Argument 'nrow' must be a single integer."); } if (!isInteger(ncol) || xlength(ncol) != 1) { error("Argument 'ncol' must be a single integer."); } nr = asInteger(nrow); nc = asInteger(ncol); if (nr < 0) error("Argument 'nrow' is negative."); if (nr < 0) error("Argument 'ncol' is negative."); /* Argument 'value': */ if (!isVectorAtomic(value) || xlength(value) != 1) { error("Argument 'value' must be a scalar."); } type = TYPEOF(value); PROTECT(ans = allocMatrix(type, nr, nc)); fillWithValue(ans, value); UNPROTECT(1); return(ans); } /* allocMatrix2() */ SEXP allocArray2(SEXP dim, SEXP value) { SEXP ans; SEXPTYPE type; int i, d; double nd = 1.0; R_xlen_t n; /* Argument 'dim': */ if (!isInteger(dim) || xlength(dim) == 0) { error("Argument 'dim' must be an integer vector of at least length one."); } for (i = 0; i < xlength(dim); i++) { d = INTEGER(dim)[i]; nd *= d; #ifndef LONG_VECTOR_SUPPORT if (nd > R_INT_MAX) { error("Argument 'dim' specifies too many elements: %.g > %d", nd, R_INT_MAX); } #endif } n = (R_xlen_t)nd; /* Argument 'value': */ if (!isVectorAtomic(value) || xlength(value) != 1) { error("Argument 'value' must be a scalar."); } type = TYPEOF(value); PROTECT(dim = duplicate(dim)); PROTECT(ans = allocVector(type, n)); fillWithValue(ans, value); setAttrib(ans, R_DimSymbol, dim); UNPROTECT(2); return(ans); } /* allocArray2() */ matrixStats/src/rowDiffs.c0000644000175100001440000000446613073627232015350 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowDiffs(SEXP x, ...) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "rowDiffs_lowlevel.h" SEXP rowDiffs(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP lag, SEXP differences, SEXP byRow) { int byrow; SEXP ans = NILSXP; R_xlen_t lagg, diff; R_xlen_t nrow, ncol; R_xlen_t nrow_ans, ncol_ans; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'lag': */ lagg = asInteger(lag); if (lagg < 1) { error("Argument 'lag' must be a positive integer."); } /* Argument 'differences': */ diff = asInteger(differences); if (diff < 1) { error("Argument 'differences' must be a positive integer."); } /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); /* Dimension of result matrix */ if (byrow) { nrow_ans = nrows; ncol_ans = (R_xlen_t)((double)ncols - ((double)diff*(double)lagg)); if (ncol_ans < 0) ncol_ans = 0; } else { nrow_ans = (R_xlen_t)((double)nrows - ((double)diff*(double)lagg)); if (nrow_ans < 0) nrow_ans = 0; ncol_ans = ncols; } if (isReal(x)) { PROTECT(ans = allocMatrix(REALSXP, nrow_ans, ncol_ans)); rowDiffs_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, lagg, diff, REAL(ans), nrow_ans, ncol_ans); UNPROTECT(1); } else if (isInteger(x)) { PROTECT(ans = allocMatrix(INTSXP, nrow_ans, ncol_ans)); rowDiffs_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, lagg, diff, INTEGER(ans), nrow_ans, ncol_ans); UNPROTECT(1); } return(ans); } /* rowDiffs() */ /*************************************************************************** HISTORY: 2015-06-13 [DJ] o Supported subsetted computation. 2014-12-29 [HB] o Created. **************************************************************************/ matrixStats/src/colOrderStats_lowlevel.h0000644000175100001440000000641413073627232020266 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void colOrderStats_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void colOrderStats_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void colOrderStats_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void colOrderStats_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void colOrderStats_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void colOrderStats_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void colOrderStats_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void colOrderStats_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void colOrderStats_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void colOrderStats_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void colOrderStats_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void colOrderStats_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void colOrderStats_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void colOrderStats_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void colOrderStats_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void colOrderStats_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void colOrderStats_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void colOrderStats_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) */ #define METHOD colOrderStats #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, R_xlen_t qq, X_C_TYPE *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" matrixStats/src/rowVars.c0000644000175100001440000000402413073627232015216 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowVars(SEXP x, SEXP naRm, SEXP hasNA) SEXP colVars(SEXP x, SEXP naRm, SEXP hasNA) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "rowVars_lowlevel.h" SEXP rowVars(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow) { int narm, hasna, byrow; SEXP ans; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); if (!byrow) { SWAP(R_xlen_t, nrow, ncol); SWAP(void*, crows, ccols); SWAP(R_xlen_t, nrows, ncols); SWAP(int, rowsType, colsType); } /* R allocate a double vector of length 'nrow' Note that 'nrow' means 'ncol' if byrow=FALSE. */ PROTECT(ans = allocVector(REALSXP, nrows)); /* Double matrices are more common to use. */ if (isReal(x)) { rowVars_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, narm, hasna, byrow, REAL(ans)); } else if (isInteger(x)) { rowVars_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, narm, hasna, byrow, REAL(ans)); } UNPROTECT(1); return(ans); } /* rowVars() */ /*************************************************************************** HISTORY: 2015-06-13 [DJ] o Supported subsetted computation. 2014-11-18 [HB] o Created from rowMads.c. **************************************************************************/ matrixStats/src/sum2.c0000644000175100001440000000446413073627232014451 0ustar hornikusers/*************************************************************************** Public methods: SEXP sum2(SEXP x, SEXP idxs, SEXP naRm, SEXP mode) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include #include "000.types.h" #include "sum2_lowlevel.h" SEXP sum2(SEXP x, SEXP idxs, SEXP naRm, SEXP mode) { SEXP ans = NILSXP; R_xlen_t nx; int narm, mode2; double sum; /* Argument 'x': */ assertArgVector(x, (R_TYPE_INT | R_TYPE_REAL), "x"); nx = xlength(x); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'mode': */ if (!isInteger(mode)) { error("Argument 'mode' must be a single integer."); } mode2 = asInteger(mode); /* Argument 'idxs': */ R_xlen_t nidxs; int idxsType; void *cidxs = validateIndices(idxs, nx, 1, &nidxs, &idxsType); /* Dispatch to low-level C function */ if (isReal(x)) { sum = sum2_dbl[idxsType](REAL(x), nx, cidxs, nidxs, narm, mode2); } else if (isInteger(x)) { sum = sum2_int[idxsType](INTEGER(x), nx, cidxs, nidxs, narm, mode2); } else { error("Argument 'x' must be numeric."); } /* Return results */ switch (mode2) { case 1: /* integer */ PROTECT(ans = allocVector(INTSXP, 1)); if (ISNAN(sum)) { INTEGER(ans)[0] = NA_INTEGER; } else if (sum > R_INT_MAX || sum < R_INT_MIN) { Rf_warning("Integer overflow. Use sum2(..., mode=\"numeric\") to avoid this."); INTEGER(ans)[0] = NA_INTEGER; } else { INTEGER(ans)[0] = (int)sum; } UNPROTECT(1); break; case 2: /* numeric */ PROTECT(ans = allocVector(REALSXP, 1)); if (sum > DOUBLE_XMAX) { REAL(ans)[0] = R_PosInf; } else if (sum < -DOUBLE_XMAX) { REAL(ans)[0] = R_NegInf; } else { REAL(ans)[0] = sum; } UNPROTECT(1); break; default: /* To please compiler */ ans = NILSXP; break; } return(ans); } // sum2() /*************************************************************************** HISTORY: 2015-07-11 [DJ] o Supported subsetted computation. 2014-11-06 [HB] o Moved validation of arguments and construction of return object to this function. 2014-11-02 [HB] o Created. **************************************************************************/ matrixStats/src/rowSums2_lowlevel_template.h0000644000175100001440000000370013073627232021125 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowSums2_(ARGUMENTS_LIST) Copyright: Henrik Bengtsson, 2017 ***********************************************************************/ #include #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj, idx; R_xlen_t *colOffset; X_C_TYPE value; LDOUBLE sum; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif /* If there are no missing values, don't try to remove them. */ if (hasna == FALSE) narm = FALSE; /* Pre-calculate the column offsets */ colOffset = (R_xlen_t *) R_alloc(ncols, sizeof(R_xlen_t)); if (byrow) { for (jj=0; jj < ncols; jj++) colOffset[jj] = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); } else { for (jj=0; jj < ncols; jj++) colOffset[jj] = COL_INDEX(ccols,jj); } for (ii=0; ii < nrows; ii++) { R_xlen_t rowIdx = byrow ? ROW_INDEX(crows,ii) : R_INDEX_OP(ROW_INDEX(crows,ii), *, ncol); sum = 0.0; for (jj=0; jj < ncols; jj++) { idx = R_INDEX_OP(rowIdx, +, colOffset[jj]); value = R_INDEX_GET(x, idx, X_NA); #if X_TYPE == 'i' if (!X_ISNAN(value)) { sum += (LDOUBLE)value; } else if (!narm) { sum = R_NaReal; break; } #elif X_TYPE == 'r' if (!narm) { sum += (LDOUBLE)value; if (jj % 1048576 == 0 && ISNA(sum)) break; } else if (!ISNAN(value)) { sum += (LDOUBLE)value; } #endif } /* for (jj ...) */ if (sum > DOUBLE_XMAX) { ans[ii] = R_PosInf; } else if (sum < -DOUBLE_XMAX) { ans[ii] = R_NegInf; } else { ans[ii] = (double)sum; } R_CHECK_USER_INTERRUPT(ii); } /* for (ii ...) */ } matrixStats/src/psortKM.c0000644000175100001440000000534213073627232015156 0ustar hornikusers/*************************************************************************** Public methods: SEXP psortKM(SEXP x, SEXP k, SEXP nk) Arguments: x: numeric vector k: integer scalar in [1,length(x)] m: integer scalar in [1,k] and not too large if k is large. Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2012 **************************************************************************/ #include #include #include "000.types.h" #include "000.utils.h" void psortKM_C(double *x, R_xlen_t nx, R_xlen_t k, R_xlen_t m, double *ans) { R_xlen_t ii, ll; double *xx; /* R allocate memory for the 'xx'. This will be taken care of by the R garbage collector later on. */ xx = (double *) R_alloc(nx, sizeof(double)); /* Create a local copy 'xx' of 'x'. */ for (ii=0; ii < nx; ii++) { xx[ii] = x[ii]; } /* Permute xx[0:partial] so that xx[partial+1] is in the correct place with smaller values to the left, ... Example: psortKM(x, k=50, m=2) with length(x) = 1000 rPsort(xx, 1000, 50); We know x[50] and that x[1:49] <= x[50] rPsort(xx, 50, 49); x[49] and that x[1:48] <= x[49] rPsort(xx, 49, 48); x[48] and that x[1:47] <= x[48] */ ll = nx; for (ii=0; ii < m; ii++) { rPsort(xx, ll, k-1-ii); ll = (k-1)-ii; } for (ii=0; ii < m; ii++) { ans[ii] = xx[(k-m)+ii]; } } /* psortKM_C() */ SEXP psortKM(SEXP x, SEXP k, SEXP m) { SEXP ans; R_xlen_t nx, kk, mm; /* Argument 'x': */ assertArgVector(x, (R_TYPE_REAL), "x"); nx = xlength(x); if (nx == 0) { error("Argument 'x' must not be empty."); } /* Argument 'k': */ if (!isInteger(k)) { error("Argument 'k' must be an integer."); } if (length(k) != 1) { error("Argument 'k' must be a single integer."); } kk = asInteger(k); if (kk <= 0) { error("Argument 'k' must be a positive integer."); } if (kk > nx) { error("Argument 'k' must not be greater than number of elements in 'x'."); } /* Argument 'm': */ if (!isInteger(m)) { error("Argument 'm' must be an integer."); } if (length(m) != 1) { error("Argument 'm' must be a single integer."); } mm = asInteger(m); if (mm <= 0) { error("Argument 'm' must be a positive integer."); } else if (mm > kk) { error("Argument 'm' must not be greater than argument 'k'."); } /* R allocate a double vector of length 'partial' */ PROTECT(ans = allocVector(REALSXP, mm)); psortKM_C(REAL(x), nx, kk, mm, REAL(ans)); UNPROTECT(1); return(ans); } /* psortKM() */ /*************************************************************************** HISTORY: 2012-09-10 [HB] o Added psortKM(). o Created. **************************************************************************/ matrixStats/src/000.templates-types_undef.h0000644000175100001440000000013313073627232020374 0ustar hornikusers#undef METHOD_NAME #undef X_TYPE #undef Y_TYPE #undef ANS_TYPE #undef MARGIN #undef OP matrixStats/src/validateIndices.c0000644000175100001440000001645313073627232016654 0ustar hornikusers/*************************************************************************** Public methods: SEXP validate(SEXP idxs, SEXP maxIdx, SEXP allowOutOfBound) **************************************************************************/ #include #include "validateIndices_lowlevel.h" /** idxs must not be NULL, which should be checked before calling this function. **/ void* validateIndices_lgl(int *idxs, R_xlen_t nidxs, R_xlen_t maxIdx, int allowOutOfBound, R_xlen_t *ansNidxs, int *subsettedType, int *hasna) { R_xlen_t ii, jj, kk; R_xlen_t count1 = 0, count2 = 0; // set default as no NA. *hasna = FALSE; // set default type as SUBSETTED_INTEGER *subsettedType = SUBSETTED_INTEGER; if (nidxs == 0) { *ansNidxs = 0; return NULL; } if (nidxs > maxIdx) { if (!allowOutOfBound) { error("logical subscript too long"); } *hasna = TRUE; // out-of-bound index is NA // count how many idx items for (ii = 0; ii < maxIdx; ++ ii) { if (idxs[ii]) { // TRUE or NA ++ count1; if (ii + 1 > R_INT_MAX) *subsettedType = SUBSETTED_REAL; } } for (; ii < nidxs; ++ ii) { if (idxs[ii]) { // TRUE or NA ++ count2; } } *ansNidxs = count1 + count2; if (*subsettedType == SUBSETTED_INTEGER) { int *ans = (int*) R_alloc(*ansNidxs, sizeof(int)); FILL_VALIDATED_ANS(maxIdx, idxs[ii], idxs[ii] == NA_LOGICAL ? NA_INTEGER : ii + 1); for (ii = count1; ii < *ansNidxs; ++ ii) { ans[ii] = NA_INTEGER; } return ans; } // *subsettedType == SUBSETTED_REAL double *ans = (double*) R_alloc(*ansNidxs, sizeof(double)); FILL_VALIDATED_ANS(maxIdx, idxs[ii], idxs[ii] == NA_LOGICAL ? NA_REAL : ii + 1); for (ii = count1; ii < *ansNidxs; ++ ii) { ans[ii] = NA_REAL; } return ans; } // nidxs <= maxIdx R_xlen_t naCount = 0; R_xlen_t lastIndex = 0; R_xlen_t lastPartNum = maxIdx % nidxs; for (ii = 0; ii < lastPartNum; ++ ii) { if (idxs[ii]) { // TRUE or NA if (idxs[ii] == NA_LOGICAL) ++ naCount; else lastIndex = ii + 1; ++ count1; } } if (lastIndex > 0 && maxIdx - lastPartNum + lastIndex > R_INT_MAX) *subsettedType = SUBSETTED_REAL; lastIndex = 0; for (; ii < nidxs; ++ ii) { if (idxs[ii]) { // TRUE or NA if (idxs[ii] == NA_LOGICAL) ++ naCount; else lastIndex = ii + 1; ++ count2; } } R_xlen_t count = count1 + count2; if (lastIndex > 0 && maxIdx - lastPartNum - count + lastIndex > R_INT_MAX) *subsettedType = SUBSETTED_REAL; if (naCount == 0 && count == nidxs) { // All True *ansNidxs = maxIdx; *subsettedType = SUBSETTED_ALL; return NULL; } if (naCount) *hasna = TRUE; *ansNidxs = maxIdx / nidxs * count + count1; if (*subsettedType == SUBSETTED_INTEGER) { int *ans = (int*) R_alloc(*ansNidxs, sizeof(int)); FILL_VALIDATED_ANS(nidxs, idxs[ii], idxs[ii] == NA_LOGICAL ? NA_INTEGER : ii + 1); for (ii = count, kk = nidxs; kk+nidxs <= maxIdx; kk += nidxs, ii += count) { for (jj = 0; jj < count; ++ jj) { ans[ii+jj] = ans[jj] == NA_INTEGER ? NA_INTEGER : ans[jj] + kk; } } for (jj = 0; jj < count1; ++ jj) { ans[ii+jj] = ans[jj] == NA_INTEGER ? NA_INTEGER : ans[jj] + kk; } return ans; } // *subsettedType == SUBSETTED_REAL double *ans = (double*) R_alloc(*ansNidxs, sizeof(double)); FILL_VALIDATED_ANS(nidxs, idxs[ii], idxs[ii] == NA_LOGICAL ? NA_REAL : ii + 1); for (ii = count, kk = nidxs; kk+nidxs <= maxIdx; kk += nidxs, ii += count) { for (jj = 0; jj < count; ++ jj) { ans[ii+jj] = ISNAN(ans[jj]) ? NA_REAL : ans[jj] + kk; } } for (jj = 0; jj < count1; ++ jj) { ans[ii+jj] = ISNAN(ans[jj]) ? NA_REAL : ans[jj] + kk; } return ans; } /************************************************************* * The most important function which is widely called. * If `idxs` is NULL, NULL will be returned, which indicates selecting. * the whole to-be-computed vector(matrix). * `maxIdx` is the to-be-computed vector(matrix)'s length (rows/cols). * `allowOutOfBound` indicates whether to allow positve out of bound indexing. * `ansNidxs` is used for returning the new idxs array's length. * `subsettedType` is used for returning the new idxs array's datatype. * `hasna` is TRUE, if NA is included in returned result. ************************************************************/ void *validateIndices(SEXP idxs, R_xlen_t maxIdx, int allowOutOfBound, R_xlen_t *ansNidxs, int *subsettedType) { int hasna; return validateIndicesCheckNA(idxs, maxIdx, allowOutOfBound, ansNidxs, subsettedType, &hasna); } void *validateIndicesCheckNA(SEXP idxs, R_xlen_t maxIdx, int allowOutOfBound, R_xlen_t *ansNidxs, int *subsettedType, int *hasna) { R_xlen_t nidxs = xlength(idxs); int mode = TYPEOF(idxs); // Set no NA as default. *hasna = FALSE; switch (mode) { case INTSXP: return validateIndices_int(INTEGER(idxs), nidxs, maxIdx, allowOutOfBound, ansNidxs, subsettedType, hasna); case REALSXP: return validateIndices_dbl(REAL(idxs), nidxs, maxIdx, allowOutOfBound, ansNidxs, subsettedType, hasna); case LGLSXP: return validateIndices_lgl(LOGICAL(idxs), nidxs, maxIdx, allowOutOfBound, ansNidxs, subsettedType, hasna); case NILSXP: *subsettedType = SUBSETTED_ALL; *ansNidxs = maxIdx; return NULL; default: error("idxs can only be integer, numeric, or logical."); } return NULL; // useless sentence. won't be executed. } /************************************************************* * This function can be called by R. * If `idxs` is NULL, NULL will be returned, which indicates selecting. * the whole to-be-computed vector(matrix). * `maxIdx` is the to-be-computed vector(matrix)'s length (rows/cols). * `allowOutOfBound` indicates whether to allow positve out of bound indexing. ************************************************************/ SEXP validate(SEXP idxs, SEXP maxIdx, SEXP allowOutOfBound) { SEXP ans; R_xlen_t ansNidxs; int subsettedType; R_xlen_t cmaxIdx = asR_xlen_t(maxIdx, 0); R_xlen_t nidxs = xlength(idxs); int callowOutOfBound = asLogicalNoNA(allowOutOfBound, "allowOutOfBound"); void *cidxs; // Set no NA as default. int hasna = FALSE; int mode = TYPEOF(idxs); switch (mode) { case INTSXP: cidxs = validateIndices_int(INTEGER(idxs), nidxs, cmaxIdx, callowOutOfBound, &ansNidxs, &subsettedType, &hasna); break; case REALSXP: cidxs = validateIndices_dbl(REAL(idxs), nidxs, cmaxIdx, callowOutOfBound, &ansNidxs, &subsettedType, &hasna); break; case LGLSXP: cidxs = validateIndices_lgl(LOGICAL(idxs), nidxs, cmaxIdx, callowOutOfBound, &ansNidxs, &subsettedType, &hasna); break; case NILSXP: return R_NilValue; default: error("idxs can only be integer, numeric, or logical."); } if (subsettedType == SUBSETTED_ALL) { return R_NilValue; } if (subsettedType == SUBSETTED_INTEGER) { ans = PROTECT(allocVector(INTSXP, ansNidxs)); if (cidxs && ansNidxs > 0) { memcpy(INTEGER(ans), cidxs, ansNidxs*sizeof(int)); } UNPROTECT(1); return ans; } // else: subsettedType == SUBSETTED_REAL ans = PROTECT(allocVector(REALSXP, ansNidxs)); if (cidxs && ansNidxs > 0) { memcpy(REAL(ans), cidxs, ansNidxs*sizeof(double)); } UNPROTECT(1); return ans; } matrixStats/src/000.utils.h0000644000175100001440000000766013073627232015227 0ustar hornikusers#include #include "000.types.h" #define R_TYPE_LGL 1 /* 0b0001 */ #define R_TYPE_INT 2 /* 0b0010 */ #define R_TYPE_REAL 4 /* 0b0100 */ static R_INLINE void assertArgVector(SEXP x, int type, char *xlabel) { /* Argument 'x': */ if (!isVectorAtomic(x)) { error("Argument '%s' must be a matrix or a vector.", xlabel); } switch (TYPEOF(x)) { case LGLSXP: if (!(type & R_TYPE_LGL)) error("Argument '%s' cannot be logical.", xlabel); break; case INTSXP: if (!(type & R_TYPE_INT)) error("Argument '%s' cannot be integer.", xlabel); break; case REALSXP: if (!(type & R_TYPE_REAL)) error("Argument '%s' cannot be numeric.", xlabel); break; default: error("Argument '%s' must be of type logical, integer or numeric, not '%s'.", xlabel, type2char(TYPEOF(x))); } /* switch */ } /* assertArgVector() */ static R_INLINE void assertArgDim(SEXP dim, double max, char *maxlabel) { double nrow, ncol; /* Argument 'dim': */ if (!isVectorAtomic(dim) || xlength(dim) != 2 || !isInteger(dim)) { error("Argument 'dim' must be an integer vector of length two."); } nrow = (double)INTEGER(dim)[0]; ncol = (double)INTEGER(dim)[1]; if (nrow < 0) { error("Argument 'dim' specifies a negative number of rows (dim[1]): %d", nrow); } else if (ncol < 0) { error("Argument 'dim' specifies a negative number of columns (dim[2]): %d", ncol); } else if (nrow * ncol != max) { error("Argument 'dim' does not match length of argument '%s': %g * %g != %g", maxlabel, nrow, ncol, max); } } /* assertArgDim() */ static R_INLINE void assertArgMatrix(SEXP x, SEXP dim, int type, char *xlabel) { /* Argument 'x': */ if (isMatrix(x)) { } else if (isVectorAtomic(x)) { } else { error("Argument '%s' must be a matrix or a vector.", xlabel); } switch (TYPEOF(x)) { case LGLSXP: if (!(type & R_TYPE_LGL)) error("Argument '%s' cannot be logical.", xlabel); break; case INTSXP: if (!(type & R_TYPE_INT)) error("Argument '%s' cannot be integer.", xlabel); break; case REALSXP: if (!(type & R_TYPE_REAL)) error("Argument '%s' cannot be numeric.", xlabel); break; default: error("Argument '%s' must be of type logical, integer or numeric, not '%s'.", xlabel, type2char(TYPEOF(x))); } /* switch */ /* Argument 'dim': */ assertArgDim(dim, xlength(x), "x"); } /* assertArgMatrix() */ static R_INLINE int asLogicalNoNA(SEXP x, char *xlabel) { int value = 0; if (length(x) != 1) error("Argument '%s' must be a single value.", xlabel); if (isLogical(x)) { value = asLogical(x); } else if (isInteger(x)) { value = asInteger(x); } else { error("Argument '%s' must be a logical.", xlabel); } if (value != TRUE && value != FALSE) error("Argument '%s' must be either TRUE or FALSE.", xlabel); return value; } /* asLogicalNoNA() */ /* Retrieve the 'i'th element of 'x' as R_xlen_t */ static R_INLINE R_xlen_t asR_xlen_t(SEXP x, R_xlen_t i) { int mode = TYPEOF(x); switch (mode) { case INTSXP: return INTEGER(x)[i]; case REALSXP: return REAL(x)[i]; default: error("only integer and numeric are supported, not '%s'.", type2char(TYPEOF(x))); } return 0; } /* asR_xlen_t() */ /* Specified in validateIndices.c */ void *validateIndicesCheckNA(SEXP idxs, R_xlen_t maxIdx, int allowOutOfBound, R_xlen_t *ansNidxs, int *type, int *hasna); void *validateIndices(SEXP idxs, R_xlen_t maxIdx, int allowOutOfBound, R_xlen_t *ansNidxs, int *type); static R_INLINE int int_from_dbl(double x) { if (ISNAN(x)) return NA_INTEGER; if (x > INT_MAX || x <= INT_MIN) return NA_INTEGER; return x; } /* int_from_dbl() */ static R_INLINE double dbl_from_int(int x) { if (x == NA_INTEGER) return NA_REAL; return x; } /* dbl_from_int() */ #define SWAP(type, x, y) { \ type tmp = x; \ x = y; \ y = tmp; \ } matrixStats/src/rowRanksWithTies_lowlevel_template.h0000644000175100001440000001331413073627232022655 0ustar hornikusers/*********************************************************************** TEMPLATE: Ranks_dbl_ties[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, ANS_C_TYPE *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - MARGIN: 'r' (rows) or 'c' (columns). - X_TYPE: 'i' or 'r' - ANS_TYPE: 'i' or 'r' - TIESMETHOD: '0' (min), '1' (max), 'a' (average) Authors: Hector Corrada Bravo [HCB] Peter Langfelder [PL] Henrik Bengtsson [HB] ***********************************************************************/ #include #undef RANK #if TIESMETHOD == '0' /* min */ #define ANS_TYPE 'i' #define RANK(firstTie, aboveTie) firstTie + 1 #elif TIESMETHOD == '1' /* max */ #define ANS_TYPE 'i' #define RANK(firstTie, aboveTie) aboveTie #elif TIESMETHOD == 'a' /* average */ #define ANS_TYPE 'r' #define RANK(firstTie, aboveTie) ((double) (firstTie + aboveTie + 1))/2 #endif /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) ANS_TYPE => (ANS_SXP, ANS_NA, ANS_C_TYPE, ANS_IN_C) */ #include "000.templates-types.h" /* Indexing formula to compute the vector index of element j of vector i. Should take arguments element, vector, nElements, nVectors. */ #undef ANS_INDEX_OF #if MARGIN == 'r' /* rows */ #define ANS_INDEX_OF(element, vector, nRows) \ vector + element*nRows #elif MARGIN == 'c' /* columns */ #define ANS_INDEX_OF(element, vector, nRows) \ element + vector*nRows #else #error "MARGIN can only be 'r' or 'c'" #endif void METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { ANS_C_TYPE rank; X_C_TYPE *values, current, tmp; R_xlen_t *colOffset; R_xlen_t ii, jj, kk, rowIdx; int *I; int lastFinite, firstTie, aboveTie; int nvalues, nVec; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif #if MARGIN == 'r' nvalues = ncols; nVec = nrows; /* Pre-calculate the column offsets */ colOffset = (R_xlen_t *) R_alloc(ncols, sizeof(R_xlen_t)); for (jj=0; jj < ncols; jj++) colOffset[jj] = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); #elif MARGIN == 'c' nvalues = nrows; nVec = ncols; /* Pre-calculate the column offsets */ colOffset = (R_xlen_t *) R_alloc(nrows, sizeof(R_xlen_t)); for (jj=0; jj < nrows; jj++) colOffset[jj] = ROW_INDEX(crows,jj); #endif values = (X_C_TYPE *) R_alloc(nvalues, sizeof(X_C_TYPE)); I = (int *) R_alloc(nvalues, sizeof(int)); for (ii=0; ii < nVec; ii++) { #if MARGIN == 'r' rowIdx = ROW_INDEX(crows,ii); #elif MARGIN == 'c' rowIdx = R_INDEX_OP(COL_INDEX(ccols,ii), *, nrow); #endif lastFinite = nvalues-1; /* Put the NA/NaN elements at the end of the vector and update the index vector appropriately. This may be a bit faster since it only uses one loop over the length of the vector, plus it shortens the sort in case there are missing values. /PL (2012-12-14) */ for (jj = 0; jj <= lastFinite; jj++) { tmp = R_INDEX_GET(x, R_INDEX_OP(rowIdx,+,colOffset[jj]), X_NA); if (X_ISNAN(tmp)) { while (lastFinite > jj && X_ISNAN(R_INDEX_GET(x, R_INDEX_OP(rowIdx,+,colOffset[lastFinite]), X_NA))) { I[lastFinite] = lastFinite; lastFinite--; } I[lastFinite] = jj; I[jj] = lastFinite; values[ jj ] = R_INDEX_GET(x, R_INDEX_OP(rowIdx,+,colOffset[lastFinite]), X_NA); values[ lastFinite ] = tmp; lastFinite--; } else { I[jj] = jj; values[ jj ] = tmp; } } /* for (jj ...) */ // Diagnostic print-outs /* Rprintf("Swapped vector:\n"); for (jj=0; jj < nvalues; jj++) { Rprintf(" %8.4f,", values[jj]); if (((jj+1) % 5==0) || (jj==nvalues-1)) Rprintf("\n"); } Rprintf("Index vector:\n"); for (jj=0; jj 0) X_QSORT_I(values, I, 1, lastFinite + 1); // Calculate the ranks. for (jj=0; jj <= lastFinite;) { firstTie = jj; current = values[jj]; while ((jj <= lastFinite) && (values[jj] == current)) jj++; aboveTie = jj; // Depending on rank method, get maximum, average, or minimum rank rank = RANK(firstTie, aboveTie); for (kk=firstTie; kk < aboveTie; kk++) { ans[ ANS_INDEX_OF(I[kk], ii, nrows) ] = rank; } } // At this point jj = lastFinite + 1, no need to re-initialize again. for (; jj < nvalues; jj++) { ans[ ANS_INDEX_OF(I[jj], ii, nrows) ] = ANS_NA; } // Rprintf("\n"); } } /*************************************************************************** HISTORY: 2015-06-12 [DJ] o Supported subsetted computation. 2014-11-06 [HB] o CLEANUP: Moving away from R data types in low-level C functions. 2013-04-23 [HB] o BUG FIX: Ranks did not work for integers with NAs; now using X_ISNAN(). 2013-01-13 [HB] o Template cleanup. Extened tempate to integer matrices. o Added argument 'tiesMethod' to rowRanks(). 2012-12-14 [PL] o Added internal support for "min", "max" and "average" ties. Using template to generate the various versions of the functions. 2013-01-13 [HCB] o Created. Using "max" ties. **************************************************************************/ matrixStats/src/rowSums2_lowlevel.h0000644000175100001440000000707713073627232017245 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowSums2_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowSums2_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) */ #define METHOD rowSums2 #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int narm, int hasna, int byrow, double *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #undef METHOD matrixStats/src/rowMedians.c0000644000175100001440000000600313073627232015662 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowMedians(SEXP x, ...) Authors: Adopted from rowQuantiles.c by R. Gentleman. Copyright Henrik Bengtsson, 2007 **************************************************************************/ #include #include "000.types.h" #include "rowMedians_lowlevel.h" SEXP rowMedians(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow) { int narm, hasna, byrow; SEXP ans; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); /* Get dimensions of 'x'. */ nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); if (!byrow) { SWAP(R_xlen_t, nrow, ncol); SWAP(void*, crows, ccols); SWAP(R_xlen_t, nrows, ncols); SWAP(int, rowsType, colsType); } /* R allocate a double vector of length 'nrows' Note that 'nrows' means 'ncols' if byrow=FALSE. */ PROTECT(ans = allocVector(REALSXP, nrows)); /* Double matrices are more common to use. */ if (isReal(x)) { rowMedians_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, narm, hasna, byrow, REAL(ans)); } else if (isInteger(x)) { rowMedians_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, narm, hasna, byrow, REAL(ans)); } UNPROTECT(1); return(ans); } /* rowMedians() */ /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2013-01-13 [HB] o Added argument 'byRow' to rowMedians() and dropped colMedians(). o Using internal arguments 'by_row' instead of 'by_column'. 2011-12-11 [HB] o BUG FIX: rowMediansReal(..., na.rm=TRUE) did not handle NaN:s, only NA:s. Note that NaN:s does not exist for integers. 2011-10-12 [HJ] o Added colMedians(). o Now rowMediansInteger/Real() can operate also by columns, cf. argument 'by_column'. 2007-08-14 [HB] o Added checks for user interrupts every 1000 line. o Added argument 'hasNA' to rowMedians(). 2005-12-07 [HB] o BUG FIX: When calculating the median of an even number (non-NA) values, the length of the second sort was one element too short, which made the method to freeze, i.e. rPsort(rowData, qq, qq) is now (...qq+1, qq). 2005-11-24 [HB] o By implementing a special version for integers, there is no need to coerce to double in R, which would take up twice the amount of memory. o rowMedians() now handles NAs too. o Adopted from rowQuantiles.c in Biobase of Bioconductor. **************************************************************************/ matrixStats/src/rowLogSumExp.c0000644000175100001440000000374013073627232016172 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowLogSumExps(SEXP lx, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2013-2014 **************************************************************************/ #include #include "000.types.h" #include "rowLogSumExp_lowlevel.h" SEXP rowLogSumExps(SEXP lx, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow) { SEXP ans; int narm, hasna, byrow; R_xlen_t nrow, ncol; /* Argument 'lx' and 'dim': */ assertArgMatrix(lx, dim, (R_TYPE_REAL), "lx"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); if (byrow) { ans = PROTECT(allocVector(REALSXP, nrows)); rowLogSumExps_double[rowsType](REAL(lx), nrow, ncol, crows, nrows, rowsType, ccols, ncols, colsType, narm, hasna, 1, REAL(ans)); } else { ans = PROTECT(allocVector(REALSXP, ncols)); rowLogSumExps_double[colsType](REAL(lx), nrow, ncol, crows, nrows, rowsType, ccols, ncols, colsType, narm, hasna, 0, REAL(ans)); } UNPROTECT(1); /* ans = PROTECT(...) */ return(ans); } /* rowLogSumExps() */ /*************************************************************************** HISTORY: 2015-06-12 [DJ] o Supported subsetted computation. 2013-05-02 [HB] o BUG FIX: Incorrectly used ISNAN() on an int variable as caught by the 'cc' compiler on Solaris. Reported by Brian Ripley upon CRAN submission. 2013-04-30 [HB] o Created. **************************************************************************/ matrixStats/src/colCounts.c0000644000175100001440000000716113073627232015531 0ustar hornikusers/*************************************************************************** Public methods: SEXP colCounts(SEXP x, ...) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "colCounts_lowlevel.h" SEXP colCounts(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP value, SEXP what, SEXP naRm, SEXP hasNA) { SEXP ans; int narm, hasna, what2; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_LGL | R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'value': */ if (length(value) != 1) error("Argument 'value' must be a single value."); if (!isNumeric(value)) error("Argument 'value' must be a numeric value."); /* Argument 'what': */ what2 = asInteger(what); if (what2 < 0 || what2 > 2) error("INTERNAL ERROR: Unknown value of 'what' for rowCounts: %d", what2); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* R allocate an integer vector of length 'ncol' */ PROTECT(ans = allocVector(INTSXP, ncols)); if (isReal(x)) { colCounts_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, asReal(value), what2, narm, hasna, INTEGER(ans)); } else if (isInteger(x)) { colCounts_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, asInteger(value), what2, narm, hasna, INTEGER(ans)); } else if (isLogical(x)) { colCounts_lgl[rowsType][colsType](LOGICAL(x), nrow, ncol, crows, nrows, ccols, ncols, asLogical(value), what2, narm, hasna, INTEGER(ans)); } UNPROTECT(1); return(ans); } // colCounts() SEXP count(SEXP x, SEXP idxs, SEXP value, SEXP what, SEXP naRm, SEXP hasNA) { SEXP ans; int narm, hasna, what2; R_xlen_t nx; /* Argument 'x' and 'dim': */ assertArgVector(x, (R_TYPE_LGL | R_TYPE_INT | R_TYPE_REAL), "x"); nx = xlength(x); /* Argument 'value': */ if (length(value) != 1) error("Argument 'value' must be a single value."); if (!isNumeric(value)) error("Argument 'value' must be a numeric value."); /* Argument 'what': */ what2 = asInteger(what); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'idxs': */ R_xlen_t nrows, ncols = 1; int rowsType, colsType = SUBSETTED_ALL; void *crows = validateIndices(idxs, nx, 1, &nrows, &rowsType); void *ccols = NULL; /* R allocate a integer scalar */ PROTECT(ans = allocVector(INTSXP, 1)); if (isReal(x)) { colCounts_dbl[rowsType][colsType](REAL(x), nx, 1, crows, nrows, ccols, ncols, asReal(value), what2, narm, hasna, INTEGER(ans)); } else if (isInteger(x)) { colCounts_int[rowsType][colsType](INTEGER(x), nx, 1, crows, nrows, ccols, ncols, asInteger(value), what2, narm, hasna, INTEGER(ans)); } else if (isLogical(x)) { colCounts_lgl[rowsType][colsType](LOGICAL(x), nx, 1, crows, nrows, ccols, ncols, asLogical(value), what2, narm, hasna, INTEGER(ans)); } UNPROTECT(1); return(ans); } // count() /*************************************************************************** HISTORY: 2015-04-21 [DJ] o Supported subsetted computation. 2014-11-14 [HB] o Created from rowCounts.c. **************************************************************************/ matrixStats/src/rowMeans2_lowlevel.h0000644000175100001440000000712213073627232017350 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowMeans2_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMeans2_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) */ #define METHOD rowMeans2 #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int narm, int hasna, int byrow, double *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #undef METHOD matrixStats/src/colCounts_lowlevel.h0000644000175100001440000001261713073627232017451 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void colCounts_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void colCounts_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void colCounts_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void colCounts_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void colCounts_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void colCounts_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void colCounts_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void colCounts_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void colCounts_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void colCounts_lgl_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_lgl_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_lgl_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_lgl_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_lgl_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_lgl_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_lgl_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_lgl_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void colCounts_lgl_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) */ #define METHOD colCounts #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, X_C_TYPE value, int what, int narm, int hasna, int *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #define X_TYPE 'l' #include "000.templates-gen-matrix.h" matrixStats/src/validateIndices_lowlevel.h0000644000175100001440000000171213073627232020562 0ustar hornikusers#include #include "000.utils.h" #define METHOD validateIndices #define RETURN_VALIDATED_ANS(type, n, cond, item, poststmt) \ type *ans = (type*) R_alloc(count, sizeof(type)); \ jj = 0; \ for (ii = 0; ii < n; ++ ii) { \ if (cond) ans[jj ++] = item; \ } \ poststmt \ return ans #define FILL_VALIDATED_ANS(n, cond, item) \ jj = 0; \ for (ii = 0; ii < n; ++ ii) { \ if (cond) ans[jj ++] = item; \ } #define X_TYPE 'i' #define SUBSETTED_DEFAULT SUBSETTED_INTEGER #include "validateIndices_lowlevel_template.h" #undef SUBSETTED_DEFAULT #define X_TYPE 'r' #define SUBSETTED_DEFAULT SUBSETTED_REAL #include "validateIndices_lowlevel_template.h" #undef SUBSETTED_DEFAULT matrixStats/src/rowCummins_lowlevel.h0000644000175100001440000000643113073627232017640 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowCummins_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummins_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummins_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummins_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummins_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummins_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummins_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummins_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummins_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummins_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummins_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummins_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummins_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummins_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummins_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummins_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummins_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummins_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) */ #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, ANS_C_TYPE *ans #define METHOD rowCummins #define COMP '<' #define METHOD_TEMPLATE_H "rowCumMinMaxs_lowlevel_template.h" #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #undef COMP #undef METHOD matrixStats/src/rowCumprods_lowlevel.h0000644000175100001440000000630213073627232020016 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowCumprods_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumprods_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumprods_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumprods_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumprods_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumprods_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumprods_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumprods_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumprods_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumprods_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumprods_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumprods_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumprods_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumprods_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumprods_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumprods_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumprods_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumprods_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) */ #define METHOD rowCumprods #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, ANS_C_TYPE *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" matrixStats/src/indexByRow.c0000644000175100001440000000431613073627232015651 0ustar hornikusers/*************************************************************************** Public methods: SEXP indexByRow(SEXP dim, SEXP idxs) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" SEXP indexByRow(SEXP dim, SEXP idxs) { SEXP ans; int nr, nc; int *ans_ptr, *idxs_ptr; R_xlen_t i, idx, n, nidxs; int col, row; int d; double nd = 1.0; /* Argument 'dim': */ if (!isInteger(dim) || xlength(dim) != 2) { error("Argument 'dim' must be an integer vector of length two."); } for (i = 0; i < xlength(dim); i++) { d = INTEGER(dim)[i]; if (d < 0) { error("Argument 'dim' specifies a negative value: %d", d); } nd *= d; #ifndef LONG_VECTOR_SUPPORT if (nd > R_INT_MAX) { error("Argument 'dim' specifies too many elements: %.g > %d", nd, R_INT_MAX); } #endif } n = (R_xlen_t)nd; /* Argument 'idxs': */ if (isNull(idxs)) { idxs_ptr = NULL; nidxs = 0; } else if (isVectorAtomic(idxs)) { idxs_ptr = INTEGER(idxs); nidxs = xlength(idxs); } else { /* To please compiler */ idxs_ptr = NULL; nidxs = 0; error("Argument 'idxs' must be NULL or a vector."); } nr = INTEGER(dim)[0]; nc = INTEGER(dim)[1]; if (idxs_ptr == NULL) { PROTECT(ans = allocVector(INTSXP, n)); ans_ptr = INTEGER(ans); row = 1; col = 0; for (i = 0; i < n; i++) { ans_ptr[i] = row + col*nr; col++; if (col == nc) { row++; col = 0; } } UNPROTECT(1); } else { PROTECT(ans = allocVector(INTSXP, nidxs)); ans_ptr = INTEGER(ans); for (i = 0; i < nidxs; i++) { // idxs <- idxs - 1 // cols <- idxs %/% dim[2L] // rows <- idxs %% dim[2L] // cols + dim[1L]*rows + 1L idx = idxs_ptr[i] - 1; col = idx / nc; row = idx - nc*col; row = idx % nc; idx = col + nr*row + 1; ans_ptr[i] = idx; } UNPROTECT(1); } return(ans); } // indexByRow() /*************************************************************************** HISTORY: 2014-11-09 [HB] o Created. **************************************************************************/ matrixStats/src/rowCumsums_lowlevel.h0000644000175100001440000000625713073627232017667 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowCumsums_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumsums_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumsums_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumsums_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumsums_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumsums_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumsums_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumsums_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumsums_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCumsums_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumsums_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumsums_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumsums_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumsums_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumsums_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumsums_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumsums_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCumsums_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) */ #define METHOD rowCumsums #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, ANS_C_TYPE *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" matrixStats/src/diff2_lowlevel_template.h0000644000175100001440000000532713073627232020365 0ustar hornikusers/*********************************************************************** TEMPLATE: void diff2_[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, R_xlen_t lag, R_xlen_t differences, X_C_TYPE *ans, R_xlen_t nans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" #include #undef X_DIFF #if X_TYPE == 'i' #ifndef diff_int static R_INLINE int diff_int(int a, int b) { if (X_ISNA(a) || X_ISNA(b)) return(NA_INTEGER); return a-b; } #define diff_int diff_int #endif #define X_DIFF diff_int #elif X_TYPE == 'r' #define X_DIFF(a,b) a-b #endif RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { R_xlen_t ii, tt, uu; X_C_TYPE xvalue1, xvalue2; X_C_TYPE *tmp = NULL; #ifdef IDXS_TYPE IDXS_C_TYPE *cidxs = (IDXS_C_TYPE*) idxs; #endif /* Nothing to do? */ if (nans <= 0) return; /* Special case (difference == 1) */ if (differences == 1) { for (ii=0; ii < nans; ii++) { xvalue1 = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), X_NA); xvalue2 = R_INDEX_GET(x, IDX_INDEX(cidxs,ii+lag), X_NA); ans[ii] = X_DIFF(xvalue2, xvalue1); } } else { /* Allocate temporary work vector (to hold intermediate differences) */ tmp = Calloc(nidxs - lag, X_C_TYPE); /* (a) First order of differences */ for (ii=0; ii < nidxs-lag; ii++) { xvalue1 = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), X_NA); xvalue2 = R_INDEX_GET(x, IDX_INDEX(cidxs,ii+lag), X_NA); tmp[ii] = X_DIFF(xvalue2, xvalue1); } nidxs -= lag; /* (b) All other orders of differences but the last */ while (--differences > 1) { uu = lag; tt = 0; for (ii=0; ii < nidxs-lag; ii++) { tmp[ii] = X_DIFF(tmp[uu++], tmp[tt++]); } nidxs -= lag; } /* Sanity check */ /* if (nidxs-lag != nans) error("nidxs != nans: %d != %d\n", nidxs, nans); */ /* (c) Last order of differences */ uu = lag; tt = 0; for (ii=0; ii < nans; ii++) { ans[ii] = X_DIFF(tmp[uu++], tmp[tt++]); } /* Deallocate temorary work vector */ Free(tmp); } /* if (differences ...) */ } /*************************************************************************** HISTORY: 2015-06-14 [DJ] o Supported subsetted computation. 2014-12-29 [HB] o Created. **************************************************************************/ matrixStats/src/binMeans_lowlevel_template.h0000644000175100001440000001207613073627232021126 0ustar hornikusers/*************************************************************************** TEMPLATE: binMeans_(...) GENERATES: void binMeans_L(double *y, R_xlen_t ny, double *x, R_xlen_t nx, double *bx, R_xlen_t nbins, double *ans, int *count) void binMeans_R(double *y, R_xlen_t ny, double *x, R_xlen_t nx, double *bx, R_xlen_t nbins, double *ans, int *count) Arguments: The following macros ("arguments") should be defined for the template to work as intended. - BIN_BY: 'L' or 'R' Copyright Henrik Bengtsson, 2012-2013 **************************************************************************/ #include "000.types.h" #if BIN_BY == 'L' /* [u,v) */ #define METHOD_NAME binMeans_L #define IS_PART_OF_FIRST_BIN(x, bx0) (x < bx0) #define IS_PART_OF_NEXT_BIN(x, bx1) (x >= bx1) #elif BIN_BY == 'R' /* (u,v] */ #define METHOD_NAME binMeans_R #define IS_PART_OF_FIRST_BIN(x, bx0) (x <= bx0) #define IS_PART_OF_NEXT_BIN(x, bx1) (x > bx1) #endif void METHOD_NAME(double *y, R_xlen_t ny, double *x, R_xlen_t nx, double *bx, R_xlen_t nbins, double *ans, int *count) { R_xlen_t ii = 0, jj = 0, iStart=0; R_xlen_t n = 0; LDOUBLE sum = 0.0; int warn = 0; // Count? if (nbins > 0) { // Skip to the first bin while ((iStart < nx) && IS_PART_OF_FIRST_BIN(x[iStart], bx[0])) { ++iStart; } // For each x... for (ii = iStart; ii < nx; ++ii) { // Skip to a new bin? while (IS_PART_OF_NEXT_BIN(x[ii], bx[jj+1])) { // Update statistic of current bin? if (count) { /* Although unlikely, with long vectors the count for a bin can become greater than what is possible to represent by an integer. Detect and warn about this. */ if (n > R_INT_MAX) { warn = 1; count[jj] = R_INT_MAX; } else { count[jj] = n; } } ans[jj] = n > 0 ? sum / n : R_NaN; sum = 0.0; n = 0; // ...and move to next ++jj; // No more bins? if (jj >= nbins) { // Make the outer for-loop to exit... ii = nx - 1; // ...but correct for the fact that the y[nx-1] point will // be incorrectly added to the sum. Doing the correction // here avoids an if (ii < nx) sum += y[ii] below. sum -= y[ii]; break; } } // Sum and count sum += y[ii]; ++n; /* Early LDOUBLE stopping? */ if (n % 1048576 == 0 && !R_FINITE(sum)) break; } // Update statistic of the last bin? if (jj < nbins) { if (count) { /* Although unlikely, with long vectors the count for a bin can become greater than what is possible to represent by an integer. Detect and warn about this. */ if (n > R_INT_MAX) { warn= 1; count[jj] = R_INT_MAX; } else { count[jj] = n; } } ans[jj] = n > 0 ? sum / n : R_NaN; // Assign the remaining bins to zero counts and missing mean values while (++jj < nbins) { ans[jj] = R_NaN; if (count) count[jj] = 0; } } } // if (nbins > 0) if (warn) { warning("Integer overflow. Detected one or more bins with a count that is greater than what can be represented by the integer data type. Setting count to the maximum integer possible (.Machine$integer.max = %d). The bin mean is still correct.", R_INT_MAX); } } /* Undo template macros */ #undef BIN_BY #undef IS_PART_OF_FIRST_BIN #undef IS_PART_OF_NEXT_BIN #include "000.templates-types_undef.h" /*************************************************************************** HISTORY: 2014-11-07 [HB] o ROBUSTNESS: Added protection for integer overflow in bin counts. 2014-11-06 [HB] o CLEANUP: Moving away from R data types in low-level C functions. 2014-10-01 [HB] o BUG FIX: binMeans() returned 0.0 instead of NA_real_ for empty bins. 2014-04-04 [HB] o BUG FIX: The native code of binMeans(x, bx) would try to access an out-of-bounds value of argument 'y' iff 'x' contained elements that are left of all bins in 'bx'. This bug had no impact on the results and since no assignment was done it should also not crash/ core dump R. This was discovered thanks to new memtests (ASAN and valgrind) provided by CRAN. 2013-10-08 [HB] o Created template for binMeans_() to create functions that bin either by [u,v) or (u,v]. 2013-05-10 [HB] o SPEEDUP: binMeans() no longer tests in every iteration (=for every data point) whether the last bin has been reached or not. 2012-10-10 [HB] o BUG FIX: binMeans() would return random/garbage means/counts for bins that were beyond the last data point. o BUG FIX: In some cases binMeans() could try to go past the last bin. 2012-10-03 [HB] o Created binMeans(), which was adopted from from code proposed by Martin Morgan (Fred Hutchinson Cancer Research Center, Seattle) as a reply to HB's R-devel thread 'Fastest non-overlapping binning mean function out there?' on Oct 3, 2012. **************************************************************************/ matrixStats/src/000.api.h0000644000175100001440000000523613073627232014635 0ustar hornikusers/* C-level API that is called from R */ SEXP allocArray2(SEXP dim, SEXP value); SEXP allocMatrix2(SEXP nrow, SEXP ncol, SEXP value); SEXP allocVector2(SEXP length, SEXP value); SEXP anyMissing(SEXP x, SEXP idxs); SEXP binCounts(SEXP x, SEXP bx, SEXP right); SEXP binMeans(SEXP y, SEXP x, SEXP bx, SEXP retCount, SEXP right); SEXP colCounts(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP value, SEXP what, SEXP naRm, SEXP hasNA); SEXP colOrderStats(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP which); SEXP colRanges(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP what, SEXP naRm, SEXP hasNA); SEXP count(SEXP x, SEXP idxs, SEXP value, SEXP what, SEXP naRm, SEXP hasNA); SEXP diff2(SEXP x, SEXP idxs, SEXP lag, SEXP differences); SEXP indexByRow(SEXP dim, SEXP idxs); SEXP logSumExp(SEXP lx, SEXP idxs, SEXP naRm, SEXP hasNA); SEXP mean2(SEXP x, SEXP idxs, SEXP naRm, SEXP refine); SEXP productExpSumLog(SEXP x, SEXP idxs, SEXP naRm, SEXP hasNA); SEXP psortKM(SEXP x, SEXP k, SEXP m); SEXP rowCounts(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP value, SEXP what, SEXP naRm, SEXP hasNA); SEXP rowCummaxs(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP byRow); SEXP rowCummins(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP byRow); SEXP rowCumprods(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP byRow); SEXP rowCumsums(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP byRow); SEXP rowDiffs(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP lag, SEXP differences, SEXP byRow); SEXP rowLogSumExps(SEXP lx, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow); SEXP rowMads(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP constant, SEXP naRm, SEXP hasNA, SEXP byRow); SEXP rowMeans2(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow); SEXP rowMedians(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow); SEXP rowOrderStats(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP which); SEXP rowRanges(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP what, SEXP naRm, SEXP hasNA); SEXP rowRanksWithTies(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP tiesMethod, SEXP byRow); SEXP rowSums2(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow); SEXP rowVars(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow); SEXP signTabulate(SEXP x, SEXP idxs); SEXP sum2(SEXP x, SEXP idxs, SEXP naRm, SEXP mode); SEXP validate(SEXP idxs, SEXP maxIdx, SEXP allowOutOfBound); SEXP weightedMean(SEXP x, SEXP w, SEXP idxs, SEXP naRm, SEXP refine); SEXP weightedMedian(SEXP x, SEXP w, SEXP idxs, SEXP naRm, SEXP interpolate, SEXP ties); SEXP x_OP_y(SEXP x, SEXP y, SEXP dim, SEXP operator, SEXP xrows, SEXP xcols, SEXP yidxs, SEXP commute, SEXP naRm, SEXP hasNA, SEXP byRow); matrixStats/src/rowCounts.c0000644000175100001440000000437113073627232015563 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowCounts(SEXP x, ...) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "rowCounts_lowlevel.h" SEXP rowCounts(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP value, SEXP what, SEXP naRm, SEXP hasNA) { SEXP ans; int narm, hasna, what2; R_xlen_t nrow, ncol; /* Argument 'x' & 'dim': */ assertArgMatrix(x, dim, (R_TYPE_LGL | R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'value': */ if (length(value) != 1) error("Argument 'value' must be a single value."); if (!isNumeric(value)) error("Argument 'value' must be a numeric value."); /* Argument 'what': */ what2 = asInteger(what); if (what2 < 0 || what2 > 2) error("INTERNAL ERROR: Unknown value of 'what' for rowCounts: %d", what2); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* R allocate a double vector of length 'nrow' */ PROTECT(ans = allocVector(INTSXP, nrows)); /* Double matrices are more common to use. */ if (isReal(x)) { rowCounts_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, asReal(value), what2, narm, hasna, INTEGER(ans)); } else if (isInteger(x)) { rowCounts_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, asInteger(value), what2, narm, hasna, INTEGER(ans)); } else if (isLogical(x)) { rowCounts_lgl[rowsType][colsType](LOGICAL(x), nrow, ncol, crows, nrows, ccols, ncols, asLogical(value), what2, narm, hasna, INTEGER(ans)); } UNPROTECT(1); return(ans); } // rowCounts() /*************************************************************************** HISTORY: 2015-04-13 [DJ] o Supported subsetted computation. 2014-06-02 [HB] o Created. **************************************************************************/ matrixStats/src/mean2_lowlevel_template.h0000644000175100001440000000447113073627232020374 0ustar hornikusers/*********************************************************************** TEMPLATE: double mean2_[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nx, int *idxs, R_xlen_t nidxs, int narm, int refine Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' Copyright: Henrik Bengtsson, 2014-2017 ***********************************************************************/ #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" #include RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { X_C_TYPE value; R_xlen_t ii; LDOUBLE sum = 0, avg = R_NaN; #if X_TYPE == 'r' LDOUBLE rsum = 0; #endif R_xlen_t count = 0; #ifdef IDXS_TYPE IDXS_C_TYPE *cidxs = (IDXS_C_TYPE*) idxs; #endif for (ii=0; ii < nidxs; ++ii) { value = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), X_NA); #if X_TYPE == 'i' if (!X_ISNAN(value)) { sum += (LDOUBLE)value; ++count; } else if (!narm) { sum = R_NaReal; break; } #elif X_TYPE == 'r' if (!narm) { sum += (LDOUBLE)value; ++count; /* Early stopping if sum is NA_real_ (but not NaN, -Inf, or +Inf) */ if (ii % 1048576 == 0 && ISNA(sum)) break; } else if (!ISNAN(value)) { sum += (LDOUBLE)value; ++count; } #endif } /* for (i ...) */ if (sum > DOUBLE_XMAX) { avg = R_PosInf; } else if (sum < -DOUBLE_XMAX) { avg = R_NegInf; } else { avg = sum / count; /* Extra precision by summing over residuals? */ #if X_TYPE == 'r' if (refine && R_FINITE(avg)) { for (ii=0; ii < nidxs; ++ii) { value = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), X_NA); if (!narm || !ISNAN(value)) { rsum += (LDOUBLE)(value - avg); } } avg += (rsum / count); } #endif } return (double)avg; } /*************************************************************************** HISTORY: 2015-07-04 [DJ] o Supported subsetted computation. 2014-11-06 [HB] o CLEANUP: Now mean2_() uses only basic C types. 2014-11-02 [HB] o Created. **************************************************************************/ matrixStats/src/binMeans_lowlevel.h0000644000175100001440000000076613073627232017236 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" #include /* Native API (dynamically generated via macros): void binMeans_L(double *y, R_xlen_t ny, double *x, R_xlen_t nx, double *bx, R_xlen_t nbins, double *ans, int *count) void binMeans_R(double *y, R_xlen_t ny, double *x, R_xlen_t nx, double *bx, R_xlen_t nbins, double *ans, int *count) */ #define BIN_BY 'L' #include "binMeans_lowlevel_template.h" #define BIN_BY 'R' #include "binMeans_lowlevel_template.h" matrixStats/src/weightedMean_lowlevel_template.h0000644000175100001440000000534613073627232021775 0ustar hornikusers/*********************************************************************** TEMPLATE: double weightedMean_[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int refine Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" #include RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { X_C_TYPE value; double weight; R_xlen_t i; LDOUBLE sum = 0, wtotal = 0; LDOUBLE avg = R_NaN; #ifdef IDXS_TYPE IDXS_C_TYPE *cidxs = (IDXS_C_TYPE*) idxs; #endif for (i=0; i < nidxs; i++) { weight = R_INDEX_GET(w, IDX_INDEX(cidxs,i), NA_REAL); /* Skip or early stopping? */ if (weight == 0) { continue; } value = R_INDEX_GET(x, IDX_INDEX(cidxs,i), X_NA); #if X_TYPE == 'i' if (X_ISNAN(value)) { /* Skip or early stopping? */ if (narm) { continue; } else { sum = R_NaReal; break; } } else { sum += (LDOUBLE)weight * (LDOUBLE)value; wtotal += weight; } #elif X_TYPE == 'r' if (!narm) { sum += (LDOUBLE)weight * (LDOUBLE)value; wtotal += weight; /* Early stopping? Special for long LDOUBLE vectors */ if (i % 1048576 == 0 && ISNAN(sum)) break; } else if (!X_ISNAN(value)) { sum += (LDOUBLE)weight * (LDOUBLE)value; wtotal += weight; } #endif } /* for (i ...) */ if (wtotal > DOUBLE_XMAX || wtotal < -DOUBLE_XMAX) { avg = R_NaN; } else if (sum > DOUBLE_XMAX) { avg = R_PosInf; } else if (sum < -DOUBLE_XMAX) { avg = R_NegInf; } else { avg = sum / wtotal; #if X_TYPE == 'r' /* Extra precision by summing over residuals? */ if (refine && R_FINITE(avg)) { sum = 0; for (i=0; i < nidxs; i++) { weight = R_INDEX_GET(w, IDX_INDEX(cidxs,i), NA_REAL); /* Skip? */ if (weight == 0) { continue; } value = R_INDEX_GET(x, IDX_INDEX(cidxs,i), X_NA); if (!narm) { sum += (LDOUBLE)weight * (value - avg); /* Early stopping? Special for long LDOUBLE vectors */ if (i % 1048576 == 0 && ISNAN(sum)) break; } else if (!ISNAN(value)) { sum += (LDOUBLE)weight * (value - avg); } } avg += (sum / wtotal); } #endif } return (double)avg; } /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-12-08 [HB] o Created. **************************************************************************/ matrixStats/src/rowLogSumExp_lowlevel.h0000644000175100001440000000210513073627232020102 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowLogSumExps_double_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, int rowsType, void *cols, R_xlen_t Rf_ncols, int colsType, int narm, int hasna, R_xlen_t byrow, double *ans) void rowLogSumExps_double_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, int rowsType, void *cols, R_xlen_t Rf_ncols, int colsType, int narm, int hasna, R_xlen_t byrow, double *ans) void rowLogSumExps_double_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, int rowsType, void *cols, R_xlen_t Rf_ncols, int colsType, int narm, int hasna, R_xlen_t byrow, double *ans) */ #define METHOD rowLogSumExp #define METHOD_NAME rowLogSumExps_double #define RETURN_TYPE void #define ARGUMENTS_LIST double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, int rowsType, void *cols, R_xlen_t ncols, int colsType, int narm, int hasna, R_xlen_t byrow, double *ans #include "000.templates-gen-vector.h" matrixStats/src/rowCummins.c0000644000175100001440000000327213073627232015722 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowCummins(SEXP x, ...) SEXP colCummins(SEXP x, ...) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "rowCummins_lowlevel.h" SEXP rowCummins(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP byRow) { int byrow; SEXP ans = NILSXP; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); /* Double matrices are more common to use. */ if (isReal(x)) { PROTECT(ans = allocMatrix(REALSXP, nrows, ncols)); rowCummins_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, REAL(ans)); UNPROTECT(1); } else if (isInteger(x)) { PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); rowCummins_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, INTEGER(ans)); UNPROTECT(1); } return(ans); } /* rowCummins() */ #undef COMP #undef METHOD /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-26 [HB] o Created from rowVars.c. **************************************************************************/ matrixStats/src/rowOrderStats_lowlevel.h0000644000175100001440000000641413073627232020320 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowOrderStats_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void rowOrderStats_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void rowOrderStats_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void rowOrderStats_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void rowOrderStats_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void rowOrderStats_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void rowOrderStats_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void rowOrderStats_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void rowOrderStats_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, int *ans) void rowOrderStats_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void rowOrderStats_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void rowOrderStats_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void rowOrderStats_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void rowOrderStats_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void rowOrderStats_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void rowOrderStats_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void rowOrderStats_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) void rowOrderStats_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, R_xlen_t qq, double *ans) */ #define METHOD rowOrderStats #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, R_xlen_t qq, X_C_TYPE *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" matrixStats/src/rowOrderStats_lowlevel_template.h0000644000175100001440000000643013073627232022211 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowOrderStats_[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, R_xlen_t qq, X_C_TYPE *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' - ANS_TYPE: 'i' or 'r' Authors: Adopted from rowQ() by R. Gentleman. Template by Henrik Bengtsson. Copyright: Henrik Bengtsson, 2007-2014 ***********************************************************************/ #include #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) ANS_TYPE => (ANS_SXP, ANS_NA, ANS_C_TYPE, ANS_IN_C) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj; R_xlen_t *colOffset, rowIdx; X_C_TYPE *values; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; // Check missing rows for (ii=0; ii < nrows; ++ii) { if (ROW_INDEX(crows,ii) == NA_R_XLEN_T) break; } if (ii < nrows && ncols > 0) { error("Argument 'rows' must not contain missing value"); } #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; // Check missing cols for (jj=0; jj < ncols; ++jj) { if (COL_INDEX(ccols,jj) == NA_R_XLEN_T) break; } if (jj < ncols && nrows > 0) { error("Argument 'cols' must not contain missing value"); } #endif /* R allocate memory for the 'values'. This will be taken care of by the R garbage collector later on. */ values = (X_C_TYPE *) R_alloc(ncols, sizeof(X_C_TYPE)); /* Pre-calculate the column offsets */ colOffset = (R_xlen_t *) R_alloc(ncols, sizeof(R_xlen_t)); for (jj=0; jj < ncols; jj++) colOffset[jj] = COL_INDEX_NONA(ccols,jj) * nrow; for (ii=0; ii < nrows; ii++) { rowIdx = ROW_INDEX_NONA(crows,ii); for (jj=0; jj < ncols; jj++) values[jj] = x[rowIdx + colOffset[jj]]; /* Sort vector of length 'ncol' up to position 'qq'. "...partial sorting: they permute x so that x[qq] is in the correct place with smaller values to the left, larger ones to the right." */ X_PSORT(values, ncols, qq); ans[ii] = values[qq]; } } /*************************************************************************** HISTORY: 2015-07-08 [DJ] o Supported subsetted computation. 2014-11-06 [HB] o CLEANUP: Moving away from R data types in low-level C functions. 2013-01-13 [HB] o Merged rowOrderStatsReal() and rowOrderStatsInteger() into one rowOrderStats_() templated function. 2009-02-04 [HB] o BUG FIX: For some errors in rowOrderStats(), the stack would not become UNPROTECTED before calling error. 2008-03-25 [HB] o Renamed from 'rowQuantiles' to 'rowOrderStats'. 2007-08-10 [HB] o Removed arguments for NAs since rowOrderStats() still don't support it. 2005-11-24 [HB] o Cool, it works and compiles nicely. o Preallocate colOffset to speed up things even more. o Added more comments and error checking. o Adopted from rowQ() in Biobase of Bioconductor. **************************************************************************/ matrixStats/src/anyMissing_lowlevel_template.h0000644000175100001440000000377213073627232021516 0ustar hornikusers/*********************************************************************** TEMPLATE: double anyMissing[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: SEXP x, void *idxs, R_xlen_t nidxs ***********************************************************************/ #include #include "000.types.h" #include "000.templates-types.h" #ifndef CHECK_MISSING #define CHECK_MISSING(cond) \ for (ii=0; ii < nidxs; ++ii) { \ if (cond) return 1; \ } #endif RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { R_xlen_t ii; double *xdp; int *xip, *xlp; Rcomplex *xcp; #ifdef IDXS_TYPE IDXS_C_TYPE *cidxs = (IDXS_C_TYPE*) idxs; #endif switch (TYPEOF(x)) { case REALSXP: xdp = REAL(x); CHECK_MISSING(ISNAN(R_INDEX_GET(xdp, IDX_INDEX(cidxs,ii), NA_REAL))); break; case INTSXP: xip = INTEGER(x); CHECK_MISSING(R_INDEX_GET(xip, IDX_INDEX(cidxs,ii), NA_INTEGER) == NA_INTEGER); break; case LGLSXP: xlp = LOGICAL(x); CHECK_MISSING(R_INDEX_GET(xlp, IDX_INDEX(cidxs,ii), NA_LOGICAL) == NA_LOGICAL); break; case CPLXSXP: xcp = COMPLEX(x); #ifdef IDXS_TYPE CHECK_MISSING(IDX_INDEX(cidxs,ii) == NA_R_XLEN_T || ISNAN(xcp[IDX_INDEX_NONA(cidxs,ii)].r) || ISNAN(xcp[IDX_INDEX_NONA(cidxs,ii)].i)); #else CHECK_MISSING(ISNAN(xcp[ii].r) || ISNAN(xcp[ii].i)); #endif break; case STRSXP: #ifdef IDXS_TYPE CHECK_MISSING(IDX_INDEX(cidxs,ii) == NA_R_XLEN_T || STRING_ELT(x, IDX_INDEX_NONA(cidxs,ii)) == NA_STRING); #else CHECK_MISSING(STRING_ELT(x, ii) == NA_STRING); #endif break; case RAWSXP: /* no such thing as a raw NA; always FALSE */ break; default: break; } /* switch() */ return 0; } // anyMissing() /*************************************************************************** HISTORY: 2015-07-15 [DJ] o Avoid 'embedding a directive within macro arguments'. 2015-06-15 [DJ] o Created. **************************************************************************/ matrixStats/src/x_OP_y_lowlevel_template.h0000644000175100001440000002221613073627232020564 0ustar hornikusers#include "000.types.h" #include "000.templates-types.h" #if OP == '+' #define FUN_no_NA CONCAT_MACROS(FUN_no_NA, METHOD_NAME_ROWS_COLS_IDXS) static R_INLINE double FUN_no_NA(X_C_TYPE x, Y_C_TYPE y) { #if X_TYPE == 'i' if (X_ISNAN(x)) return NA_REAL; #endif #if Y_TYPE == 'i' if (Y_ISNAN(y)) return NA_REAL; #endif return (double)x + (double)y; } #define FUN_narm CONCAT_MACROS(FUN, METHOD_NAME_ROWS_COLS_IDXS) static R_INLINE double FUN_narm(X_C_TYPE x, Y_C_TYPE y) { if (X_ISNAN(x)) { return (double)y; } else if (Y_ISNAN(y)) { return (double)x; } else { return (double)x + (double)y; } } #elif OP == '-' #define FUN_no_NA CONCAT_MACROS(FUN_no_NA, METHOD_NAME_ROWS_COLS_IDXS) static R_INLINE double FUN_no_NA(X_C_TYPE x, Y_C_TYPE y) { #if X_TYPE == 'i' if (X_ISNAN(x)) return NA_REAL; #endif #if Y_TYPE == 'i' if (Y_ISNAN(y)) return NA_REAL; #endif return (double)x - (double)y; } #define FUN_narm FUN_no_NA #elif OP == '*' #define FUN_no_NA CONCAT_MACROS(FUN_no_NA, METHOD_NAME_ROWS_COLS_IDXS) static R_INLINE double FUN_no_NA(X_C_TYPE x, Y_C_TYPE y) { #if X_TYPE == 'i' if (X_ISNAN(x)) return NA_REAL; #endif #if Y_TYPE == 'i' if (Y_ISNAN(y)) return NA_REAL; #endif return (double)x * (double)y; } #define FUN_narm CONCAT_MACROS(FUN, METHOD_NAME_ROWS_COLS_IDXS) static R_INLINE double FUN_narm(X_C_TYPE x, Y_C_TYPE y) { if (X_ISNAN(x)) { return (double)y; } else if (Y_ISNAN(y)) { return (double)x; } else { return (double)x * (double)y; } } #elif OP == '/' #define FUN_no_NA CONCAT_MACROS(FUN_no_NA, METHOD_NAME_ROWS_COLS_IDXS) static R_INLINE double FUN_no_NA(X_C_TYPE x, Y_C_TYPE y) { #if X_TYPE == 'i' if (X_ISNAN(x)) return NA_REAL; #endif #if Y_TYPE == 'i' if (Y_ISNAN(y)) return NA_REAL; #endif return (double)x / (double)y; } #define FUN_narm FUN_no_NA #else #error "INTERNAL ERROR: Failed to set C inline function FUN(x, y): Unknown OP" #endif RETURN_TYPE METHOD_NAME_ROWS_COLS_IDXS(ARGUMENTS_LIST) { R_xlen_t ii, jj, kk, idx, colBegin; R_xlen_t txi, yi; X_C_TYPE xvalue; Y_C_TYPE yvalue; double value; #if ANS_TYPE == 'i' int ok = 1; /* OK, i.e. no integer overflow yet? */ double R_INT_MIN_d = (double)R_INT_MIN, R_INT_MAX_d = (double)R_INT_MAX; #endif #ifdef ROWS_TYPE ROWS_C_TYPE *cxrows = (ROWS_C_TYPE*) xrows; #endif #ifdef COLS_TYPE COLS_C_TYPE *cxcols = (COLS_C_TYPE*) xcols; #endif #ifdef IDXS_TYPE IDXS_C_TYPE *cyidxs = (IDXS_C_TYPE*) yidxs; #endif yi = 0; kk = 0; if (byrow) { if (commute) { if (narm) { for (jj=0; jj < nxcols; ++jj) { colBegin = R_INDEX_OP(COL_INDEX(cxcols,jj), *, nrow); txi = jj; for (ii=0; ii < nxrows; ++ii) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(cxrows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); idx = IDX_INDEX(cyidxs, txi%nyidxs); yvalue = R_INDEX_GET(y, idx, Y_NA); value = FUN_narm(yvalue, xvalue); #if ANS_TYPE == 'i' if (ok && (value < R_INT_MIN_d || value > R_INT_MAX_d)) { ok = 0; value = NA_REAL; } ans[kk ++] = ISNAN(value) ? NA_INTEGER : (ANS_C_TYPE) value; #else ans[kk ++] = (ANS_C_TYPE) value; #endif txi += nxcols; /* txi = ii * nxcols + jj; */ } } } else { for (jj=0; jj < nxcols; ++jj) { colBegin = R_INDEX_OP(COL_INDEX(cxcols,jj), *, nrow); txi = jj; for (ii=0; ii < nxrows; ++ii) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(cxrows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); idx = IDX_INDEX(cyidxs, txi%nyidxs); yvalue = R_INDEX_GET(y, idx, Y_NA); value = FUN_no_NA(yvalue, xvalue); #if ANS_TYPE == 'i' if (ok && (value < R_INT_MIN_d || value > R_INT_MAX_d)) { ok = 0; value = NA_REAL; } ans[kk ++] = ISNAN(value) ? NA_INTEGER : (ANS_C_TYPE) value; #else ans[kk ++] = (ANS_C_TYPE) value; #endif txi += nxcols; /* txi = ii * nxcols + jj; */ } } } } else { if (narm) { for (jj=0; jj < nxcols; ++jj) { colBegin = R_INDEX_OP(COL_INDEX(cxcols,jj), *, nrow); txi = jj; for (ii=0; ii < nxrows; ++ii) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(cxrows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); idx = IDX_INDEX(cyidxs, txi%nyidxs); yvalue = R_INDEX_GET(y, idx, Y_NA); value = FUN_narm(xvalue, yvalue); #if ANS_TYPE == 'i' if (ok && (value < R_INT_MIN_d || value > R_INT_MAX_d)) { ok = 0; value = NA_REAL; } ans[kk ++] = ISNAN(value) ? NA_INTEGER : (ANS_C_TYPE) value; #else ans[kk ++] = (ANS_C_TYPE) value; #endif txi += nxcols; /* txi = ii * nxcols + jj; */ } } } else { for (jj=0; jj < nxcols; ++jj) { colBegin = R_INDEX_OP(COL_INDEX(cxcols,jj), *, nrow); txi = jj; for (ii=0; ii < nxrows; ++ii) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(cxrows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); idx = IDX_INDEX(cyidxs, txi%nyidxs); yvalue = R_INDEX_GET(y, idx, Y_NA); value = FUN_no_NA(xvalue, yvalue); #if ANS_TYPE == 'i' if (ok && (value < R_INT_MIN_d || value > R_INT_MAX_d)) { ok = 0; value = NA_REAL; } ans[kk ++] = ISNAN(value) ? NA_INTEGER : (ANS_C_TYPE) value; #else ans[kk ++] = (ANS_C_TYPE) value; #endif txi += nxcols; /* txi = ii * nxcols + jj; */ } } } } } else { if (commute) { if (narm) { for (jj=0; jj < nxcols; ++jj) { colBegin = R_INDEX_OP(COL_INDEX(cxcols,jj), *, nrow); for (ii=0; ii < nxrows; ++ii) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(cxrows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); idx = IDX_INDEX(cyidxs, yi); yvalue = R_INDEX_GET(y, idx, Y_NA); value = FUN_narm(yvalue, xvalue); #if ANS_TYPE == 'i' if (ok && (value < R_INT_MIN_d || value > R_INT_MAX_d)) { ok = 0; value = NA_REAL; } ans[kk ++] = ISNAN(value) ? NA_INTEGER : (ANS_C_TYPE) value; #else ans[kk ++] = (ANS_C_TYPE) value; #endif if (++ yi >= nyidxs) yi = 0; } } } else { for (jj=0; jj < nxcols; ++jj) { colBegin = R_INDEX_OP(COL_INDEX(cxcols,jj), *, nrow); for (ii=0; ii < nxrows; ++ii) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(cxrows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); idx = IDX_INDEX(cyidxs, yi); yvalue = R_INDEX_GET(y, idx, Y_NA); value = FUN_no_NA(yvalue, xvalue); #if ANS_TYPE == 'i' if (ok && (value < R_INT_MIN_d || value > R_INT_MAX_d)) { ok = 0; value = NA_REAL; } ans[kk ++] = ISNAN(value) ? NA_INTEGER : (ANS_C_TYPE) value; #else ans[kk ++] = (ANS_C_TYPE) value; #endif if (++ yi >= nyidxs) yi = 0; } } } } else { if (narm) { for (jj=0; jj < nxcols; ++jj) { colBegin = R_INDEX_OP(COL_INDEX(cxcols,jj), *, nrow); for (ii=0; ii < nxrows; ++ii) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(cxrows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); idx = IDX_INDEX(cyidxs, yi); yvalue = R_INDEX_GET(y, idx, Y_NA); value = FUN_narm(xvalue, yvalue); #if ANS_TYPE == 'i' if (ok && (value < R_INT_MIN_d || value > R_INT_MAX_d)) { ok = 0; value = NA_REAL; } ans[kk ++] = ISNAN(value) ? NA_INTEGER : (ANS_C_TYPE) value; #else ans[kk ++] = (ANS_C_TYPE) value; #endif if (++ yi >= nyidxs) yi = 0; } } } else { for (jj=0; jj < nxcols; ++jj) { colBegin = R_INDEX_OP(COL_INDEX(cxcols,jj), *, nrow); for (ii=0; ii < nxrows; ++ii) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(cxrows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); idx = IDX_INDEX(cyidxs, yi); yvalue = R_INDEX_GET(y, idx, Y_NA); value = FUN_no_NA(xvalue, yvalue); #if ANS_TYPE == 'i' if (ok && (value < R_INT_MIN_d || value > R_INT_MAX_d)) { ok = 0; value = NA_REAL; } ans[kk ++] = ISNAN(value) ? NA_INTEGER : (ANS_C_TYPE) value; #else ans[kk ++] = (ANS_C_TYPE) value; #endif if (++ yi >= nyidxs) yi = 0; } } } } } /* if (byrow) */ #if ANS_TYPE == 'i' /* Warn on integer overflow? */ if (!ok) { warning("Integer overflow. Detected one or more elements whose absolute values were out of the range [%d,%d] that can be used to for integers. Such values are set to NA_integer_.", R_INT_MIN, R_INT_MAX); } #endif } #undef FUN #undef FUN_narm matrixStats/src/000.types.h0000644000175100001440000000207313073627232015224 0ustar hornikusers#include /* R_xlen_t, ... */ #ifndef R_INT_MIN #define R_INT_MIN -INT_MAX #endif #ifndef R_INT_MAX #define R_INT_MAX INT_MAX #endif /* inf */ #ifndef IS_INF #define IS_INF(x) (x == R_PosInf || x == R_NegInf) #endif /* Subsetting index mode */ #ifndef SUBSETTED_MODE_INDEX #define SUBSETTED_MODE_INDEX #define SUBSETTED_ALL 0 #define SUBSETTED_INTEGER 1 #define SUBSETTED_REAL 2 #endif /* As in /src/include/Defn.h */ #ifdef HAVE_LONG_DOUBLE #define LDOUBLE long double #else #define LDOUBLE double #endif /* Backward compatibility with R (< 3.0.0) As in /src/include/Rinternals.h */ #ifndef R_XLEN_T_MAX typedef int R_xlen_t; #define R_XLEN_T_MAX R_LEN_T_MAX #ifndef xlength #define xlength length #endif #endif /* define NA_R_XLEN_T */ #ifdef LONG_VECTOR_SUPPORT #define R_XLEN_T_MIN -R_XLEN_T_MAX-1 #define NA_R_XLEN_T R_XLEN_T_MIN #else #define NA_R_XLEN_T NA_INTEGER #endif /* Macro to check for user interrupts every 2^20 iteration */ #define R_CHECK_USER_INTERRUPT(i) if (i % 1048576 == 0) R_CheckUserInterrupt() matrixStats/src/rowMedians_lowlevel.h0000644000175100001440000000712513073627232017606 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowMedians_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowMedians_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) */ #define METHOD rowMedians #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int narm, int hasna, int byrow, double *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" matrixStats/src/rowDiffs_lowlevel.h0000644000175100001440000001100513073627232017251 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowDiffs_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) void rowDiffs_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) */ #define METHOD rowDiffs #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, R_xlen_t lag, R_xlen_t differences, X_C_TYPE *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" matrixStats/src/anyMissing.c0000644000175100001440000000232713073627232015700 0ustar hornikusers/*************************************************************************** Public methods: anyMissing(SEXP x, SEXP idxs) TO DO: Support list():s too. Copyright Henrik Bengtsson, 2007 **************************************************************************/ #include #include "000.types.h" #include "000.utils.h" #include "anyMissing_lowlevel.h" SEXP anyMissing(SEXP x, SEXP idxs) { SEXP ans; R_xlen_t nx; nx = xlength(x); /* Argument 'idxs': */ R_xlen_t nidxs; int idxsType; void *cidxs = validateIndices(idxs, nx, 1, &nidxs, &idxsType); PROTECT(ans = allocVector(LGLSXP, 1)); LOGICAL(ans)[0] = 0; /* anyMissing() on zero-length objects should always return FALSE, just like any(double(0)). */ if (nidxs == 0) { UNPROTECT(1); return(ans); } LOGICAL(ans)[0] = anyMissing_internal[idxsType](x, cidxs, nidxs); UNPROTECT(1); /* ans */ return(ans); } // anyMissing() /*************************************************************************** HISTORY: 2015-06-14 [DJ] o Supported subsetted computation. 2007-08-14 [HB] o Created using do_isna() in src/main/coerce.c as a template. **************************************************************************/ matrixStats/src/diff2_lowlevel.h0000644000175100001440000000235413073627232016467 0ustar hornikusers#include #include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void diff2_int_aidxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nans) void diff2_int_iidxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nans) void diff2_int_didxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, R_xlen_t lag, R_xlen_t differences, int *ans, R_xlen_t nans) void diff2_dbl_aidxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nans) void diff2_dbl_iidxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nans) void diff2_dbl_didxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, R_xlen_t lag, R_xlen_t differences, double *ans, R_xlen_t nans) */ #define METHOD diff2 #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, R_xlen_t lag, R_xlen_t differences, X_C_TYPE *ans, R_xlen_t nans #define X_TYPE 'i' #include "000.templates-gen-vector.h" #define X_TYPE 'r' #include "000.templates-gen-vector.h" matrixStats/src/anyMissing_lowlevel.h0000644000175100001440000000067013073627232017615 0ustar hornikusers/* Native API (dynamically generated via macros): int anyMissing_internal_aidxs(SEXP x, void *idxs, R_xlen_t nidxs) int anyMissing_internal_iidxs(SEXP x, void *idxs, R_xlen_t nidxs) int anyMissing_internal_didxs(SEXP x, void *idxs, R_xlen_t nidxs) */ #define METHOD anyMissing #define METHOD_NAME anyMissing_internal #define RETURN_TYPE int #define ARGUMENTS_LIST SEXP x, void *idxs, R_xlen_t nidxs #include "000.templates-gen-vector.h" matrixStats/src/colOrderStats.c0000644000175100001440000000455413073627232016353 0ustar hornikusers/*************************************************************************** Public methods: SEXP colOrderStats(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP which) Authors: Henrik Bengtsson To do: Add support for missing values. Copyright Henrik Bengtsson, 2007-2014 **************************************************************************/ #include #include "000.types.h" #include "colOrderStats_lowlevel.h" SEXP colOrderStats(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP which) { SEXP ans = NILSXP; R_xlen_t nrow, ncol, qq; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'which': */ if (length(which) != 1) error("Argument 'which' must be a single number."); if (!isNumeric(which)) error("Argument 'which' must be a numeric number."); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; int rowsHasna, colsHasna; void *crows = validateIndicesCheckNA(rows, nrow, 0, &nrows, &rowsType, &rowsHasna); void *ccols = validateIndicesCheckNA(cols, ncol, 0, &ncols, &colsType, &colsHasna); // Check missing rows if (rowsHasna && ncols > 0) { error("Argument 'rows' must not contain missing value"); } // Check missing cols if (colsHasna && nrows > 0) { error("Argument 'cols' must not contain missing value"); } /* Subtract one here, since rPsort does zero based addressing */ qq = asInteger(which) - 1; /* Assert that 'qq' is a valid index */ if (qq < 0 || qq >= nrows) { error("Argument 'which' is out of range."); } /* Double matrices are more common to use. */ if (isReal(x)) { PROTECT(ans = allocVector(REALSXP, ncols)); colOrderStats_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, qq, REAL(ans)); UNPROTECT(1); } else if (isInteger(x)) { PROTECT(ans = allocVector(INTSXP, ncols)); colOrderStats_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, qq, INTEGER(ans)); UNPROTECT(1); } return(ans); } // colOrderStats() /*************************************************************************** HISTORY: 2015-07-08 [DJ] o Supported subsetted computation. 2014-11-16 [HB] o Created from rowOrderStats.c. **************************************************************************/ matrixStats/src/sum2_lowlevel_template.h0000644000175100001440000000327013073627232020254 0ustar hornikusers/*********************************************************************** TEMPLATE: double sum2_[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nx, int *idxs, R_xlen_t nidxs, int narm, int mode Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' Copyright: Henrik Bengtsson, 2014-2017 ***********************************************************************/ #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" #include RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { X_C_TYPE value; R_xlen_t ii; LDOUBLE sum = 0; #ifdef IDXS_TYPE IDXS_C_TYPE *cidxs = (IDXS_C_TYPE*) idxs; #endif for (ii=0; ii < nidxs; ++ii) { value = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), X_NA); #if X_TYPE == 'i' if (!X_ISNAN(value)) { sum += (LDOUBLE)value; } else if (!narm) { sum = R_NaReal; break; } #elif X_TYPE == 'r' if (!narm) { sum += (LDOUBLE)value; /* Early stopping if sum is NA_real_ (but not NaN, -Inf, or +Inf) */ if (ii % 1048576 == 0 && ISNA(sum)) break; } else if (!ISNAN(value)) { sum += (LDOUBLE)value; } #endif } /* for (ii ...) */ return (double)sum; } /*************************************************************************** HISTORY: 2015-07-11 [DJ] o Supported subsetted computation. 2014-11-06 [HB] o CLEANUP: Now sum2_() uses only basic C types. 2014-11-02 [HB] o Created. **************************************************************************/ matrixStats/src/colRanges.c0000644000175100001440000000764013073627232015477 0ustar hornikusers/*************************************************************************** Public methods: SEXP colRanges(SEXP x, ...) Authors: Henrik Bengtsson. Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "colRanges_lowlevel.h" SEXP colRanges(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP what, SEXP naRm, SEXP hasNA) { SEXP ans = NILSXP, ans2 = NILSXP; int *mins, *maxs; double *mins2, *maxs2; int *is_counted, all_counted = 0; int what2, narm, hasna; R_xlen_t nrow, ncol, jj; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'what': */ if (length(what) != 1) error("Argument 'what' must be a single number."); if (!isNumeric(what)) error("Argument 'what' must be a numeric number."); what2 = asInteger(what); if (what2 < 0 || what2 > 2) error("Invalid value of 'what': %d", what2); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); is_counted = (int *) R_alloc(ncols, sizeof(int)); if (isReal(x)) { if (what2 == 2) { PROTECT(ans = allocMatrix(REALSXP, ncols, 2)); } else { PROTECT(ans = allocVector(REALSXP, ncols)); } colRanges_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, what2, narm, hasna, REAL(ans), is_counted); UNPROTECT(1); } else if (isInteger(x)) { if (what2 == 2) { PROTECT(ans = allocMatrix(INTSXP, ncols, 2)); } else { PROTECT(ans = allocVector(INTSXP, ncols)); } colRanges_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, what2, narm, hasna, INTEGER(ans), is_counted); /* Any entries with zero non-missing values? */ all_counted = 1; for (jj=0; jj < ncols; jj++) { if (!is_counted[jj]) { all_counted = 0; break; } } if (!all_counted) { /* Handle zero non-missing values */ /* Instead of return INTSXP, we must return REALSXP (to hold -Inf, and Inf) */ if (what2 == 0) { PROTECT(ans2 = allocVector(REALSXP, ncols)); mins = INTEGER(ans); mins2 = REAL(ans2); for (jj=0; jj < ncols; jj++) { if (is_counted[jj]) { mins2[jj] = (double)mins[jj]; } else { mins2[jj] = R_PosInf; } } UNPROTECT(1); /* ans2 */ } else if (what2 == 1) { PROTECT(ans2 = allocVector(REALSXP, ncols)); maxs = INTEGER(ans); maxs2 = REAL(ans2); for (jj=0; jj < ncols; jj++) { if (is_counted[jj]) { maxs2[jj] = (double)maxs[jj]; } else { maxs2[jj] = R_NegInf; } } UNPROTECT(1); /* ans2 */ } else if (what2 == 2) { PROTECT(ans2 = allocMatrix(REALSXP, ncols, 2)); mins = INTEGER(ans); maxs = &INTEGER(ans)[ncols]; mins2 = REAL(ans2); maxs2 = &REAL(ans2)[ncols]; for (jj=0; jj < ncols; jj++) { if (is_counted[jj]) { mins2[jj] = (double)mins[jj]; maxs2[jj] = (double)maxs[jj]; } else { mins2[jj] = R_PosInf; maxs2[jj] = R_NegInf; } } UNPROTECT(1); /* ans2 */ } ans = ans2; } UNPROTECT(1); /* ans */ } return(ans); } // colRanges() /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-16 [HB] o Created. **************************************************************************/ matrixStats/src/weightedMean_lowlevel.h0000644000175100001440000000207413073627232020075 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): double weightedMean_int_aidxs(int *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int refine) double weightedMean_int_iidxs(int *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int refine) double weightedMean_int_didxs(int *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int refine) double weightedMean_dbl_aidxs(double *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int refine) double weightedMean_dbl_iidxs(double *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int refine) double weightedMean_dbl_didxs(double *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int refine) */ #define METHOD weightedMean #define RETURN_TYPE double #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int refine #define X_TYPE 'i' #include "000.templates-gen-vector.h" #define X_TYPE 'r' #include "000.templates-gen-vector.h" matrixStats/src/rowRanksWithTies_lowlevel.h0000644000175100001440000002456613073627232020775 0ustar hornikusers#include #include "000.utils.h" /* Native API (dynamically generated via macros): void rowRanksWithTies_Min_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Min_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Max_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int *ans) void rowRanksWithTies_Average_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) void rowRanksWithTies_Average_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double *ans) */ #define METHOD_TEMPLATE_H "rowRanksWithTies_lowlevel_template.h" #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, ANS_C_TYPE *ans /***************************************************************** * ties.method = "min" *****************************************************************/ #define TIESMETHOD '0' /* min */ #define METHOD rowRanksWithTies_Min #define MARGIN 'r' #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #define MARGIN 'r' #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #undef METHOD #define METHOD colRanksWithTies_Min #define MARGIN 'c' #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #define MARGIN 'c' #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #undef METHOD #undef TIESMETHOD /***************************************************************** * ties.method = "max" *****************************************************************/ #define TIESMETHOD '1' /* max */ #define METHOD rowRanksWithTies_Max #define MARGIN 'r' #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #define MARGIN 'r' #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #undef METHOD #define METHOD colRanksWithTies_Max #define MARGIN 'c' #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #define MARGIN 'c' #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #undef METHOD #undef TIESMETHOD /***************************************************************** * ties.method = "average" *****************************************************************/ #define TIESMETHOD 'a' /* average */ #define METHOD rowRanksWithTies_Average #define MARGIN 'r' #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #define MARGIN 'r' #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #undef METHOD #define METHOD colRanksWithTies_Average #define MARGIN 'c' #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #define MARGIN 'c' #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #undef METHOD #undef TIESMETHOD matrixStats/src/000.macros.h0000644000175100001440000000050013073627232015335 0ustar hornikusers#ifndef _MACROS_H_ #define _MACROS_H_ #define CONCAT(x,y) x ##_## y #define CONCAT_MACROS(x,y) CONCAT(x,y) #define QUOTE(str) #str #define QUOTE_MACROS(str) QUOTE(str) #ifndef METHOD_TEMPLATE_H #define METHOD_TEMPLATE_H QUOTE_MACROS(CONCAT_MACROS(METHOD,lowlevel_template.h)) #endif #endif /* END OF _MACROS_H_ */ matrixStats/src/rowMedians_lowlevel_template.h0000644000175100001440000001361013073627232021475 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowMedians_[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int narm, int hasna, int byrow, double *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD: the name of the resulting function - X_TYPE: 'i' or 'r' Authors: Adopted from rowQuantiles.c by R. Gentleman. Template by Henrik Bengtsson. Copyright: Henrik Bengtsson, 2007-2013 ***********************************************************************/ #include #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { int isOdd; R_xlen_t ii, jj, kk, qq, idx; R_xlen_t *colOffset; X_C_TYPE *values, value; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif /* R allocate memory for the 'values'. This will be taken care of by the R garbage collector later on. */ values = (X_C_TYPE *) R_alloc(ncols, sizeof(X_C_TYPE)); /* If there are no missing values, don't try to remove them. */ if (hasna == FALSE) narm = FALSE; /* When narm == FALSE, isOdd and qq are the same for all rows */ if (narm == FALSE) { isOdd = (ncols % 2 == 1); qq = (R_xlen_t)(ncols/2) - 1; } else { isOdd = FALSE; qq = 0; } value = 0; /* Pre-calculate the column offsets */ colOffset = (R_xlen_t *) R_alloc(ncols, sizeof(R_xlen_t)); // HJ begin if (byrow) { for (jj=0; jj < ncols; jj++) colOffset[jj] = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); } else { for (jj=0; jj < ncols; jj++) colOffset[jj] = COL_INDEX(ccols,jj); } // HJ end if (hasna == TRUE) { for (ii=0; ii < nrows; ii++) { R_xlen_t rowIdx = byrow ? ROW_INDEX(crows,ii) : R_INDEX_OP(ROW_INDEX(crows,ii), *, ncol); //HJ kk = 0; /* The index of the last non-NA value detected */ for (jj=0; jj < ncols; jj++) { idx = R_INDEX_OP(rowIdx, +, colOffset[jj]); value = R_INDEX_GET(x, idx, X_NA); //HJ if (X_ISNAN(value)) { if (narm == FALSE) { kk = -1; break; } } else { values[kk] = value; kk = kk + 1; } } /* Note that 'values' will never contain NA/NaNs */ if (kk == 0) { ans[ii] = R_NaN; } else if (kk == -1) { ans[ii] = R_NaReal; } else { /* When narm == TRUE, isOdd and qq may change with row */ if (narm == TRUE) { isOdd = (kk % 2 == 1); qq = (R_xlen_t)(kk/2) - 1; } /* Permute x[0:kk-1] so that x[qq] is in the correct place with smaller values to the left, ... */ X_PSORT(values, kk, qq+1); value = values[qq+1]; if (isOdd == TRUE) { ans[ii] = (double)value; } else { /* Permute x[0:qq-2] so that x[qq-1] is in the correct place with smaller values to the left, ... */ X_PSORT(values, qq+1, qq); ans[ii] = ((double)values[qq] + (double)value)/2; } } R_CHECK_USER_INTERRUPT(ii); } /* for (ii ...) */ } else { for (ii=0; ii < nrows; ii++) { R_xlen_t rowIdx = byrow ? ROW_INDEX_NONA(crows,ii) : ROW_INDEX_NONA(crows,ii) * ncol; //HJ for (jj=0; jj < ncols; jj++) values[jj] = x[rowIdx+colOffset[jj]]; //HJ /* Permute x[0:ncols-1] so that x[qq] is in the correct place with smaller values to the left, ... */ X_PSORT(values, ncols, qq+1); value = values[qq+1]; if (isOdd == TRUE) { ans[ii] = (double)value; } else { /* Permute x[0:qq-2] so that x[qq-1] is in the correct place with smaller values to the left, ... */ X_PSORT(values, qq+1, qq); ans[ii] = ((double)values[qq] + (double)value)/2; } R_CHECK_USER_INTERRUPT(ii); } /* for (ii ...) */ } /* if (hasna ...) */ } /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-06 [HB] o CLEANUP: Moving away from R data types in low-level C functions. 2014-11-01 [HB] o SPEEDUP: Now using 'ansp = REAL(ans)' once and then assigning to 'ansp' instead of to 'REAL(ans)'. 2013-04-23 [HB] o BUG FIX: The integer template of rowMedians_() would not handle ties properly. This was because ties were calculated as '(double)((rowData[qq] + value)/2)' instead of '((double)(rowData[qq] + value))/2'. 2013-01-13 [HB] o Merged rowMedians_int() and rowMedians_dbl() into template rowMedians_(). 2013-01-13 [HB] o Using internal arguments 'by_row' instead of 'by_column'. 2011-12-11 [HB] o BUG FIX: rowMediansReal(..., na.rm=TRUE) did not handle NaN:s, only NA:s. Note that NaN:s does not exist for integers. 2011-10-12 [HJ] o Added colMedians(). o Now rowMediansInteger/Real() can operate also by columns, cf. argument 'by_column'. 2007-08-14 [HB] o Added checks for user interrupts every 1000 line. o Added argument 'hasNA' to rowMedians(). 2005-12-07 [HB] o BUG FIX: When calculating the median of an even number (non-NA) values, the length of the second sort was one element too short, which made the method to freeze, i.e. rPsort(rowData, qq, qq) is now (...qq+1, qq). 2005-11-24 [HB] o By implementing a special version for integers, there is no need to coerce to double in R, which would take up twice the amount of memory. o rowMedians() now handles NAs too. o Adopted from rowQuantiles.c in Biobase of Bioconductor. **************************************************************************/ matrixStats/src/000.init.c0000644000175100001440000000237513073627232015023 0ustar hornikusers#include #include #include "000.api.h" #define CALLDEF(name, n) {#name, (DL_FUNC) &name, n} static R_CallMethodDef callMethods[] = { CALLDEF(allocArray2, 2), CALLDEF(allocMatrix2, 3), CALLDEF(allocVector2, 2), CALLDEF(anyMissing, 2), CALLDEF(binCounts, 3), CALLDEF(binMeans, 5), CALLDEF(colCounts, 8), CALLDEF(colOrderStats, 5), CALLDEF(colRanges, 7), CALLDEF(count, 6), CALLDEF(diff2, 4), CALLDEF(indexByRow, 2), CALLDEF(logSumExp, 4), CALLDEF(mean2, 4), CALLDEF(productExpSumLog, 4), CALLDEF(psortKM, 3), CALLDEF(rowCounts, 8), CALLDEF(rowCummaxs, 5), CALLDEF(rowCummins, 5), CALLDEF(rowCumprods, 5), CALLDEF(rowCumsums, 5), CALLDEF(rowDiffs, 7), CALLDEF(rowLogSumExps, 7), CALLDEF(rowMads, 8), CALLDEF(rowMeans2, 7), CALLDEF(rowMedians, 7), CALLDEF(rowOrderStats, 5), CALLDEF(rowRanges, 7), CALLDEF(rowRanksWithTies, 6), CALLDEF(rowSums2, 7), CALLDEF(rowVars, 7), CALLDEF(signTabulate, 2), CALLDEF(sum2, 4), CALLDEF(validate, 3), CALLDEF(weightedMean, 5), CALLDEF(weightedMedian, 6), CALLDEF(x_OP_y, 11), {NULL, NULL, 0} }; void R_init_matrixStats(DllInfo *info) { R_registerRoutines(info, NULL, callMethods, NULL, NULL); R_useDynamicSymbols(info, FALSE); } matrixStats/src/signTabulate.c0000644000175100001440000000237413073627232016203 0ustar hornikusers/*************************************************************************** Public methods: SEXP signTabulate(SEXP x, SEXP idxs) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "signTabulate_lowlevel.h" SEXP signTabulate(SEXP x, SEXP idxs) { SEXP ans = NILSXP; R_xlen_t nx; /* Argument 'x': */ assertArgVector(x, (R_TYPE_INT | R_TYPE_REAL), "x"); nx = xlength(x); /* Argument 'idxs': */ R_xlen_t nidxs; int idxsType; void *cidxs = validateIndices(idxs, nx, 1, &nidxs, &idxsType); /* Double matrices are more common to use. */ if (isReal(x)) { PROTECT(ans = allocVector(REALSXP, 6)); signTabulate_dbl[idxsType](REAL(x), nx, cidxs, nidxs, REAL(ans)); UNPROTECT(1); } else if (isInteger(x)) { PROTECT(ans = allocVector(REALSXP, 4)); signTabulate_int[idxsType](INTEGER(x), nx, cidxs, nidxs, REAL(ans)); UNPROTECT(1); } return(ans); } // signTabulate() /*************************************************************************** HISTORY: 2015-07-04 [DJ] o Supported subsetted computation. 2014-06-04 [HB] o Created. **************************************************************************/ matrixStats/src/binCounts.c0000644000175100001440000000344313073627232015523 0ustar hornikusers/*************************************************************************** Public methods: binCounts(SEXP x, SEXP bx, SEXP right) Copyright Henrik Bengtsson, 2012-2013 **************************************************************************/ #include #include "000.types.h" #include #include "binCounts_lowlevel.h" SEXP binCounts(SEXP x, SEXP bx, SEXP right) { SEXP counts = NILSXP; R_xlen_t nbins; int closedRight; /* Argument 'x': */ assertArgVector(x, (R_TYPE_REAL), "x"); /* Argument 'bx': */ assertArgVector(bx, (R_TYPE_REAL), "bx"); nbins = xlength(bx)-1; if (nbins <= 0) { error("Argument 'bx' must specify at least two bin boundaries (= one bin): %d", xlength(bx)); } /* Argument 'right': */ closedRight = asLogicalNoNA(right, "right"); PROTECT(counts = allocVector(INTSXP, nbins)); if (closedRight) { binCounts_R(REAL(x), xlength(x), REAL(bx), nbins, INTEGER(counts)); } else { binCounts_L(REAL(x), xlength(x), REAL(bx), nbins, INTEGER(counts)); } UNPROTECT(1); return(counts); } // binCounts() /*************************************************************************** HISTORY: 2015-05-30 [HB] o Added protected against 'bx' too short. 2014-06-03 [HB] o Dropped unused variable 'count'. 2013-10-08 [HB] o Now binCounts() calls binCounts_(). 2013-05-10 [HB] o SPEEDUP: binCounts() no longer tests in every iteration (=for every data point) whether the last bin has been reached or not. 2012-10-10 [HB] o BUG FIX: binCounts() would return random/garbage counts for bins that were beyond the last data point. o BUG FIX: In some cases binCounts() could try to go past the last bin. 2012-10-03 [HB] o Created. **************************************************************************/ matrixStats/src/rowCumprods.c0000644000175100001440000000320713073627232016101 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowCumprods(SEXP x, ...) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "rowCumprods_lowlevel.h" SEXP rowCumprods(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP byRow) { int byrow; SEXP ans = NILSXP; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); /* Double matrices are more common to use. */ if (isReal(x)) { PROTECT(ans = allocMatrix(REALSXP, nrows, ncols)); rowCumprods_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, REAL(ans)); UNPROTECT(1); } else if (isInteger(x)) { PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); rowCumprods_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, INTEGER(ans)); UNPROTECT(1); } return(ans); } /* rowCumprods() */ /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-26 [HB] o Created from rowVars.c. **************************************************************************/ matrixStats/src/weightedMedian_lowlevel_template.h0000644000175100001440000002102713073627232022304 0ustar hornikusers/*********************************************************************** TEMPLATE: double weightedMedian_[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nx, double *w, void *idxs, R_xlen_t nidxs, int narm, int interpolate, int ties Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" #include RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { X_C_TYPE value; X_C_TYPE *xtmp; double weight, res; double dx, dy, Dy; double *wtmp, *wcum, wtotal, wlow, whigh, tmp_d, tmp_d2; R_xlen_t nxt, ii, jj, half; int *idxs_int; int equalweights = 0; #ifdef IDXS_TYPE IDXS_C_TYPE *cidxs = (IDXS_C_TYPE*) idxs; #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Weights */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ wtmp = Calloc(nidxs, double); /* Check for missing, negative, and infite weights */ nxt = 0; for (ii=0; ii < nidxs; ii++) { /* Assume negative or missing weight by default or that the signals is missing and should be dropped */ wtmp[ii] = 0; weight = R_INDEX_GET(w, IDX_INDEX(cidxs,ii), NA_REAL); if (ISNAN(weight)) { if (!narm) { Free(wtmp); return NA_REAL; } } else if (weight <= 0) { /* Drop non-positive weights */ } else if (isinf(weight)) { /* Detected a +Inf. From now on, treat all +Inf weights equal and drop everything else */ nxt = 0; for (jj=0; jj < nidxs; jj++) { /* Assume non-infinite weight by default */ wtmp[jj] = 0; weight = R_INDEX_GET(w, IDX_INDEX(cidxs,jj), NA_REAL); if (isinf(weight)) { value = R_INDEX_GET(x, IDX_INDEX(cidxs,jj), X_NA); if (X_ISNAN(value)) { if (!narm) { Free(wtmp); return NA_REAL; } } else { /* Infinite weight, i.e. use data point */ wtmp[jj] = 1; nxt++; } } else if (ISNAN(weight)) { if (!narm) { Free(wtmp); return NA_REAL; } } } equalweights = 1; break; } else { /* A data points with a finite positive weight */ value = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), X_NA); if (X_ISNAN(value)) { if (!narm) { Free(wtmp); return NA_REAL; } } else { /* A data point with a non-missing value */ wtmp[ii] = weight; nxt++; } } } /* printf("nx=%d, nxt=%d\n", nx, nxt); for (ii=0; ii < nx; ii++) printf("w[%d]=%g, wtmp[%d]=%g\n", (int)ii, (double)w[ii], (int)ii, wtmp[ii]); */ /* Nothing to do? */ if (nxt == 0) { Free(wtmp); return NA_REAL; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Copy (x,w) to work with and calculate total weight */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ xtmp = Calloc(nxt, X_C_TYPE); jj = 0; wtotal = 0; for (ii=0; ii < nidxs; ii++) { if (wtmp[ii] > 0) { /* printf("ii=%d, jj=%d, wtmp[%d]=%g\n", (int)ii, (int)jj, (int)ii, wtmp[ii]); */ xtmp[jj] = x[IDX_INDEX(cidxs,ii)]; // sure that xvalue is not NA wtmp[jj] = wtmp[ii]; wtotal += wtmp[jj]; jj++; } } x = xtmp; w = wtmp; nx = nxt; /* for (ii=0; ii < nx; ii++) printf("x[%d]=%g, w[%d]=%g\n", (int)ii, (double)x[ii], (int)ii, w[ii]); */ /* Early stopping? */ if (nx == 1) { res = (double)x[0]; Free(xtmp); Free(wtmp); return res; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* All weights equal? Happens if +Inf were detected. */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ if (equalweights) { half = (nx+1) / 2; /* printf("half=%d\n", (int)half); */ X_PSORT(x, nx, half); /* for (ii=0; ii < nx; ii++) printf("x[%d]=%g\n", (int)ii, (double)x[ii]); */ /* FIXME: Add support for ties here too */ if (nx % 2 == 1) { res = (double)x[half-1]; } else { X_PSORT(x, half, half-1); res = ((double)x[half-1] + (double)x[half]) / 2; } Free(xtmp); Free(wtmp); return res; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Sort x and calculated the cumulative sum of weights (normalize to */ /* one) according to the reordered vector. */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* (a) Sort x */ idxs_int = Calloc(nx, int); for (ii = 0; ii < nx; ii++) idxs_int[ii] = ii; X_QSORT_I(x, idxs_int, 1, nx); /* (b) Normalized cumulative weights */ wcum = Calloc(nx, double); tmp_d2 = 0; /* Index where cumulative weight passed 1/2 */ half = nx+1; /* Default is last */ if (interpolate) { /* Adjust */ for (ii = 0; ii < nx; ii++) { tmp_d = w[idxs_int[ii]] / wtotal; tmp_d2 += tmp_d; wcum[ii] = tmp_d2 - (tmp_d/2); if (wcum[ii] >= 0.5) { half = ii; /* Early stopping - no need to continue */ break; } } } else { for (ii = 0; ii < nx; ii++) { tmp_d2 += w[idxs_int[ii]] / wtotal; wcum[ii] = tmp_d2; if (tmp_d2 > 0.5) { half = ii; /* Early stopping - no need to continue */ break; } } } Free(wtmp); Free(idxs_int); /* Two special cases where more than half of the total weight is at a) the first, or b) the last value */ if (half == 0 || half == nx) { res = (double)x[half]; Free(wcum); Free(xtmp); return res; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Alt 1: Linearly interpolated weighted median */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ if (interpolate) { /* The width and the height of the "rectangle". */ dx = (double)(x[half] - x[half-1]); Dy = wcum[half] - wcum[half-1]; /* printf("dx=%g, Dy=%g\n", dx, Dy); */ /* The width and the height of the triangle which upper corner touches the level where the cumulative sum of weights *equals* half the total weight. */ dy = 0.5 - wcum[half]; dx = (dy/Dy) * dx; /* printf("dx=%g, dy=%g\n", dx, dy); */ /* The corresponding x value */ res = dx + x[half]; Free(wcum); Free(xtmp); return res; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Alt 2: Classical weighted median (tied or not) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* At this point we know that: 1) at most half the total weight is in the set x[1:half], 2) that the set x[(half+2):n] contains less than half the total weight The question is whether x[(half+1):n] contains *more* than half the total weight (try x=c(1,2,3), w=c(1,1,1)). If it is then we can be sure that x[half+1] is the weighted median we are looking for, otherwise it is any function of x[k:(half+1)]. */ wlow = wcum[half-1]; whigh = 1 - wlow; /* printf("half=%d, wtotal=%g, wlow=%g, whigh=%g, ties=%d\n", half, (double)wtotal, (double)wlow, (double)whigh, ties); printf("x[half+(-1:1)]=c(%g, %g, %g)\n", x[half-1-1], x[half-1], x[half-1+1]); */ if (whigh > 0.5) { /* printf("matrixStats2: Not a tie!\n"); */ /* Not a tie */ res = x[half]; } else { /* printf("matrixStats2: A tie!\n"); */ /* A tie! */ if (ties == 1) { /* weighted */ /* printf("ties=%d, half=%d, wlow*x[half]=%g, whigh*x[half+1]=%g\n", ties, half, wlow*x[half-1], whigh*x[half]); */ res = wlow*(double)x[half-1] + whigh*(double)x[half]; } else if (ties == 2) { /* min */ res = (double)x[half-1]; } else if (ties == 4) { /* max */ res = (double)x[half]; } else if (ties == 8) { /* mean */ res = ((double)x[half-1] + (double)x[half]) / 2; } else { error("Unknown value of argument 'ties': %d", ties); } } Free(wcum); Free(xtmp); return res; } /*************************************************************************** HISTORY: 2015-07-09 [DJ] o Supported subsetted computation. 2015-01-01 [HB] o Created. **************************************************************************/ matrixStats/src/rowRanges_lowlevel_template.h0000644000175100001440000001503413073627232021336 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowRanges_[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int what, int narm, int hasna, X_C_TYPE *ans, int *is_counted Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' - ANS_TYPE: 'i' or 'r' Authors: Henrik Bengtsson. Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) ANS_TYPE => (ANS_SXP, ANS_NA, ANS_C_TYPE, ANS_IN_C) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj; R_xlen_t colBegin, idx; X_C_TYPE value, *mins = NULL, *maxs = NULL; int *skip = NULL; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif /* Rprintf("(nrow,ncol)=(%d,%d), what=%d\n", nrow, ncol, what); */ /* If there are no missing values, don't try to remove them. */ if (hasna == FALSE) narm = FALSE; if (hasna) { skip = (int *) R_alloc(nrows, sizeof(int)); for (ii=0; ii < nrows; ii++) { is_counted[ii] = 0; skip[ii] = 0; } /* Missing values */ if (what == 0) { /* rowMins() */ mins = ans; for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { if (!narm && skip[ii]) continue; idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); value = R_INDEX_GET(x, idx, X_NA); if (X_ISNAN(value)) { if (!narm) { mins[ii] = value; is_counted[ii] = 1; /* Early stopping? */ #if X_TYPE == 'i' skip[ii] = 1; #elif X_TYPE == 'r' if (X_ISNA(value)) skip[ii] = 1; #endif } } else if (!is_counted[ii]) { mins[ii] = value; is_counted[ii] = 1; } else if (value < mins[ii]) { mins[ii] = value; } } } /* for (jj ...) */ #if X_TYPE == 'r' /* Handle zero non-missing values */ for (ii=0; ii < nrows; ii++) { if (!is_counted[ii]) { mins[ii] = R_PosInf; } } #endif } else if (what == 1) { /* rowMaxs() */ maxs = ans; for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { if (!narm && skip[ii]) continue; idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); value = R_INDEX_GET(x, idx, X_NA); if (X_ISNAN(value)) { if (!narm) { maxs[ii] = value; is_counted[ii] = 1; /* Early stopping? */ #if X_TYPE == 'i' skip[ii] = 1; #elif X_TYPE == 'r' if (X_ISNA(value)) skip[ii] = 1; #endif } } else if (!is_counted[ii]) { maxs[ii] = value; is_counted[ii] = 1; } else if (value > maxs[ii]) { maxs[ii] = value; } } } /* for (jj ...) */ #if X_TYPE == 'r' /* Handle zero non-missing values */ for (ii=0; ii < nrows; ii++) { if (!is_counted[ii]) { maxs[ii] = R_NegInf; } } #endif } else if (what == 2) { /* rowRanges() */ mins = ans; maxs = &ans[nrows]; for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { if (!narm && skip[ii]) continue; idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); value = R_INDEX_GET(x, idx, X_NA); if (X_ISNAN(value)) { if (!narm) { mins[ii] = value; maxs[ii] = value; is_counted[ii] = 1; /* Early stopping? */ #if X_TYPE == 'i' skip[ii] = 1; #elif X_TYPE == 'r' if (X_ISNA(value)) skip[ii] = 1; #endif } } else if (!is_counted[ii]) { mins[ii] = value; maxs[ii] = value; is_counted[ii] = 1; } else if (value < mins[ii]) { mins[ii] = value; } else if (value > maxs[ii]) { maxs[ii] = value; } } } /* for (jj ...) */ #if X_TYPE == 'r' /* Handle zero non-missing values */ for (ii=0; ii < nrows; ii++) { if (!is_counted[ii]) { mins[ii] = R_PosInf; maxs[ii] = R_NegInf; } } #endif } /* if (what ...) */ } else { /* No missing values */ if (what == 0) { /* rowMins() */ mins = ans; /* Initiate results */ for (ii=0; ii < nrows; ii++) { mins[ii] = x[ii]; } for (jj=1; jj < ncols; jj++) { colBegin = COL_INDEX_NONA(ccols,jj) * nrow; for (ii=0; ii < nrows; ii++) { value = x[ROW_INDEX_NONA(crows,ii)+colBegin]; if (value < mins[ii]) mins[ii] = value; } } } else if (what == 1) { /* rowMax() */ maxs = ans; /* Initiate results */ for (ii=0; ii < nrows; ii++) { maxs[ii] = x[ii]; } for (jj=1; jj < ncols; jj++) { colBegin = COL_INDEX_NONA(ccols,jj) * nrow; for (ii=0; ii < nrows; ii++) { value = x[ROW_INDEX_NONA(crows,ii)+colBegin]; if (value > maxs[ii]) maxs[ii] = value; } } } else if (what == 2) { /* rowRanges()*/ mins = ans; maxs = &ans[nrows]; /* Initiate results */ for (ii=0; ii < nrows; ii++) { mins[ii] = x[ii]; maxs[ii] = x[ii]; } for (jj=1; jj < ncols; jj++) { colBegin = COL_INDEX_NONA(ccols,jj) * nrow; for (ii=0; ii < nrows; ii++) { value = x[ROW_INDEX_NONA(crows,ii)+colBegin]; if (value < mins[ii]) { mins[ii] = value; } else if (value > maxs[ii]) { maxs[ii] = value; } } } } /* if (what ...) */ } /* if (narm) */ } /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-16 [HB] o Created. **************************************************************************/ matrixStats/src/diff2.c0000644000175100001440000000345313073627232014552 0ustar hornikusers/*************************************************************************** Public methods: SEXP diff2(SEXP x, SEXP idxs, SEXP lag, SEXP differences) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include #include "000.types.h" #include "diff2_lowlevel.h" SEXP diff2(SEXP x, SEXP idxs, SEXP lag, SEXP differences) { SEXP ans = NILSXP; R_xlen_t nx, nans, lagg, diff; /* Argument 'x': */ assertArgVector(x, (R_TYPE_INT | R_TYPE_REAL), "x"); nx = xlength(x); /* Argument 'lag': */ lagg = asInteger(lag); if (lagg < 1) { error("Argument 'lag' must be a positive integer."); } /* Argument 'differences': */ diff = asInteger(differences); if (diff < 1) { error("Argument 'differences' must be a positive integer."); } /* Argument 'idxs': */ R_xlen_t nidxs; int idxsType; void *cidxs = validateIndices(idxs, nx, 1, &nidxs, &idxsType); /* Length of result vector */ nans = (R_xlen_t)((double)nidxs - ((double)diff*(double)lagg)); if (nans < 0) nans = 0; /* Dispatch to low-level C function */ if (isReal(x)) { PROTECT(ans = allocVector(REALSXP, nans)); diff2_dbl[idxsType](REAL(x), nx, cidxs, nidxs, lagg, diff, REAL(ans), nans); UNPROTECT(1); } else if (isInteger(x)) { PROTECT(ans = allocVector(INTSXP, nans)); diff2_int[idxsType](INTEGER(x), nx, cidxs, nidxs, lagg, diff, INTEGER(ans), nans); UNPROTECT(1); } else { error("Argument 'x' must be numeric."); } return ans; } // diff2() /*************************************************************************** HISTORY: 2015-06-14 [DJ] o Supported subsetted computation. 2014-12-29 [HB] o Created. **************************************************************************/ matrixStats/src/colCounts_lowlevel_template.h0000644000175100001440000001244313073627232021341 0ustar hornikusers/*********************************************************************** TEMPLATE: void colCounts_[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, X_C_TYPE value, int what, int narm, int hasna, int *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i', 'r', or 'l' Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj; R_xlen_t colBegin, idx; int count; X_C_TYPE xvalue; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif if (what == 0L) { /* all */ /* Count missing values? [sic!] */ if (X_ISNAN(value)) { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); count = 1; for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); if (!X_ISNAN(R_INDEX_GET(x, idx, X_NA))) { count = 0; /* Found another value! Early stopping */ break; } } ans[jj] = count; } } else { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); count = 1; for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); if (xvalue == value) { } else if (narm && X_ISNAN(xvalue)) { /* Skip */ } else if (!narm && X_ISNAN(xvalue)) { /* Early stopping is not possible, because if we do find an element that is not 'value' later, then we know for sure that all = FALSE regardless of missing values. In other words, at this point the answer can be either NA or FALSE.*/ count = NA_INTEGER; } else { count = 0; /* Found another value! Early stopping */ break; } } /* for (ii ...) */ ans[jj] = count; } /* for (jj ...) */ } /* if (X_ISNAN(value)) */ } else if (what == 1L) { /* any */ /* Count missing values? [sic!] */ if (X_ISNAN(value)) { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); count = 0; for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); if (X_ISNAN(R_INDEX_GET(x, idx, X_NA))) { count = 1; /* Found value! Early stopping */ break; } } ans[jj] = count; } } else { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); count = 0; for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); if (xvalue == value) { count = 1; /* Found value! Early stopping */ break; } else if (narm && X_ISNAN(xvalue)) { /* Skipping */ } else if (!narm && X_ISNAN(xvalue)) { /* Early stopping is not possible, because if we do find an element that is 'value' later, then we know for sure that any = TRUE regardless of missing values. In other words, at this point the answer can be either NA or TRUE.*/ count = NA_INTEGER; } } /* for (ii ...) */ ans[jj] = count; } /* for (jj ...) */ } /* if (X_ISNAN(value)) */ } else if (what == 2L) { /* count */ /* Count missing values? [sic!] */ if (X_ISNAN(value)) { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); count = 0; for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); if (X_ISNAN(R_INDEX_GET(x, idx, X_NA))) { ++count; } } ans[jj] = count; } } else { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); count = 0; for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); if (xvalue == value) { ++count; } else if (!narm && X_ISNAN(xvalue)) { count = NA_INTEGER; /* Early stopping */ break; } } /* for (ii ...) */ ans[jj] = count; } /* for (jj ...) */ } /* if (X_ISNAN(value)) */ } /* if (what) */ } /*************************************************************************** HISTORY: 2015-04-18 [DJ] o Supported subsetted computation. 2014-11-14 [HB] o Created colCounts() templates from rowCounts() templates. **************************************************************************/ matrixStats/src/mean2_lowlevel.h0000644000175100001440000000167613073627232016505 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): double mean2_int_aidxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int refine) double mean2_int_iidxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int refine) double mean2_int_didxs(int *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int refine) double mean2_dbl_aidxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int refine) double mean2_dbl_iidxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int refine) double mean2_dbl_didxs(double *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int refine) */ #define METHOD mean2 #define RETURN_TYPE double #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, int narm, int refine #define X_TYPE 'i' #include "000.templates-gen-vector.h" #define X_TYPE 'r' #include "000.templates-gen-vector.h" matrixStats/src/rowCounts_lowlevel_template.h0000644000175100001440000001334613073627232021376 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowCounts_[ROWS_TYPE][COLS_TYPE](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, X_C_TYPE value, int what, int narm, int hasna, int *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i', 'r', or 'l' Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj; R_xlen_t colBegin, idx; int count; X_C_TYPE xvalue; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif if (what == 0) { /* all */ for (ii=0; ii < nrows; ii++) ans[ii] = 1; /* Count missing values? [sic!] */ if (X_ISNAN(value)) { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { /* Skip? */ if (ans[ii]) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); if (!X_ISNAN(xvalue)) { ans[ii] = 0; /* Found another value! Skip from now on */ } } } } } else { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { /* Skip? */ if (ans[ii]) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); if (xvalue == value) { } else if (narm && X_ISNAN(xvalue)) { /* Skip */ } else if (!narm && X_ISNAN(xvalue)) { /* Early stopping is not possible, because if we do find an element that is not 'value' later, then we know for sure that all = FALSE regardless of missing values. In other words, at this point the answer can be either NA or FALSE.*/ ans[ii] = NA_INTEGER; } else { /* Found another value! Skip from now on */ ans[ii] = 0; } } } /* for (ii ...) */ } /* for (jj ...) */ } } else if (what == 1) { /* any */ for (ii=0; ii < nrows; ii++) ans[ii] = 0; /* Count missing values? [sic!] */ if (X_ISNAN(value)) { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { /* Skip? */ if (!ans[ii]) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); if (X_ISNAN(xvalue)) { ans[ii] = 1; /* Found value! Skip from now on */ } } } } } else { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { /* Skip? */ if (ans[ii] == 0 || ans[ii] == NA_INTEGER) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); if (xvalue == value) { /* Found value! Skip from now on */ ans[ii] = 1; } else if (narm && X_ISNAN(xvalue)) { /* Skip */ } else if (!narm && X_ISNAN(xvalue)) { /* Early stopping is not possible, because if we do find an element that is 'value' later, then we know for sure that any = TRUE regardless of missing values. In other words, at this point the answer can be either NA or TRUE.*/ ans[ii] = NA_INTEGER; } } } /* for (ii ...) */ } /* for (jj ...) */ } } else if (what == 2) { /* count */ for (ii=0; ii < nrows; ii++) ans[ii] = 0; /* Count missing values? [sic!] */ if (X_ISNAN(value)) { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); if (X_ISNAN(xvalue)) ans[ii] = ans[ii] + 1; } } } else { for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { count = ans[ii]; /* Nothing more to do on this row? */ if (count == NA_INTEGER) continue; idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); if (xvalue == value) { ans[ii] = count + 1; } else { if (!narm && X_ISNAN(xvalue)) { ans[ii] = NA_INTEGER; continue; } } } /* for (ii ...) */ } /* for (jj ...) */ } } /* if (what) */ } /*************************************************************************** HISTORY: 2015-04-13 [DJ] o Supported subsetted computation. 2014-11-06 [HB] o CLEANUP: Moving away from R data types in low-level C functions. 2014-11-01 [HB] o SPEEDUP: Now using ansp = INTEGER(ans) once and then querying/assigning 'ansp[i]' instead of INTEGER(ans)[i]. 2014-06-02 [HB] o Created. **************************************************************************/ matrixStats/src/rowRanksWithTies.c0000644000175100001440000001153713073627232017051 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowRanksWithTies(SEXP x, SEXP rows, SEXP cols, SEXP tiesMethod, SEXP byRow) Authors: Hector Corrada Bravo, Peter Langfelder and Henrik Bengtsson TO DO: Add support for missing values. **************************************************************************/ #include #include "rowRanksWithTies_lowlevel.h" /* Peter Langfelder's modifications: * byrow: 0 => rank columns, !0 => rank rows * tiesMethod: 1: maximum, 2: average, 3:minimum * The returned rank is a REAL matrix to accomodate average ranks */ SEXP rowRanksWithTies(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP tiesMethod, SEXP byRow) { int tiesmethod, byrow; SEXP ans = NILSXP; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'tiesMethod': */ tiesmethod = asInteger(tiesMethod); if (tiesmethod < 1 || tiesmethod > 3) { error("Argument 'tiesMethod' is out of range [1,3]: %d", tiesmethod); } /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); /* Double matrices are more common to use. */ if (isReal(x)) { if (byrow) { switch (tiesmethod) { case 1: PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); rowRanksWithTies_Max_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, INTEGER(ans)); UNPROTECT(1); break; case 2: PROTECT(ans = allocMatrix(REALSXP, nrows, ncols)); rowRanksWithTies_Average_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, REAL(ans)); UNPROTECT(1); break; case 3: PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); rowRanksWithTies_Min_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, INTEGER(ans)); UNPROTECT(1); break; } /* switch */ } else { switch (tiesmethod) { case 1: PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); colRanksWithTies_Max_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, INTEGER(ans)); UNPROTECT(1); break; case 2: PROTECT(ans = allocMatrix(REALSXP, nrows, ncols)); colRanksWithTies_Average_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, REAL(ans)); UNPROTECT(1); break; case 3: PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); colRanksWithTies_Min_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, INTEGER(ans)); UNPROTECT(1); break; } /* switch */ } } else if (isInteger(x)) { if (byrow) { switch (tiesmethod) { case 1: PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); rowRanksWithTies_Max_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, INTEGER(ans)); UNPROTECT(1); break; case 2: PROTECT(ans = allocMatrix(REALSXP, nrows, ncols)); rowRanksWithTies_Average_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, REAL(ans)); UNPROTECT(1); break; case 3: PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); rowRanksWithTies_Min_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, INTEGER(ans)); UNPROTECT(1); break; } /* switch */ } else { switch (tiesmethod) { case 1: PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); colRanksWithTies_Max_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, INTEGER(ans)); UNPROTECT(1); break; case 2: PROTECT(ans = allocMatrix(REALSXP, nrows, ncols)); colRanksWithTies_Average_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, REAL(ans)); UNPROTECT(1); break; case 3: PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); colRanksWithTies_Min_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, INTEGER(ans)); UNPROTECT(1); break; } /* switch */ } } return(ans); } // rowRanksWithTies() /*************************************************************************** HISTORY: 2015-06-12 [DJ] o Supported subsetted computation. 2013-01-13 [HB] o Added argument 'tiesMethod' to rowRanks(). **************************************************************************/ matrixStats/src/logSumExp_lowlevel_template.h0000644000175100001440000001211113073627232021303 0ustar hornikusers/*********************************************************************** TEMPLATE: double logSumExp_double[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: double *x, void *idxs, R_xlen_t nidxs, int narm, int hasna, int by, double *xx ***********************************************************************/ #include #include #include "000.types.h" #include "000.templates-types.h" /* logSumExp_double(x, by=0, xx=NULL): 1. Scans for the maximum value of x=(x[0], x[1], ..., x[n-1]) 2. Computes result from 'x'. NOTE: The above sweeps the "contiguous" 'x' vector twice. --- logSumExp_double(x, by=by, xx=xx): 1. Scans for the maximum value of x=(x[0], x[by], ..., x[(n-1)*by]) and copies the values to xx = (xx[0], xx[1], xx[2], ..., xx[n-1]), which *must* be preallocated. 2. Computes result from 'xx'. NOTE: The above sweeps the "scattered" 'x' vector only once, and then the "contigous" 'xx' vector once. This is more likely to create cache hits. */ RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { R_xlen_t ii, iMax, idx; double xii, xMax; LDOUBLE sum; int hasna2 = FALSE; /* Indicates whether NAs where detected or not */ int xMaxIsNA; #ifdef IDXS_TYPE IDXS_C_TYPE *cidxs = (IDXS_C_TYPE*) idxs; #endif /* Quick return? */ if (nidxs == 0) { return(R_NegInf); } /* Find the maximum value */ iMax = 0; if (by) { idx = R_INDEX_OP(IDX_INDEX(cidxs,0), *, by); xMax = R_INDEX_GET(x, idx, NA_REAL); } else { xMax = R_INDEX_GET(x, IDX_INDEX(cidxs,0), NA_REAL); } xMaxIsNA = ISNAN(xMax); if (nidxs == 1) { if (narm && xMaxIsNA) { return(R_NegInf); } else { return(xMax); } } if (xMaxIsNA) hasna2 = TRUE; if (by) { /* To increase the chances for cache hits below, which sweeps through the data twice, we copy data into a temporary contigous vector while scanning for the maximum value. */ xx[0] = xMax; for (ii=1; ii < nidxs; ii++) { /* Get the ii:th value */ idx = R_INDEX_OP(IDX_INDEX(cidxs,ii), *, by); xii = R_INDEX_GET(x, idx, NA_REAL); /* Copy */ xx[ii] = xii; if (hasna && ISNAN(xii)) { if (narm) { hasna2 = TRUE; continue; } else { return(R_NaReal); } } if (xii > xMax || (narm && xMaxIsNA)) { iMax = ii; xMax = xii; xMaxIsNA = ISNAN(xMax); } R_CHECK_USER_INTERRUPT(ii); } /* for (ii ...) */ } else { for (ii=1; ii < nidxs; ii++) { /* Get the ii:th value */ xii = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), NA_REAL); if (hasna && ISNAN(xii)) { if (narm) { hasna2 = TRUE; continue; } else { return(R_NaReal); } } if (xii > xMax || (narm && xMaxIsNA)) { iMax = ii; xMax = xii; xMaxIsNA = ISNAN(xMax); } R_CHECK_USER_INTERRUPT(ii); } /* for (ii ...) */ } /* by */ /* Early stopping? */ if (xMaxIsNA) { /* Found only missing values? */ return narm ? R_NegInf : R_NaReal; } else if (xMax == R_PosInf) { /* Found +Inf? */ return(R_PosInf); } else if (xMax == R_NegInf) { /* all values are -Inf */ return(R_NegInf); } /* Sum differences */ sum = 0.0; if (by) { for (ii=0; ii < nidxs; ii++) { if (ii == iMax) { continue; } /* Get the ii:th value */ xii = xx[ii]; if (!hasna2 || !ISNAN(xii)) { sum += exp(xii - xMax); } /* Early LDOUBLE stopping on -Inf/+Inf and user interrupt? */ if (ii % 1048576 == 0) { if (!R_FINITE(sum)) break; R_CheckUserInterrupt(); } } /* for (ii ...) */ } else { for (ii=0; ii < nidxs; ii++) { if (ii == iMax) { continue; } /* Get the ii:th value */ xii = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), NA_REAL); if (!hasna2 || !ISNAN(xii)) { sum += exp(xii - xMax); } /* Early LDOUBLE stopping on -Inf/+Inf and user interrupt? */ if (ii % 1048576 == 0) { if (!R_FINITE(sum)) break; R_CheckUserInterrupt(); } } /* for (ii ...) */ } /* if (by) */ sum = xMax + log1p(sum); return(sum); } /*************************************************************************** HISTORY: 2015-06-11 [DJ] o Supported subsetted computation. 2015-06-10 [DJ] o Merge 'logSumExp_double_by' to 'logSumExp_double' 2015-01-26 [HB] o SPEEDUP: Now step 2 ("summing") only checks where NAs if NAs were detected in step 1 ("max value"), which should be noticibly faster since testing for NA is expensive for double values. o SPEEDUP: Now function returns early after step 1 ("max value") if the maximum value found is +Inf, or if all values where NAs. o BUG FIX: Now logSumExp(, na.rm=TRUE) also returns -Inf. 2013-05-02 [HB] o BUG FIX: Incorrectly used ISNAN() on an int variable as caught by the 'cc' compiler on Solaris. Reported by Brian Ripley upon CRAN submission. 2013-04-30 [HB] o Created. **************************************************************************/ matrixStats/src/rowRanges.c0000644000175100001440000000764013073627232015531 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowRanges(SEXP x, ...) Authors: Henrik Bengtsson. Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "rowRanges_lowlevel.h" SEXP rowRanges(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP what, SEXP naRm, SEXP hasNA) { SEXP ans = NILSXP, ans2 = NILSXP; int *mins, *maxs; double *mins2, *maxs2; int *is_counted, all_counted = 0; int what2, narm, hasna; R_xlen_t nrow, ncol, ii; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'what': */ if (length(what) != 1) error("Argument 'what' must be a single number."); if (!isNumeric(what)) error("Argument 'what' must be a numeric number."); what2 = asInteger(what); if (what2 < 0 || what2 > 2) error("Invalid value of 'what': %d", what2); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); is_counted = (int *) R_alloc(nrows, sizeof(int)); if (isReal(x)) { if (what2 == 2) { PROTECT(ans = allocMatrix(REALSXP, nrows, 2)); } else { PROTECT(ans = allocVector(REALSXP, nrows)); } rowRanges_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, what2, narm, hasna, REAL(ans), is_counted); UNPROTECT(1); } else if (isInteger(x)) { if (what2 == 2) { PROTECT(ans = allocMatrix(INTSXP, nrows, 2)); } else { PROTECT(ans = allocVector(INTSXP, nrows)); } rowRanges_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, what2, narm, hasna, INTEGER(ans), is_counted); /* Any entries with zero non-missing values? */ all_counted = 1; for (ii=0; ii < nrows; ii++) { if (!is_counted[ii]) { all_counted = 0; break; } } if (!all_counted) { /* Handle zero non-missing values */ /* Instead of return INTSXP, we must return REALSXP (to hold -Inf, and Inf) */ if (what2 == 0) { PROTECT(ans2 = allocVector(REALSXP, nrows)); mins = INTEGER(ans); mins2 = REAL(ans2); for (ii=0; ii < nrows; ii++) { if (is_counted[ii]) { mins2[ii] = (double)mins[ii]; } else { mins2[ii] = R_PosInf; } } UNPROTECT(1); /* ans2 */ } else if (what2 == 1) { PROTECT(ans2 = allocVector(REALSXP, nrows)); maxs = INTEGER(ans); maxs2 = REAL(ans2); for (ii=0; ii < nrows; ii++) { if (is_counted[ii]) { maxs2[ii] = (double)maxs[ii]; } else { maxs2[ii] = R_NegInf; } } UNPROTECT(1); /* ans2 */ } else if (what2 == 2) { PROTECT(ans2 = allocMatrix(REALSXP, nrows, 2)); mins = INTEGER(ans); maxs = &INTEGER(ans)[nrows]; mins2 = REAL(ans2); maxs2 = &REAL(ans2)[nrows]; for (ii=0; ii < nrows; ii++) { if (is_counted[ii]) { mins2[ii] = (double)mins[ii]; maxs2[ii] = (double)maxs[ii]; } else { mins2[ii] = R_PosInf; maxs2[ii] = R_NegInf; } } UNPROTECT(1); /* ans2 */ } ans = ans2; } UNPROTECT(1); /* ans */ } return(ans); } // rowRanges() /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-16 [HB] o Created. **************************************************************************/ matrixStats/src/logSumExp_lowlevel.h0000644000175100001440000000127513073627232017421 0ustar hornikusers#include #include #include "000.utils.h" /* Native API (dynamically generated via macros): double logSumExp_double_aidxs(double *x, void *idxs, R_xlen_t nidxs, int narm, int hasna, R_xlen_t by, double *xx) double logSumExp_double_iidxs(double *x, void *idxs, R_xlen_t nidxs, int narm, int hasna, R_xlen_t by, double *xx) double logSumExp_double_didxs(double *x, void *idxs, R_xlen_t nidxs, int narm, int hasna, R_xlen_t by, double *xx) */ #define METHOD logSumExp #define METHOD_NAME logSumExp_double #define RETURN_TYPE double #define ARGUMENTS_LIST double *x, void *idxs, R_xlen_t nidxs, int narm, int hasna, R_xlen_t by, double *xx #include "000.templates-gen-vector.h" matrixStats/src/rowCumsums_lowlevel_template.h0000644000175100001440000001037613073627232021557 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowCumsums_[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, ANS_C_TYPE *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD: the name of the resulting function - X_TYPE: 'i' or 'r' Authors: Henrik Bengtsson. Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj, kk, kk_prev, idx; R_xlen_t colBegin; X_C_TYPE xvalue; LDOUBLE value; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif #if ANS_TYPE == 'i' double R_INT_MIN_d = (double)R_INT_MIN, R_INT_MAX_d = (double)R_INT_MAX; /* OK, i.e. no integer overflow yet? */ int warn = 0, ok, *oks = NULL; #endif if (ncols == 0 || nrows == 0) return; if (byrow) { #if ANS_TYPE == 'i' oks = (int *) R_alloc(nrows, sizeof(int)); #endif colBegin = R_INDEX_OP(COL_INDEX(ccols,0), *, nrow); for (kk=0; kk < nrows; kk++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,kk)); xvalue = R_INDEX_GET(x, idx, X_NA); ans[kk] = (ANS_C_TYPE) xvalue; #if ANS_TYPE == 'i' oks[kk] = !X_ISNA(xvalue); #endif } kk_prev = 0; for (jj=1; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); #if ANS_TYPE == 'i' if (oks[ii]) { /* Missing value? */ if (X_ISNA(xvalue)) { oks[ii] = 0; ans[kk] = ANS_NA; } else { value = (LDOUBLE) ans[kk_prev] + (LDOUBLE) xvalue; /* Integer overflow? */ if (value < R_INT_MIN_d || value > R_INT_MAX_d) { oks[ii] = 0; warn = 1; ans[kk] = ANS_NA; } else { ans[kk] = (ANS_C_TYPE) value; } } } else { ans[kk] = ANS_NA; } #else ans[kk] = (ANS_C_TYPE) ((LDOUBLE) ans[kk_prev] + (LDOUBLE) xvalue); #endif kk++; kk_prev++; R_CHECK_USER_INTERRUPT(kk); } /* for (ii ...) */ } /* for (jj ...) */ } else { kk = 0; for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); value = 0; #if ANS_TYPE == 'i' ok = 1; #endif for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); xvalue = R_INDEX_GET(x, idx, X_NA); #if ANS_TYPE == 'i' if (ok) { /* Missing value? */ if (X_ISNA(xvalue)) { ok = 0; ans[kk] = ANS_NA; } else { value += (LDOUBLE) xvalue; /* Integer overflow? */ if (value < R_INT_MIN_d || value > R_INT_MAX_d) { ok = 0; warn = 1; ans[kk] = ANS_NA; } else { ans[kk] = (ANS_C_TYPE) value; } } } else { ans[kk] = ANS_NA; } #else value += xvalue; ans[kk] = (ANS_C_TYPE) value; #endif kk++; R_CHECK_USER_INTERRUPT(kk); } /* for (ii ...) */ } /* for (jj ...) */ } /* if (byrow) */ #if ANS_TYPE == 'i' /* Warn on integer overflow? */ if (warn) { warning("Integer overflow. Detected one or more elements whose absolute values were out of the range [%d,%d] that can be used to for integers. Such values are set to NA_integer_.", R_INT_MIN, R_INT_MAX); } #endif } /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-26 [HB] o Created from rowVars_TYPE-template.h. **************************************************************************/ matrixStats/src/rowVars_lowlevel_template.h0000644000175100001440000000607513073627232021037 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowVars_(ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int narm, int hasna, int byrow, double *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD: the name of the resulting function - X_TYPE: 'i' or 'r' Authors: Adopted from rowQuantiles.c by R. Gentleman. Template by Henrik Bengtsson. Copyright: Henrik Bengtsson, 2007-2013 ***********************************************************************/ #include #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj, kk, idx; R_xlen_t *colOffset; X_C_TYPE *values, value; double value_d, mu_d, sigma2_d; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif /* R allocate memory for the 'values'. This will be taken care of by the R garbage collector later on. */ values = (X_C_TYPE *) R_alloc(ncols, sizeof(X_C_TYPE)); /* If there are no missing values, don't try to remove them. */ if (hasna == FALSE) narm = FALSE; /* Pre-calculate the column offsets */ colOffset = (R_xlen_t *) R_alloc(ncols, sizeof(R_xlen_t)); if (byrow) { for (jj=0; jj < ncols; jj++) colOffset[jj] = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); } else { for (jj=0; jj < ncols; jj++) colOffset[jj] = COL_INDEX(ccols,jj); } for (ii=0; ii < nrows; ii++) { R_xlen_t rowIdx = byrow ? ROW_INDEX(crows,ii) : R_INDEX_OP(ROW_INDEX(crows,ii), *, ncol); //HJ kk = 0; for (jj=0; jj < ncols; jj++) { idx = R_INDEX_OP(rowIdx, +, colOffset[jj]); value = R_INDEX_GET(x, idx, X_NA); //HJ if (X_ISNAN(value)) { if (narm == FALSE) { kk = -1; break; } } else { values[kk] = value; kk = kk + 1; } } /* for (jj ...) */ /* Note that 'values' will never contain NA/NaNs */ if (kk <= 1) { ans[ii] = NA_REAL; } else { /* (a) Calculate mu = sum(x)/length(x) */ mu_d = 0; for (jj=0; jj < kk; jj++) { mu_d += (double)values[jj]; } mu_d /= (double)kk; /* (b) Calculate sigma^2 */ sigma2_d = 0; for (jj=0; jj < kk; jj++) { value_d = ((double)values[jj] - mu_d); value_d *= value_d; sigma2_d += value_d; } sigma2_d /= (double)(kk-1); ans[ii] = sigma2_d; } /* if (kk <= 1) */ R_CHECK_USER_INTERRUPT(ii); } /* for (ii ...) */ } /*************************************************************************** HISTORY: 2015-06-13 [DJ] o Supported subsetted computation. 2014-11-18 [HB] o Created from rowMads_TYPE-template.h. **************************************************************************/ matrixStats/src/rowCumsums.c0000644000175100001440000000320113073627232015733 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowCumsums(SEXP x, ...) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "rowCumsums_lowlevel.h" SEXP rowCumsums(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP byRow) { int byrow; SEXP ans = NILSXP; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); /* Double matrices are more common to use. */ if (isReal(x)) { PROTECT(ans = allocMatrix(REALSXP, nrows, ncols)); rowCumsums_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, REAL(ans)); UNPROTECT(1); } else if (isInteger(x)) { PROTECT(ans = allocMatrix(INTSXP, nrows, ncols)); rowCumsums_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, byrow, INTEGER(ans)); UNPROTECT(1); } return(ans); } /* rowCumsums() */ /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-26 [HB] o Created from rowVars.c. **************************************************************************/ matrixStats/src/000.templates-types.h0000644000175100001440000003027513073627232017225 0ustar hornikusers#include #include "000.macros.h" #undef X_C_TYPE #undef X_IN_C #undef X_ISNAN #undef X_ISNA #undef X_ABS #undef X_PSORT #undef X_QSORT_I #undef X_NA #undef Y_C_TYPE #undef Y_IN_C #undef Y_ISNAN #undef Y_ISNA #undef Y_ABS #undef Y_PSORT #undef Y_QSORT_I #undef Y_NA #undef ANS_SXP #undef ANS_NA #undef ANS_ISNAN #undef ANS_ISNA #undef ANS_C_TYPE #undef ANS_IN_C /* Data type macros for argument 'x' */ #ifdef X_TYPE #if X_TYPE == 'i' #define X_C_TYPE int #define X_IN_C INTEGER #define X_ISNAN(x) (x == NA_INTEGER) #define X_ISNA(x) (x == NA_INTEGER) #define X_ABS(x) abs(x) #define X_PSORT iPsort #define X_QSORT_I R_qsort_int_I #define X_NA NA_INTEGER #elif X_TYPE == 'r' #define X_C_TYPE double #define X_IN_C REAL #define X_ISNAN(x) ISNAN(x) /* True for R's NA and IEEE NaN */ #define X_ISNA(x) ISNA(x) /* True for R's NA */ #define X_ABS(x) fabs(x) #define X_PSORT rPsort #define X_QSORT_I R_qsort_I #define X_NA NA_REAL #elif X_TYPE == 'l' #define X_C_TYPE int #define X_IN_C LOGICAL #define X_ISNAN(x) (x == NA_LOGICAL) #define X_NA NA_LOGICAL #else #error "INTERNAL ERROR: Failed to set C macro X_C_TYPE etc.: Unknown X_TYPE" #endif #endif /* Data type macros for argument 'y' */ #ifdef Y_TYPE #if Y_TYPE == 'i' #define Y_C_TYPE int #define Y_IN_C INTEGER #define Y_ISNAN(x) (x == NA_INTEGER) #define Y_ISNA(x) (x == NA_INTEGER) #define Y_ABS(x) abs(x) #define Y_PSORT iPsort #define Y_QSORT_I R_qsort_int_I #define Y_NA NA_INTEGER #elif Y_TYPE == 'r' #define Y_C_TYPE double #define Y_IN_C REAL #define Y_ISNAN(x) ISNAN(x) /* NA or NaN */ #define Y_ISNA(x) ISNA(x) /* NA only */ #define Y_ABS(x) fabs(x) #define Y_PSORT rPsort #define Y_QSORT_I R_qsort_I #define Y_NA NA_REAL #elif Y_TYPE == 'l' #define Y_C_TYPE int #define Y_IN_C LOGICAL #define Y_ISNAN(x) (x == NA_LOGICAL) #define Y_NA NA_LOGICAL #else #error "INTERNAL ERROR: Failed to set C macro Y_C_TYPE etc.: Unknown Y_TYPE" #endif #endif /* Data type macros for result ('ans') */ #ifndef ANS_TYPE #ifdef X_TYPE /* Default to same as 'x' */ #define ANS_TYPE X_TYPE #endif #endif #ifdef ANS_TYPE #if ANS_TYPE == 'i' #define ANS_SXP INTSXP #define ANS_NA NA_INTEGER #define ANS_ISNAN(x) (x == NA_INTEGER) #define ANS_ISNA(x) (x == NA_INTEGER) #define ANS_C_TYPE int #define ANS_IN_C INTEGER #elif ANS_TYPE == 'r' #define ANS_SXP REALSXP #define ANS_NA NA_REAL #define ANS_ISNAN(x) ISNAN(x) /* NA or NaN */ #define ANS_ISNA(x) ISNA(x) /* NA only */ #define ANS_C_TYPE double #define ANS_IN_C REAL #elif ANS_TYPE == 'l' #define ANS_SXP LGLSXP #define ANS_NA NA_LOGICAL #define ANS_ISNAN(x) (x == NA_LOGICAL) #define ANS_C_TYPE int #define ANS_IN_C LOGICAL #else #error "INTERNAL ERROR: Failed to set C macro ANS_C_TYPE: Unknown ANS_TYPE" #endif #endif /* Method name based on 'x' (and 'y') types */ #ifndef METHOD_NAME #if X_TYPE == 'i' #if Y_TYPE == 'i' #define METHOD_NAME CONCAT_MACROS(METHOD, int_int) #elif Y_TYPE == 'r' #define METHOD_NAME CONCAT_MACROS(METHOD, int_dbl) #elif Y_TYPE == 'l' #define METHOD_NAME CONCAT_MACROS(METHOD, int_lgl) #else #define METHOD_NAME CONCAT_MACROS(METHOD, int) #endif #elif X_TYPE == 'r' #if Y_TYPE == 'i' #define METHOD_NAME CONCAT_MACROS(METHOD, dbl_int) #elif Y_TYPE == 'r' #define METHOD_NAME CONCAT_MACROS(METHOD, dbl_dbl) #elif Y_TYPE == 'l' #define METHOD_NAME CONCAT_MACROS(METHOD, dbl_lgl) #else #define METHOD_NAME CONCAT_MACROS(METHOD, dbl) #endif #elif X_TYPE == 'l' #if Y_TYPE == 'i' #define METHOD_NAME CONCAT_MACROS(METHOD, lgl_int) #elif Y_TYPE == 'r' #define METHOD_NAME CONCAT_MACROS(METHOD, lgl_dbl) #elif Y_TYPE == 'l' #define METHOD_NAME CONCAT_MACROS(METHOD, lgl_lgl) #else #define METHOD_NAME CONCAT_MACROS(METHOD, lgl) #endif #else #error "INTERNAL ERROR: Failed to set C macro METHOD_NAME: Unknown X_TYPE" #endif #endif /* Subsetted indexing: matrix */ #undef ROW_INDEX_NONA #undef ROW_INDEX #undef ROWS_C_TYPE #undef METHOD_NAME_ROWS #undef COL_INDEX_NONA #undef COL_INDEX #undef COLS_C_TYPE #undef METHOD_NAME_ROWS_COLS #ifdef ROWS_TYPE #define ROW_INDEX_NONA(rows, ii) ((R_xlen_t)rows[ii]-1) #if ROWS_TYPE == 'i' #define ROWS_C_TYPE int #define ROW_INDEX(rows, ii) (rows[ii] == NA_INTEGER ? NA_R_XLEN_T : (R_xlen_t)rows[ii]-1) #define METHOD_NAME_ROWS CONCAT_MACROS(METHOD_NAME, irows) #elif ROWS_TYPE == 'r' #define ROWS_C_TYPE double #define ROW_INDEX(rows, ii) (ISNAN(rows[ii]) ? NA_R_XLEN_T : (R_xlen_t)rows[ii]-1) #define METHOD_NAME_ROWS CONCAT_MACROS(METHOD_NAME, drows) #else #error "INTERNAL ERROR: Failed to set C macro METHOD_NAME: Unknown ROWS_TYPE" #endif #else #define ROW_INDEX_NONA(rows, ii) (ii) #define ROW_INDEX(rows, ii) (ii) #define ROWS_C_TYPE void #define METHOD_NAME_ROWS CONCAT_MACROS(METHOD_NAME, arows) #endif #ifdef COLS_TYPE #define COL_INDEX_NONA(cols, jj) ((R_xlen_t)cols[jj]-1) #if COLS_TYPE == 'i' #define COLS_C_TYPE int #define COL_INDEX(cols, jj) (cols[jj] == NA_INTEGER ? NA_R_XLEN_T : (R_xlen_t)cols[jj]-1) #define METHOD_NAME_ROWS_COLS CONCAT_MACROS(METHOD_NAME_ROWS, icols) #elif COLS_TYPE == 'r' #define COLS_C_TYPE double #define COL_INDEX(cols, jj) (ISNAN(cols[jj]) ? NA_R_XLEN_T : (R_xlen_t)cols[jj]-1) #define METHOD_NAME_ROWS_COLS CONCAT_MACROS(METHOD_NAME_ROWS, dcols) #else #error "INTERNAL ERROR: Failed to set C macro METHOD_NAME: Unknown ROWS_TYPE" #endif #else #define COL_INDEX_NONA(cols, jj) (jj) #define COL_INDEX(cols, jj) (jj) #define COLS_C_TYPE void #define METHOD_NAME_ROWS_COLS CONCAT_MACROS(METHOD_NAME_ROWS, acols) #endif #undef METHOD_NAME_arows #undef METHOD_NAME_arows_acols #undef METHOD_NAME_arows_icols #undef METHOD_NAME_arows_dcols #undef METHOD_NAME_irows #undef METHOD_NAME_irows_acols #undef METHOD_NAME_irows_icols #undef METHOD_NAME_irows_dcols #undef METHOD_NAME_drows #undef METHOD_NAME_drows_acols #undef METHOD_NAME_drows_icols #undef METHOD_NAME_drows_dcols #define METHOD_NAME_arows CONCAT_MACROS(METHOD_NAME, arows) #define METHOD_NAME_arows_acols CONCAT_MACROS(METHOD_NAME_arows, acols) #define METHOD_NAME_arows_icols CONCAT_MACROS(METHOD_NAME_arows, icols) #define METHOD_NAME_arows_dcols CONCAT_MACROS(METHOD_NAME_arows, dcols) #define METHOD_NAME_irows CONCAT_MACROS(METHOD_NAME, irows) #define METHOD_NAME_irows_acols CONCAT_MACROS(METHOD_NAME_irows, acols) #define METHOD_NAME_irows_icols CONCAT_MACROS(METHOD_NAME_irows, icols) #define METHOD_NAME_irows_dcols CONCAT_MACROS(METHOD_NAME_irows, dcols) #define METHOD_NAME_drows CONCAT_MACROS(METHOD_NAME, drows) #define METHOD_NAME_drows_acols CONCAT_MACROS(METHOD_NAME_drows, acols) #define METHOD_NAME_drows_icols CONCAT_MACROS(METHOD_NAME_drows, icols) #define METHOD_NAME_drows_dcols CONCAT_MACROS(METHOD_NAME_drows, dcols) /* Subsetted indexing: vector */ #undef IDX_INDEX_NONA #undef IDX_INDEX #undef IDXS_C_TYPE #undef METHOD_NAME_IDXS #ifdef IDXS_TYPE #define IDX_INDEX_NONA(idxs, ii) ((R_xlen_t)idxs[ii]-1) #if IDXS_TYPE == 'i' #define IDXS_C_TYPE int #define IDX_INDEX(idxs, ii) (idxs[ii] == NA_INTEGER ? NA_R_XLEN_T : (R_xlen_t)idxs[ii]-1) #define METHOD_NAME_IDXS CONCAT_MACROS(METHOD_NAME, iidxs) #elif IDXS_TYPE == 'r' #define IDXS_C_TYPE double #define IDX_INDEX(idxs, ii) (ISNAN(idxs[ii]) ? NA_R_XLEN_T : (R_xlen_t)idxs[ii]-1) #define METHOD_NAME_IDXS CONCAT_MACROS(METHOD_NAME, didxs) #else #error "INTERNAL ERROR: Failed to set C macro METHOD_NAME: Unknown IDXS_TYPE" #endif #else #define IDX_INDEX_NONA(idxs, ii) (ii) #define IDX_INDEX(idxs, ii) (ii) #define IDXS_C_TYPE void #define METHOD_NAME_IDXS CONCAT_MACROS(METHOD_NAME, aidxs) #endif #undef METHOD_NAME_aidxs #undef METHOD_NAME_iidxs #undef METHOD_NAME_didxs #define METHOD_NAME_aidxs CONCAT_MACROS(METHOD_NAME, aidxs) #define METHOD_NAME_iidxs CONCAT_MACROS(METHOD_NAME, iidxs) #define METHOD_NAME_didxs CONCAT_MACROS(METHOD_NAME, didxs) /* Subsetted indexing: matrix + vector */ #undef METHOD_NAME_ROWS_COLS_IDXS #ifdef IDXS_TYPE #if IDXS_TYPE == 'i' #define METHOD_NAME_ROWS_COLS_IDXS CONCAT_MACROS(METHOD_NAME_ROWS_COLS, iidxs) #elif IDXS_TYPE == 'r' #define METHOD_NAME_ROWS_COLS_IDXS CONCAT_MACROS(METHOD_NAME_ROWS_COLS, didxs) #endif #else #define METHOD_NAME_ROWS_COLS_IDXS CONCAT_MACROS(METHOD_NAME_ROWS_COLS, aidxs) #endif #define METHOD_NAME_aidxs CONCAT_MACROS(METHOD_NAME, aidxs) #undef METHOD_NAME_arows_acols_aidxs #undef METHOD_NAME_arows_acols_iidxs #undef METHOD_NAME_arows_acols_didxs #undef METHOD_NAME_arows_icols_aidxs #undef METHOD_NAME_arows_icols_iidxs #undef METHOD_NAME_arows_icols_didxs #undef METHOD_NAME_arows_dcols_aidxs #undef METHOD_NAME_arows_dcols_iidxs #undef METHOD_NAME_arows_dcols_didxs #undef METHOD_NAME_irows_acols_aidxs #undef METHOD_NAME_irows_acols_iidxs #undef METHOD_NAME_irows_acols_didxs #undef METHOD_NAME_irows_icols_aidxs #undef METHOD_NAME_irows_icols_iidxs #undef METHOD_NAME_irows_icols_didxs #undef METHOD_NAME_irows_dcols_aidxs #undef METHOD_NAME_irows_dcols_iidxs #undef METHOD_NAME_irows_dcols_didxs #undef METHOD_NAME_drows_acols_aidxs #undef METHOD_NAME_drows_acols_iidxs #undef METHOD_NAME_drows_acols_didxs #undef METHOD_NAME_drows_icols_aidxs #undef METHOD_NAME_drows_icols_iidxs #undef METHOD_NAME_drows_icols_didxs #undef METHOD_NAME_drows_dcols_aidxs #undef METHOD_NAME_drows_dcols_iidxs #undef METHOD_NAME_drows_dcols_didxs #define METHOD_NAME_arows_acols_aidxs CONCAT_MACROS(METHOD_NAME_arows_acols, aidxs) #define METHOD_NAME_arows_acols_iidxs CONCAT_MACROS(METHOD_NAME_arows_acols, iidxs) #define METHOD_NAME_arows_acols_didxs CONCAT_MACROS(METHOD_NAME_arows_acols, didxs) #define METHOD_NAME_arows_icols_aidxs CONCAT_MACROS(METHOD_NAME_arows_icols, aidxs) #define METHOD_NAME_arows_icols_iidxs CONCAT_MACROS(METHOD_NAME_arows_icols, iidxs) #define METHOD_NAME_arows_icols_didxs CONCAT_MACROS(METHOD_NAME_arows_icols, didxs) #define METHOD_NAME_arows_dcols_aidxs CONCAT_MACROS(METHOD_NAME_arows_dcols, aidxs) #define METHOD_NAME_arows_dcols_iidxs CONCAT_MACROS(METHOD_NAME_arows_dcols, iidxs) #define METHOD_NAME_arows_dcols_didxs CONCAT_MACROS(METHOD_NAME_arows_dcols, didxs) #define METHOD_NAME_irows_acols_aidxs CONCAT_MACROS(METHOD_NAME_irows_acols, aidxs) #define METHOD_NAME_irows_acols_iidxs CONCAT_MACROS(METHOD_NAME_irows_acols, iidxs) #define METHOD_NAME_irows_acols_didxs CONCAT_MACROS(METHOD_NAME_irows_acols, didxs) #define METHOD_NAME_irows_icols_aidxs CONCAT_MACROS(METHOD_NAME_irows_icols, aidxs) #define METHOD_NAME_irows_icols_iidxs CONCAT_MACROS(METHOD_NAME_irows_icols, iidxs) #define METHOD_NAME_irows_icols_didxs CONCAT_MACROS(METHOD_NAME_irows_icols, didxs) #define METHOD_NAME_irows_dcols_aidxs CONCAT_MACROS(METHOD_NAME_irows_dcols, aidxs) #define METHOD_NAME_irows_dcols_iidxs CONCAT_MACROS(METHOD_NAME_irows_dcols, iidxs) #define METHOD_NAME_irows_dcols_didxs CONCAT_MACROS(METHOD_NAME_irows_dcols, didxs) #define METHOD_NAME_drows_acols_aidxs CONCAT_MACROS(METHOD_NAME_drows_acols, aidxs) #define METHOD_NAME_drows_acols_iidxs CONCAT_MACROS(METHOD_NAME_drows_acols, iidxs) #define METHOD_NAME_drows_acols_didxs CONCAT_MACROS(METHOD_NAME_drows_acols, didxs) #define METHOD_NAME_drows_icols_aidxs CONCAT_MACROS(METHOD_NAME_drows_icols, aidxs) #define METHOD_NAME_drows_icols_iidxs CONCAT_MACROS(METHOD_NAME_drows_icols, iidxs) #define METHOD_NAME_drows_icols_didxs CONCAT_MACROS(METHOD_NAME_drows_icols, didxs) #define METHOD_NAME_drows_dcols_aidxs CONCAT_MACROS(METHOD_NAME_drows_dcols, aidxs) #define METHOD_NAME_drows_dcols_iidxs CONCAT_MACROS(METHOD_NAME_drows_dcols, iidxs) #define METHOD_NAME_drows_dcols_didxs CONCAT_MACROS(METHOD_NAME_drows_dcols, didxs) /* Subsetted indexing: whether to check NA according to indexing */ #undef R_INDEX_OP #undef R_INDEX_GET #if !defined(ROWS_TYPE) && !defined(COLS_TYPE) && !defined(IDXS_TYPE) #define R_INDEX_OP(a, OP, b) (a OP b) #define R_INDEX_GET(x, i, NA) x[i] #else #define R_INDEX_OP(a, OP, b) (a == NA_R_XLEN_T || b == NA_R_XLEN_T ? NA_R_XLEN_T : a OP b) #define R_INDEX_GET(x, i, NA) (i == NA_R_XLEN_T ? NA : x[i]) #endif matrixStats/src/logSumExp.c0000644000175100001440000000263713073627232015506 0ustar hornikusers/*************************************************************************** Public methods: SEXP logSumExp(SEXP lx, SEXP idxs, SEXP naRm, SEXP hasNA) Arguments: lx : numeric vector idxs : subsetting indices naRm : a logical scalar hasNA: a logical scalar Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2013 **************************************************************************/ #include #include #include "logSumExp_lowlevel.h" SEXP logSumExp(SEXP lx, SEXP idxs, SEXP naRm, SEXP hasNA) { int narm, hasna; /* Argument 'lx': */ assertArgVector(lx, (R_TYPE_REAL), "lx"); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'idxs': */ R_xlen_t nidxs; int idxsType; void *cidxs = validateIndices(idxs, xlength(lx), 1, &nidxs, &idxsType); return(Rf_ScalarReal(logSumExp_double[idxsType](REAL(lx), cidxs, nidxs, narm, hasna, 0, NULL))); } /* logSumExp() */ /*************************************************************************** HISTORY: 2015-06-11 [DJ] o Supported subsetted computation. 2013-05-02 [HB] o BUG FIX: Incorrectly used ISNAN() on an int variable as caught by the 'cc' compiler on Solaris. Reported by Brian Ripley upon CRAN submission. 2013-04-30 [HB] o Created. **************************************************************************/ matrixStats/src/signTabulate_lowlevel_template.h0000644000175100001440000000333413073627232022011 0ustar hornikusers/*********************************************************************** TEMPLATE: void signTabulate_[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nx, void *idxs, R_xlen_t nidxs, double *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { X_C_TYPE xi; R_xlen_t ii; R_xlen_t nNeg = 0, nZero = 0, nPos = 0, nNA=0; #if X_TYPE == 'r' R_xlen_t nPosInf=0, nNegInf=0; #endif #ifdef IDXS_TYPE IDXS_C_TYPE *cidxs = (IDXS_C_TYPE*) idxs; #endif for (ii = 0; ii < nidxs; ii++) { xi = R_INDEX_GET(x, IDX_INDEX(cidxs,ii), X_NA); if (X_ISNAN(xi)) { nNA++; } else if (xi > 0) { nPos++; #if X_TYPE == 'r' if (xi == R_PosInf) nPosInf++; #endif } else if (xi < 0) { nNeg++; #if X_TYPE == 'r' if (xi == R_NegInf) nNegInf++; #endif } else if (xi == 0) { nZero++; } } ans[0] = nNeg; ans[1] = nZero; ans[2] = nPos; ans[3] = nNA; #if X_TYPE == 'r' ans[4] = nNegInf; ans[5] = nPosInf; #endif } /*************************************************************************** HISTORY: 2015-07-04 [DJ] o Supported subsetted computation. 2014-11-06 [HB] o CLEANUP: Moving away from R data types in low-level C functions. 2014-06-04 [HB] o Created. **************************************************************************/ matrixStats/src/rowMeans2_lowlevel_template.h0000644000175100001440000000404413073627232021243 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowMeans2_(ARGUMENTS_LIST) Copyright: Henrik Bengtsson, 2017 ***********************************************************************/ #include #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj, idx; R_xlen_t *colOffset; X_C_TYPE value; LDOUBLE sum, avg; R_xlen_t count; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif /* If there are no missing values, don't try to remove them. */ if (hasna == FALSE) narm = FALSE; /* Pre-calculate the column offsets */ colOffset = (R_xlen_t *) R_alloc(ncols, sizeof(R_xlen_t)); if (byrow) { for (jj=0; jj < ncols; jj++) colOffset[jj] = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); } else { for (jj=0; jj < ncols; jj++) colOffset[jj] = COL_INDEX(ccols,jj); } for (ii=0; ii < nrows; ii++) { R_xlen_t rowIdx = byrow ? ROW_INDEX(crows,ii) : R_INDEX_OP(ROW_INDEX(crows,ii), *, ncol); sum = 0.0; count = 0; for (jj=0; jj < ncols; jj++) { idx = R_INDEX_OP(rowIdx, +, colOffset[jj]); value = R_INDEX_GET(x, idx, X_NA); #if X_TYPE == 'i' if (!X_ISNAN(value)) { sum += (LDOUBLE)value; ++count; } else if (!narm) { sum = R_NaReal; break; } #elif X_TYPE == 'r' if (!narm) { sum += (LDOUBLE)value; ++count; if (jj % 1048576 == 0 && ISNA(sum)) break; } else if (!ISNAN(value)) { sum += (LDOUBLE)value; ++count; } #endif } /* for (jj ...) */ if (sum > DOUBLE_XMAX) { avg = R_PosInf; } else if (sum < -DOUBLE_XMAX) { avg = R_NegInf; } else { avg = sum / count; } ans[ii] = (double)avg; R_CHECK_USER_INTERRUPT(ii); } /* for (ii ...) */ } matrixStats/src/rowMads_lowlevel.h0000644000175100001440000000744613073627232017120 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowMads_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) void rowMads_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double scale, int narm, int hasna, int byrow, double *ans) */ #define METHOD rowMads #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, double scale, int narm, int hasna, int byrow, double *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" matrixStats/src/rowMeans2.c0000644000175100001440000000341013073627232015426 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowMeans2(SEXP x, SEXP naRm, SEXP hasNA) SEXP colMeans2(SEXP x, SEXP naRm, SEXP hasNA) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2017 **************************************************************************/ #include #include "000.types.h" #include "rowMeans2_lowlevel.h" SEXP rowMeans2(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow) { int narm, hasna, byrow; SEXP ans; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); if (!byrow) { SWAP(R_xlen_t, nrow, ncol); SWAP(void*, crows, ccols); SWAP(R_xlen_t, nrows, ncols); SWAP(int, rowsType, colsType); } /* R allocate a double vector of length 'nrow' Note that 'nrow' means 'ncol' if byrow=FALSE. */ PROTECT(ans = allocVector(REALSXP, nrows)); /* Double matrices are more common to use. */ if (isReal(x)) { rowMeans2_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, narm, hasna, byrow, REAL(ans)); } else if (isInteger(x)) { rowMeans2_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, narm, hasna, byrow, REAL(ans)); } UNPROTECT(1); return(ans); } matrixStats/src/weightedMedian.c0000644000175100001440000000354613073627232016501 0ustar hornikusers/*************************************************************************** Public methods: SEXP weightedMedian(SEXP x, SEXP w, SEXP idxs, SEXP naRm, SEXP interpolate, SEXP ties) Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include #include "weightedMedian_lowlevel.h" SEXP weightedMedian(SEXP x, SEXP w, SEXP idxs, SEXP naRm, SEXP interpolate, SEXP ties) { SEXP ans; int narm, interpolate2, ties2; double mu = NA_REAL; R_xlen_t nx, nw; /* Argument 'x': */ assertArgVector(x, (R_TYPE_INT | R_TYPE_REAL), "x"); nx = xlength(x); /* Argument 'x': */ assertArgVector(w, (R_TYPE_REAL), "w"); nw = xlength(w); if (nx != nw) { error("Argument 'x' and 'w' are of different lengths: %d != %d", nx, nw); } /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'interpolate': */ interpolate2 = asLogicalNoNA(interpolate, "interpolate"); /* Argument 'idxs': */ R_xlen_t nidxs; int idxsType; void *cidxs = validateIndices(idxs, nx, 1, &nidxs, &idxsType); /* Argument 'ties': */ ties2 = asInteger(ties); /* Double matrices are more common to use. */ if (isReal(x)) { mu = weightedMedian_dbl[idxsType](REAL(x), nx, REAL(w), cidxs, nidxs, narm, interpolate2, ties2); } else if (isInteger(x)) { mu = weightedMedian_int[idxsType](INTEGER(x), nx, REAL(w), cidxs, nidxs, narm, interpolate2, ties2); } /* Return results */ PROTECT(ans = allocVector(REALSXP, 1)); REAL(ans)[0] = mu; UNPROTECT(1); return(ans); } // weightedMedian() /*************************************************************************** HISTORY: 2015-07-09 [DJ] o Supported subsetted computation. 2015-01-01 [HB] o Created. **************************************************************************/ matrixStats/src/colRanges_lowlevel.h0000644000175100001440000000753113073627232017414 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void colRanges_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void colRanges_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void colRanges_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void colRanges_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void colRanges_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void colRanges_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void colRanges_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void colRanges_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void colRanges_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void colRanges_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void colRanges_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void colRanges_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void colRanges_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void colRanges_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void colRanges_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void colRanges_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void colRanges_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void colRanges_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) */ #define METHOD colRanges #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int what, int narm, int hasna, X_C_TYPE *ans, int *is_counted #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" matrixStats/src/rowVars_lowlevel.h0000644000175100001440000000705413073627232017142 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowVars_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) void rowVars_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int narm, int hasna, int byrow, double *ans) */ #define METHOD rowVars #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int narm, int hasna, int byrow, double *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #undef METHOD matrixStats/src/rowDiffs_lowlevel_template.h0000644000175100001440000001341013073627232021146 0ustar hornikusers/*********************************************************************** TEMPLATE: void rowDiffs_(ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, R_xlen_t lag, R_xlen_t differences, X_C_TYPE *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" #include #undef X_DIFF #undef DIFF_X_MATRIX #if X_TYPE == 'i' #ifndef diff_int static R_INLINE int diff_int(int a, int b) { if (X_ISNA(a) || X_ISNA(b)) return(NA_INTEGER); return a-b; } #define diff_int diff_int #endif #define X_DIFF diff_int #define DIFF_X_MATRIX diff_matrix_int #elif X_TYPE == 'r' #define X_DIFF(a,b) a-b #define DIFF_X_MATRIX diff_matrix_double #endif #if (X_TYPE == 'i' && !defined(diff_matrix_int)) || (X_TYPE == 'r' && !defined(diff_matrix_double)) static R_INLINE void DIFF_X_MATRIX(X_C_TYPE *x, R_xlen_t nrow_x, R_xlen_t ncol_x, int byrow, R_xlen_t lag, X_C_TYPE *y, R_xlen_t nrow_y, R_xlen_t ncol_y) { R_xlen_t ii, jj, ss, tt, uu; if (byrow) { uu = lag * nrow_x; tt = 0; ss = 0; for (jj=0; jj < ncol_y; jj++) { for (ii=0; ii < nrow_y; ii++) { y[ss++] = X_DIFF(x[uu++], x[tt++]); } } } else { uu = lag; tt = 0; ss = 0; for (jj=0; jj < ncol_y; jj++) { for (ii=0; ii < nrow_y; ii++) { /* Rprintf("y[%d] = x[%d] - x[%d] = %g - %g = %g\n", ss, uu, tt, (double)x[uu], (double)x[tt], (double)X_DIFF(x[uu], x[tt])); */ y[ss++] = X_DIFF(x[uu++], x[tt++]); } tt += lag; uu += lag; } } } #if X_TYPE == 'i' #define diff_matrix_int diff_matrix_int #elif X_TYPE == 'r' #define diff_matrix_double diff_matrix_double #endif #endif #undef DIFF_X_MATRIX_ROWS #ifdef ROWS_TYPE #if ROWS_TYPE == 'i' #define DIFF_X_MATRIX_ROWS CONCAT_MACROS(DIFF_X_MATRIX, irows) #elif ROWS_TYPE == 'r' #define DIFF_X_MATRIX_ROWS CONCAT_MACROS(DIFF_X_MATRIX, drows) #endif #else #define DIFF_X_MATRIX_ROWS CONCAT_MACROS(DIFF_X_MATRIX, arows) #endif #undef DIFF_X_MATRIX_ROWS_COLS #ifdef COLS_TYPE #if COLS_TYPE == 'i' #define DIFF_X_MATRIX_ROWS_COLS CONCAT_MACROS(DIFF_X_MATRIX_ROWS, icols) #elif COLS_TYPE == 'r' #define DIFF_X_MATRIX_ROWS_COLS CONCAT_MACROS(DIFF_X_MATRIX_ROWS, dcols) #endif #else #define DIFF_X_MATRIX_ROWS_COLS CONCAT_MACROS(DIFF_X_MATRIX_ROWS, acols) #endif static R_INLINE void DIFF_X_MATRIX_ROWS_COLS(X_C_TYPE *x, R_xlen_t nrow, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, R_xlen_t lag, X_C_TYPE *ans, R_xlen_t nrow_ans, R_xlen_t ncol_ans) { R_xlen_t ii, jj, ss; R_xlen_t idx, colBegin1, colBegin2; X_C_TYPE xvalue1, xvalue2; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif ss = 0; if (byrow) { for (jj=0; jj < ncol_ans; jj++) { colBegin1 = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); colBegin2 = R_INDEX_OP(COL_INDEX(ccols,(jj+lag)), *, nrow); for (ii=0; ii < nrow_ans; ii++) { idx = R_INDEX_OP(colBegin1, +, ROW_INDEX(crows,ii)); xvalue1 = R_INDEX_GET(x, idx, X_NA); idx = R_INDEX_OP(colBegin2, +, ROW_INDEX(crows,ii)); xvalue2 = R_INDEX_GET(x, idx, X_NA); ans[ss++] = X_DIFF(xvalue2, xvalue1); } } } else { for (jj=0; jj < ncol_ans; jj++) { colBegin1 = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrow_ans; ii++) { idx = R_INDEX_OP(colBegin1, +, ROW_INDEX(crows,ii)); xvalue1 = R_INDEX_GET(x, idx, X_NA); idx = R_INDEX_OP(colBegin1, +, ROW_INDEX(crows,ii+lag)); xvalue2 = R_INDEX_GET(x, idx, X_NA); ans[ss++] = X_DIFF(xvalue2, xvalue1); } } } } RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t nrow_tmp, ncol_tmp; X_C_TYPE *tmp = NULL; /* Nothing to do? */ if (ncol_ans <= 0 || nrow_ans <= 0) return; /* Special case (difference == 1) */ if (differences == 1) { DIFF_X_MATRIX_ROWS_COLS(x, nrow, rows, nrows, cols, ncols, byrow, lag, ans, nrow_ans, ncol_ans); } else { /* Allocate temporary work matrix (to hold intermediate differences) */ if (byrow) { nrow_tmp = nrows; ncol_tmp = ncols - lag; } else { nrow_tmp = nrows - lag; ncol_tmp = ncols; } tmp = Calloc(nrow_tmp*ncol_tmp, X_C_TYPE); /* (a) First order of differences */ DIFF_X_MATRIX_ROWS_COLS(x, nrow, rows, nrows, cols, ncols, byrow, lag, tmp, nrow_tmp, ncol_tmp); if (byrow) { ncol_tmp = ncol_tmp - lag; } else { nrow_tmp = nrow_tmp - lag; } /* (a) Intermediate orders of differences */ while (--differences > 1) { DIFF_X_MATRIX(tmp, nrow_tmp, ncol_tmp, byrow, lag, tmp, nrow_tmp, ncol_tmp); if (byrow) { ncol_tmp = ncol_tmp - lag; } else { nrow_tmp = nrow_tmp - lag; } } /* (c) Last order of differences */ DIFF_X_MATRIX(tmp, nrow_tmp, ncol_tmp, byrow, lag, ans, nrow_ans, ncol_ans); /* Deallocate temporary work matrix */ Free(tmp); } /* if (differences ...) */ } /*************************************************************************** HISTORY: 2015-06-13 [DJ] o Supported subsetted computation. 2014-12-29 [HB] o Created. **************************************************************************/ matrixStats/src/rowCummaxs_lowlevel.h0000644000175100001440000000641313073627232017642 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowCummaxs_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummaxs_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummaxs_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummaxs_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummaxs_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummaxs_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummaxs_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummaxs_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummaxs_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, int *ans) void rowCummaxs_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummaxs_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummaxs_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummaxs_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummaxs_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummaxs_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummaxs_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummaxs_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) void rowCummaxs_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int byrow, double *ans) */ #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int byrow, ANS_C_TYPE *ans #define METHOD rowCummaxs #define COMP '>' #define METHOD_TEMPLATE_H "rowCumMinMaxs_lowlevel_template.h" #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #undef COMP matrixStats/src/x_OP_y_lowlevel.h0000644000175100001440000034347713073627232016710 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void x_OP_y_Add_int_int_arows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_arows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_arows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_irows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_irows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_irows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_drows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_drows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_drows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_arows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_arows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_arows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_irows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_irows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_irows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_drows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_drows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_drows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_arows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_arows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_arows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_irows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_irows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_irows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_drows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_drows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_int_drows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_arows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_arows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_arows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_irows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_irows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_irows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_drows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_drows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_drows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_arows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_arows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_arows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_irows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_irows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_irows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_drows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_drows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_drows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_arows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_arows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_arows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_irows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_irows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_irows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_drows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_drows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_int_dbl_drows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_arows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_arows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_arows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_irows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_irows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_irows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_drows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_drows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_drows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_arows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_arows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_arows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_irows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_irows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_irows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_drows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_drows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_drows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_arows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_arows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_arows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_irows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_irows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_irows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_drows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_drows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_int_drows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_arows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_arows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_arows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_irows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_irows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_irows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_drows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_drows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_drows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_arows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_arows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_arows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_irows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_irows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_irows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_drows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_drows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_drows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_arows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_arows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_arows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_irows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_irows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_irows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_drows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_drows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Add_dbl_dbl_drows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_int_arows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_arows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_arows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_irows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_irows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_irows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_drows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_drows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_drows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_arows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_arows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_arows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_irows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_irows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_irows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_drows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_drows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_drows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_arows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_arows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_arows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_irows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_irows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_irows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_drows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_drows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_int_drows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_arows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_arows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_arows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_irows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_irows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_irows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_drows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_drows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_drows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_arows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_arows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_arows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_irows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_irows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_irows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_drows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_drows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_drows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_arows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_arows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_arows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_irows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_irows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_irows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_drows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_drows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_int_dbl_drows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_arows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_arows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_arows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_irows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_irows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_irows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_drows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_drows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_drows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_arows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_arows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_arows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_irows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_irows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_irows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_drows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_drows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_drows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_arows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_arows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_arows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_irows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_irows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_irows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_drows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_drows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_int_drows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_arows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_arows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_arows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_irows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_irows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_irows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_drows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_drows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_drows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_arows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_arows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_arows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_irows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_irows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_irows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_drows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_drows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_drows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_arows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_arows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_arows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_irows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_irows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_irows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_drows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_drows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Sub_dbl_dbl_drows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_int_arows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_arows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_arows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_irows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_irows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_irows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_drows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_drows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_drows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_arows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_arows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_arows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_irows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_irows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_irows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_drows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_drows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_drows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_arows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_arows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_arows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_irows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_irows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_irows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_drows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_drows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_int_drows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, int *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_arows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_arows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_arows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_irows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_irows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_irows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_drows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_drows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_drows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_arows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_arows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_arows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_irows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_irows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_irows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_drows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_drows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_drows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_arows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_arows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_arows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_irows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_irows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_irows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_drows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_drows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_int_dbl_drows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_arows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_arows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_arows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_irows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_irows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_irows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_drows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_drows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_drows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_arows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_arows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_arows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_irows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_irows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_irows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_drows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_drows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_drows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_arows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_arows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_arows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_irows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_irows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_irows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_drows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_drows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_int_drows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_arows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_arows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_arows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_irows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_irows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_irows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_drows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_drows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_drows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_arows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_arows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_arows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_irows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_irows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_irows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_drows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_drows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_drows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_arows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_arows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_arows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_irows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_irows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_irows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_drows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_drows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Mul_dbl_dbl_drows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_arows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_arows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_arows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_irows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_irows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_irows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_drows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_drows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_drows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_arows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_arows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_arows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_irows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_irows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_irows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_drows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_drows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_drows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_arows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_arows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_arows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_irows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_irows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_irows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_drows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_drows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_int_drows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_arows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_arows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_arows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_irows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_irows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_irows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_drows_acols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_drows_icols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_drows_dcols_aidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_arows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_arows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_arows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_irows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_irows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_irows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_drows_acols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_drows_icols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_drows_dcols_iidxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_arows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_arows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_arows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_irows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_irows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_irows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_drows_acols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_drows_icols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_int_dbl_drows_dcols_didxs(int *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_arows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_arows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_arows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_irows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_irows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_irows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_drows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_drows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_drows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_arows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_arows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_arows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_irows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_irows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_irows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_drows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_drows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_drows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_arows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_arows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_arows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_irows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_irows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_irows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_drows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_drows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_int_drows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, int *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_arows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_arows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_arows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_irows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_irows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_irows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_drows_acols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_drows_icols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_drows_dcols_aidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_arows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_arows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_arows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_irows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_irows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_irows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_drows_acols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_drows_icols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_drows_dcols_iidxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_arows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_arows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_arows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_irows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_irows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_irows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_drows_acols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_drows_icols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) void x_OP_y_Div_dbl_dbl_drows_dcols_didxs(double *x, R_xlen_t nrow, R_xlen_t ncol, double *y, R_xlen_t ny, void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, void *yidxs, R_xlen_t nyidxs, int byrow, int commute, int narm, int hasna, double *ans, R_xlen_t n) */ #define METHOD_TEMPLATE_H "x_OP_y_lowlevel_template.h" #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, \ Y_C_TYPE *y, R_xlen_t ny, \ void *xrows, R_xlen_t nxrows, void *xcols, R_xlen_t nxcols, \ void *yidxs, R_xlen_t nyidxs, \ int byrow, int commute, \ int narm, int hasna, \ ANS_C_TYPE *ans, R_xlen_t n /* Addition */ #define METHOD x_OP_y_Add #define X_TYPE 'i' #define Y_TYPE 'i' #define ANS_TYPE 'i' #define OP '+' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'i' #define Y_TYPE 'r' #define ANS_TYPE 'r' #define OP '+' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'r' #define Y_TYPE 'i' #define ANS_TYPE 'r' #define OP '+' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'r' #define Y_TYPE 'r' #define ANS_TYPE 'r' #define OP '+' #include "000.templates-gen-matrix-vector.h" #undef METHOD /* Subtraction */ #define METHOD x_OP_y_Sub #define X_TYPE 'i' #define Y_TYPE 'i' #define ANS_TYPE 'i' #define OP '-' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'i' #define Y_TYPE 'r' #define ANS_TYPE 'r' #define OP '-' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'r' #define Y_TYPE 'i' #define ANS_TYPE 'r' #define OP '-' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'r' #define Y_TYPE 'r' #define ANS_TYPE 'r' #define OP '-' #include "000.templates-gen-matrix-vector.h" #undef METHOD /* Multiplication */ #define METHOD x_OP_y_Mul #define X_TYPE 'i' #define Y_TYPE 'i' #define ANS_TYPE 'i' #define OP '*' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'i' #define Y_TYPE 'r' #define ANS_TYPE 'r' #define OP '*' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'r' #define Y_TYPE 'i' #define ANS_TYPE 'r' #define OP '*' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'r' #define Y_TYPE 'r' #define ANS_TYPE 'r' #define OP '*' #include "000.templates-gen-matrix-vector.h" #undef METHOD /* Division */ #define METHOD x_OP_y_Div #define X_TYPE 'i' #define Y_TYPE 'i' #define ANS_TYPE 'r' #define OP '/' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'i' #define Y_TYPE 'r' #define ANS_TYPE 'r' #define OP '/' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'r' #define Y_TYPE 'i' #define ANS_TYPE 'r' #define OP '/' #include "000.templates-gen-matrix-vector.h" #define X_TYPE 'r' #define Y_TYPE 'r' #define ANS_TYPE 'r' #define OP '/' #include "000.templates-gen-matrix-vector.h" #undef METHOD matrixStats/src/rowSums2.c0000644000175100001440000000340213073627232015313 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowSums2(SEXP x, SEXP naRm, SEXP hasNA) SEXP colSums2(SEXP x, SEXP naRm, SEXP hasNA) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2017 **************************************************************************/ #include #include "000.types.h" #include "rowSums2_lowlevel.h" SEXP rowSums2(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP naRm, SEXP hasNA, SEXP byRow) { int narm, hasna, byrow; SEXP ans; R_xlen_t nrow, ncol; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); if (!byrow) { SWAP(R_xlen_t, nrow, ncol); SWAP(void*, crows, ccols); SWAP(R_xlen_t, nrows, ncols); SWAP(int, rowsType, colsType); } /* R allocate a double vector of length 'nrow' Note that 'nrow' means 'ncol' if byrow=FALSE. */ PROTECT(ans = allocVector(REALSXP, nrows)); /* Double matrices are more common to use. */ if (isReal(x)) { rowSums2_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, narm, hasna, byrow, REAL(ans)); } else if (isInteger(x)) { rowSums2_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, narm, hasna, byrow, REAL(ans)); } UNPROTECT(1); return(ans); } matrixStats/src/rowLogSumExp_lowlevel_template.h0000644000175100001440000000400213073627232021773 0ustar hornikusers/*********************************************************************** TEMPLATE: double rowLogSumExp_double[idxsType](ARGUMENTS_LIST) ARGUMENTS_LIST: double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, int rowsType, void *cols, R_xlen_t ncols, int colsType, int narm, int hasna, R_xlen_t byrow, double *ans ***********************************************************************/ #include "000.types.h" #include "000.templates-types.h" /* extern 1-D function 'logSumExp' */ extern double (*logSumExp_double[3])(double *x, void *idxs, R_xlen_t nidxs, int narm, int hasna, int by, double *xx); RETURN_TYPE METHOD_NAME_IDXS(ARGUMENTS_LIST) { R_xlen_t ii, idx; double navalue; double (*logsumexp)(double *x, void *idxs, R_xlen_t nidxs, int narm, int hasna, int by, double *xx); #ifdef IDXS_TYPE IDXS_C_TYPE *crows = (IDXS_C_TYPE*) rows; IDXS_C_TYPE *ccols = (IDXS_C_TYPE*) cols; #endif if (byrow) { /* R allocate memory for row-vector 'xx' of length 'ncol'. This will be taken care of by the R garbage collector later on. */ double *xx = (double *) R_alloc(ncols, sizeof(double)); navalue = (narm || ncols == 0) ? R_NegInf : NA_REAL; logsumexp = logSumExp_double[colsType]; for (ii=0; ii < nrows; ++ii) { idx = IDX_INDEX(crows,ii); if (idx == NA_R_XLEN_T) { ans[ii] = navalue; } else { ans[ii] = logsumexp(x+idx, cols, ncols, narm, hasna, nrow, xx); } } } else { navalue = (narm || nrows == 0) ? R_NegInf : NA_REAL; logsumexp = logSumExp_double[rowsType]; for (ii=0; ii < ncols; ++ii) { idx = R_INDEX_OP(IDX_INDEX(ccols,ii), *, nrow); if (idx == NA_R_XLEN_T) { ans[ii] = navalue; } else { ans[ii] = logsumexp(x+idx, rows, nrows, narm, hasna, 0, NULL); } } } /* if (byrow) */ } /*************************************************************************** HISTORY: 2013-06-12 [DH] o Created. **************************************************************************/ matrixStats/src/binCounts_lowlevel_template.h0000644000175100001440000000640313073627232021333 0ustar hornikusers/*************************************************************************** TEMPLATE: void binCounts_(...) GENERATES: void binCounts_L(double *x, int nx, double *bx, int nbins, int *count) void binCounts_R(double *x, int nx, double *bx, int nbins, int *count) Arguments: The following macros ("arguments") should be defined for the template to work as intended. - BIN_BY: 'L' or 'R' Copyright Henrik Bengtsson, 2012-2014 **************************************************************************/ #include #if BIN_BY == 'L' /* [u,v) */ #define METHOD_NAME binCounts_L #define IS_PART_OF_FIRST_BIN(x, bx0) (x < bx0) #define IS_PART_OF_NEXT_BIN(x, bx1) (x >= bx1) #elif BIN_BY == 'R' /* (u,v] */ #define METHOD_NAME binCounts_R #define IS_PART_OF_FIRST_BIN(x, bx0) (x <= bx0) #define IS_PART_OF_NEXT_BIN(x, bx1) (x > bx1) #endif void METHOD_NAME(double *x, R_xlen_t nx, double *bx, R_xlen_t nbins, int *count) { R_xlen_t ii = 0, jj = 0, iStart = 0; int n = 0; int warn = 0; // Count? if (nbins > 0) { // Skip to the first bin while ((iStart < nx) && IS_PART_OF_FIRST_BIN(x[iStart], bx[0])) { ++iStart; } // For each x... for (ii = iStart; ii < nx; ++ii) { // Skip to a new bin? while (IS_PART_OF_NEXT_BIN(x[ii], bx[jj+1])) { count[jj++] = n; // No more bins? if (jj >= nbins) { ii = nx; // Cause outer for-loop to exit break; } n = 0; } /* Although unlikely, with long vectors the count for a bin can become greater than what is possible to represent by an integer. Detect and warn about this. */ if (n == R_INT_MAX) { warn = 1; // No point in keep counting for this bin break; } // Count ++n; } // Update count of the last bin? if (jj < nbins) { count[jj] = n; // Assign the remaining bins to zero counts while (++jj < nbins) { count[jj] = 0; } } } // if (nbins > 0) if (warn) { warning("Integer overflow. Detected one or more bins with a count that is greater than what can be represented by the integer data type. Setting count to the maximum integer possible (.Machine$integer.max = %d). The bin mean is still correct.", R_INT_MAX); } } /* Undo template macros */ #undef BIN_BY #undef IS_PART_OF_FIRST_BIN #undef IS_PART_OF_NEXT_BIN #include "000.templates-types_undef.h" /*************************************************************************** HISTORY: 2014-11-07 [HB] o ROBUSTNESS: Added protection for integer overflow in bin counts. 2014-11-06 [HB] o CLEANUP: Moving away from R data types in low-level C functions. 2013-10-08 [HB] o Created template for binCounts_() to create functions that bin either by [u,v) or (u,v]. 2013-05-10 [HB] o SPEEDUP: binCounts() no longer tests in every iteration (=for every data point) whether the last bin has been reached or not. 2012-10-10 [HB] o BUG FIX: binCounts() would return random/garbage counts for bins that were beyond the last data point. o BUG FIX: In some cases binCounts() could try to go past the last bin. 2012-10-03 [HB] o Created. **************************************************************************/ matrixStats/src/rowMads.c0000644000175100001440000000422613073627232015173 0ustar hornikusers/*************************************************************************** Public methods: SEXP rowMads(SEXP x, ...) Authors: Henrik Bengtsson Copyright Henrik Bengtsson, 2014 **************************************************************************/ #include #include "000.types.h" #include "rowMads_lowlevel.h" SEXP rowMads(SEXP x, SEXP dim, SEXP rows, SEXP cols, SEXP constant, SEXP naRm, SEXP hasNA, SEXP byRow) { int narm, hasna, byrow; SEXP ans; R_xlen_t nrow, ncol; double scale; /* Argument 'x' and 'dim': */ assertArgMatrix(x, dim, (R_TYPE_INT | R_TYPE_REAL), "x"); nrow = asR_xlen_t(dim, 0); ncol = asR_xlen_t(dim, 1); /* Argument 'constant': */ if (!isNumeric(constant)) error("Argument 'constant' must be a numeric scale."); scale = asReal(constant); /* Argument 'naRm': */ narm = asLogicalNoNA(naRm, "na.rm"); /* Argument 'hasNA': */ hasna = asLogicalNoNA(hasNA, "hasNA"); /* Argument 'rows' and 'cols': */ R_xlen_t nrows, ncols; int rowsType, colsType; void *crows = validateIndices(rows, nrow, 0, &nrows, &rowsType); void *ccols = validateIndices(cols, ncol, 0, &ncols, &colsType); /* Argument 'byRow': */ byrow = asLogical(byRow); if (!byrow) { SWAP(R_xlen_t, nrow, ncol); SWAP(void*, crows, ccols); SWAP(R_xlen_t, nrows, ncols); SWAP(int, rowsType, colsType); } /* R allocate a double vector of length 'nrow' Note that 'nrow' means 'ncol' if byrow=FALSE. */ PROTECT(ans = allocVector(REALSXP, nrows)); /* Double matrices are more common to use. */ if (isReal(x)) { rowMads_dbl[rowsType][colsType](REAL(x), nrow, ncol, crows, nrows, ccols, ncols, scale, narm, hasna, byrow, REAL(ans)); } else if (isInteger(x)) { rowMads_int[rowsType][colsType](INTEGER(x), nrow, ncol, crows, nrows, ccols, ncols, scale, narm, hasna, byrow, REAL(ans)); } UNPROTECT(1); return(ans); } /* rowMads() */ /*************************************************************************** HISTORY: 2015-06-13 [DJ] o Supported subsetted computation. 2014-11-17 [HB] o Created from rowMedians.c. **************************************************************************/ matrixStats/src/validateIndices_lowlevel_template.h0000644000175100001440000001111413073627232022452 0ustar hornikusers/*********************************************************************** TEMPLATE: void validateIndices_(X_C_TYPE *idxs, R_xlen_t nidxs, R_xlen_t maxIdx, int allowOutOfBound, R_xlen_t *ansNidxs, int *subsettedType, int *hasna) Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i', 'r' ***********************************************************************/ #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) */ #include "000.templates-types.h" #undef int_from_idx_TYPE #undef dbl_from_idx_TYPE #if X_TYPE == 'i' #define int_from_idx_TYPE CONCAT_MACROS(int_from_idx, int) #define dbl_from_idx_TYPE CONCAT_MACROS(dbl_from_idx, int) #elif X_TYPE == 'r' #define int_from_idx_TYPE CONCAT_MACROS(int_from_idx, dbl) #define dbl_from_idx_TYPE CONCAT_MACROS(dbl_from_idx, dbl) #endif static R_INLINE int int_from_idx_TYPE(X_C_TYPE x, R_xlen_t maxIdx) { if (X_ISNAN(x)) return NA_INTEGER; #if X_TYPE == 'r' if (x > R_INT_MAX || x < R_INT_MIN) return NA_INTEGER; // including the cases of Inf #endif if (x > maxIdx) return NA_INTEGER; return x; } static R_INLINE int dbl_from_idx_TYPE(X_C_TYPE x, R_xlen_t maxIdx) { if (X_ISNAN(x)) return NA_REAL; #if X_TYPE == 'r' if (IS_INF(x)) return NA_REAL; #endif if (x > maxIdx) return NA_REAL; return x; } /** idxs must not be NULL, which should be checked before calling this function. **/ void* METHOD_NAME(X_C_TYPE *idxs, R_xlen_t nidxs, R_xlen_t maxIdx, int allowOutOfBound, R_xlen_t *ansNidxs, int *subsettedType, int *hasna) { // set default as no NA. *hasna = FALSE; // For a un-full positive legal idxs array, we should use SUBSETTED_INTEGER as default. *subsettedType = SUBSETTED_INTEGER; R_xlen_t ii, jj; int state = 0; R_xlen_t count = 0; Rboolean needReAlloc = FALSE; // figure out whether idxs are all positive or all negative. for (ii = 0; ii < nidxs; ++ ii) { X_C_TYPE idx = idxs[ii]; if (idx > 0 || X_ISNAN(idx) #if X_TYPE == 'r' || IS_INF(idx) #endif ) { if (state < 0) error("only 0's may be mixed with negative subscripts"); #if X_TYPE == 'r' if (IS_INF(idx)) { needReAlloc = TRUE; // need to realloc indices array to set inf to NA } else #endif if (!X_ISNAN(idx)) { if (idx > maxIdx) { if (!allowOutOfBound) error("subscript out of bounds"); *hasna = TRUE; // out-of-bound index is NA needReAlloc = TRUE; } #if X_TYPE == 'r' if (idx > R_INT_MAX) *subsettedType = SUBSETTED_REAL; #endif } else { *hasna = TRUE; } state = 1; ++ count; } else if (idx < 0) { if (state > 0) error("only 0's may be mixed with negative subscripts"); state = -1; needReAlloc = TRUE; } else { // idx == 0, need to realloc indices array needReAlloc = TRUE; } } if (state >= 0) *ansNidxs = count; if (!needReAlloc) { // must have: state >= 0 *subsettedType = SUBSETTED_DEFAULT; return idxs; } // fill positive idxs into ans if (state >= 0) { if (*subsettedType == SUBSETTED_INTEGER) { // NOTE: braces is needed here, because of macro-defined function RETURN_VALIDATED_ANS(int, nidxs, idxs[ii], int_from_idx_TYPE(idxs[ii],maxIdx),); } // *subsettedType == SUBSETTED_REAL RETURN_VALIDATED_ANS(double, nidxs, idxs[ii], dbl_from_idx_TYPE(idxs[ii],maxIdx),); } // state < 0 // use filter as bitset to find out all required idxs Rboolean *filter = Calloc(maxIdx, Rboolean); count = maxIdx; memset(filter, 0, maxIdx*sizeof(Rboolean)); // set to FALSE for (ii = 0; ii < nidxs; ++ ii) { R_xlen_t idx = -idxs[ii]; if (idx > 0 && idx <= maxIdx) { if (filter[idx-1] == 0) { -- count; filter[idx-1] = TRUE; } } } *ansNidxs = count; if (count == 0) { Free(filter); return NULL; } // find the biggest number 'upperBound' R_xlen_t upperBound; for (upperBound = maxIdx-1; upperBound >= 0; -- upperBound) { if (!filter[upperBound]) break; } ++ upperBound; if (upperBound > R_INT_MAX) *subsettedType = SUBSETTED_REAL; // fill required idxs into ans if (*subsettedType == SUBSETTED_INTEGER) { // NOTE: braces is needed here, because of macro-defined function RETURN_VALIDATED_ANS(int, upperBound, !filter[ii], ii + 1, Free(filter);); } // *subsettedType == SUBSETTED_REAL RETURN_VALIDATED_ANS(double, upperBound, !filter[ii], ii + 1, Free(filter);); } #include "000.templates-types_undef.h" matrixStats/src/000.templates-gen-vector.h0000644000175100001440000000052213073627232020122 0ustar hornikusers#include "000.macros.h" #include METHOD_TEMPLATE_H #define IDXS_TYPE 'i' #include METHOD_TEMPLATE_H #undef IDXS_TYPE #define IDXS_TYPE 'r' #include METHOD_TEMPLATE_H #undef IDXS_TYPE RETURN_TYPE (*METHOD_NAME[3])(ARGUMENTS_LIST) = { METHOD_NAME_aidxs, METHOD_NAME_iidxs, METHOD_NAME_didxs }; #include "000.templates-types_undef.h" matrixStats/src/rowCounts_lowlevel.h0000644000175100001440000001261713073627232017503 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowCounts_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void rowCounts_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void rowCounts_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void rowCounts_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void rowCounts_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void rowCounts_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void rowCounts_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void rowCounts_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void rowCounts_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, double value, int what, int narm, int hasna, int *ans) void rowCounts_lgl_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_lgl_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_lgl_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_lgl_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_lgl_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_lgl_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_lgl_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_lgl_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) void rowCounts_lgl_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int value, int what, int narm, int hasna, int *ans) */ #define METHOD rowCounts #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, X_C_TYPE value, int what, int narm, int hasna, int *ans #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" #define X_TYPE 'l' #include "000.templates-gen-matrix.h" matrixStats/src/sum2_lowlevel.h0000644000175100001440000000167713073627232016372 0ustar hornikusers#include #include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): double sum2_int_aidxs(int *x, R_xlen_t nx, int *idxs, R_xlen_t nidxs, int narm, int mode) double sum2_int_iidxs(int *x, R_xlen_t nx, int *idxs, R_xlen_t nidxs, int narm, int mode) double sum2_int_didxs(int *x, R_xlen_t nx, int *idxs, R_xlen_t nidxs, int narm, int mode) double sum2_dbl_aidxs(double *x, R_xlen_t nx, int *idxs, R_xlen_t nidxs, int narm, int mode) double sum2_dbl_iidxs(double *x, R_xlen_t nx, int *idxs, R_xlen_t nidxs, int narm, int mode) double sum2_dbl_didxs(double *x, R_xlen_t nx, int *idxs, R_xlen_t nidxs, int narm, int mode) */ #define METHOD sum2 #define RETURN_TYPE double #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nx, int *idxs, R_xlen_t nidxs, int narm, int mode #define X_TYPE 'i' #include "000.templates-gen-vector.h" #define X_TYPE 'r' #include "000.templates-gen-vector.h" matrixStats/src/000.templates-gen-matrix-vector.h0000644000175100001440000000534613073627232021435 0ustar hornikusers#include "000.macros.h" #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define ROWS_TYPE 'i' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #undef ROWS_TYPE #define ROWS_TYPE 'r' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #undef ROWS_TYPE #define IDXS_TYPE 'i' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define ROWS_TYPE 'i' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #undef ROWS_TYPE #define ROWS_TYPE 'r' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #undef ROWS_TYPE #undef IDXS_TYPE #define IDXS_TYPE 'r' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define ROWS_TYPE 'i' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #undef ROWS_TYPE #define ROWS_TYPE 'r' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #undef ROWS_TYPE #undef IDXS_TYPE RETURN_TYPE (*METHOD_NAME[3][3][3])(ARGUMENTS_LIST) = {{ {METHOD_NAME_arows_acols_aidxs, METHOD_NAME_arows_acols_iidxs, METHOD_NAME_arows_acols_didxs}, {METHOD_NAME_arows_icols_aidxs, METHOD_NAME_arows_icols_iidxs, METHOD_NAME_arows_icols_didxs}, {METHOD_NAME_arows_dcols_aidxs, METHOD_NAME_arows_dcols_iidxs, METHOD_NAME_arows_dcols_didxs}, }, { {METHOD_NAME_irows_acols_aidxs, METHOD_NAME_irows_acols_iidxs, METHOD_NAME_irows_acols_didxs}, {METHOD_NAME_irows_icols_aidxs, METHOD_NAME_irows_icols_iidxs, METHOD_NAME_irows_icols_didxs}, {METHOD_NAME_irows_dcols_aidxs, METHOD_NAME_irows_dcols_iidxs, METHOD_NAME_irows_dcols_didxs}, }, { {METHOD_NAME_drows_acols_aidxs, METHOD_NAME_drows_acols_iidxs, METHOD_NAME_drows_acols_didxs}, {METHOD_NAME_drows_icols_aidxs, METHOD_NAME_drows_icols_iidxs, METHOD_NAME_drows_icols_didxs}, {METHOD_NAME_drows_dcols_aidxs, METHOD_NAME_drows_dcols_iidxs, METHOD_NAME_drows_dcols_didxs}, } }; #include "000.templates-types_undef.h" matrixStats/src/colOrderStats_lowlevel_template.h0000644000175100001440000000464313073627232022163 0ustar hornikusers/*********************************************************************** TEMPLATE: void colOrderStats_[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, R_xlen_t qq, X_C_TYPE *ans Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' - ANS_TYPE: 'i' or 'r' Authors: Adopted from ditto for rows. Copyright: Henrik Bengtsson, 2007-2014 ***********************************************************************/ #include #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) ANS_TYPE => (ANS_SXP, ANS_NA, ANS_C_TYPE, ANS_IN_C) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj; R_xlen_t offset; X_C_TYPE *values; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; // Check missing rows for (ii=0; ii < nrows; ++ii) { if (ROW_INDEX(crows,ii) == NA_R_XLEN_T) break; } if (ii < nrows && ncols > 0) { error("Argument 'rows' must not contain missing value"); } #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; // Check missing cols for (jj=0; jj < ncols; ++jj) { if (COL_INDEX(ccols,jj) == NA_R_XLEN_T) break; } if (jj < ncols && nrows > 0) { error("Argument 'cols' must not contain missing value"); } #endif /* R allocate memory for the 'values'. This will be taken care of by the R garbage collector later on. */ values = (X_C_TYPE *) R_alloc(nrows, sizeof(X_C_TYPE)); for (jj=0; jj < ncols; jj++) { offset = COL_INDEX_NONA(ccols,jj) * nrow; for (ii=0; ii < nrows; ii++) values[ii] = x[ROW_INDEX_NONA(crows,ii) + offset]; /* Sort vector of length 'nrows' up to position 'qq'. "...partial sorting: they permute x so that x[qq] is in the correct place with smaller values to the left, larger ones to the right." */ X_PSORT(values, nrows, qq); ans[jj] = values[qq]; } } /*************************************************************************** HISTORY: 2015-07-08 [DJ] o Supported subsetted computation. 2014-11-16 [HB] o Created from rowOrderStats() ditto. **************************************************************************/ matrixStats/src/000.templates-gen-matrix.h0000644000175100001440000000162613073627232020132 0ustar hornikusers#include "000.macros.h" #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define ROWS_TYPE 'i' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #undef ROWS_TYPE #define ROWS_TYPE 'r' #include METHOD_TEMPLATE_H #define COLS_TYPE 'i' #include METHOD_TEMPLATE_H #undef COLS_TYPE #define COLS_TYPE 'r' #include METHOD_TEMPLATE_H #undef COLS_TYPE #undef ROWS_TYPE RETURN_TYPE (*METHOD_NAME[3][3])(ARGUMENTS_LIST) = { {METHOD_NAME_arows_acols, METHOD_NAME_arows_icols, METHOD_NAME_arows_dcols}, {METHOD_NAME_irows_acols, METHOD_NAME_irows_icols, METHOD_NAME_irows_dcols}, {METHOD_NAME_drows_acols, METHOD_NAME_drows_icols, METHOD_NAME_drows_dcols}, }; #include "000.templates-types_undef.h" matrixStats/src/colRanges_lowlevel_template.h0000644000175100001440000001441013073627232021301 0ustar hornikusers/*********************************************************************** TEMPLATE: void colRanges_[rowsType][colsType](ARGUMENTS_LIST) ARGUMENTS_LIST: X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int what, int narm, int hasna, X_C_TYPE *ans, int *is_counted Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD_NAME: the name of the resulting function - X_TYPE: 'i' or 'r' - ANS_TYPE: 'i' or 'r' Authors: Henrik Bengtsson. Copyright: Henrik Bengtsson, 2014 ***********************************************************************/ #include #include "000.types.h" /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, [METHOD_NAME]) ANS_TYPE => (ANS_SXP, ANS_NA, ANS_C_TYPE, ANS_IN_C) */ #include "000.templates-types.h" RETURN_TYPE METHOD_NAME_ROWS_COLS(ARGUMENTS_LIST) { R_xlen_t ii, jj; R_xlen_t colBegin, idx; X_C_TYPE value, *mins = NULL, *maxs = NULL; #ifdef ROWS_TYPE ROWS_C_TYPE *crows = (ROWS_C_TYPE*) rows; #endif #ifdef COLS_TYPE COLS_C_TYPE *ccols = (COLS_C_TYPE*) cols; #endif /* Rprintf("(nrow,ncol)=(%d,%d), what=%d\n", nrow, ncol, what); */ /* If there are no missing values, don't try to remove them. */ if (hasna == FALSE) narm = FALSE; if (hasna) { for (jj=0; jj < ncols; jj++) is_counted[jj] = 0; /* Missing values */ if (what == 0) { /* colMins() */ mins = ans; for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); value = R_INDEX_GET(x, idx, X_NA); if (X_ISNAN(value)) { if (!narm) { mins[jj] = value; is_counted[jj] = 1; /* Early stopping? */ #if X_TYPE == 'i' break; #elif X_TYPE == 'r' if (X_ISNA(value)) break; #endif } } else if (!is_counted[jj]) { mins[jj] = value; is_counted[jj] = 1; } else if (value < mins[jj]) { mins[jj] = value; } } } /* for (jj ...) */ #if X_TYPE == 'r' /* Handle zero non-missing values */ for (jj=0; jj < ncols; jj++) { if (!is_counted[jj]) { mins[jj] = R_PosInf; } } #endif } else if (what == 1) { /* colMaxs() */ maxs = ans; for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); value = R_INDEX_GET(x, idx, X_NA); if (X_ISNAN(value)) { if (!narm) { maxs[jj] = value; is_counted[jj] = 1; /* Early stopping? */ #if X_TYPE == 'i' break; #elif X_TYPE == 'r' if (X_ISNA(value)) break; #endif } } else if (!is_counted[jj]) { maxs[jj] = value; is_counted[jj] = 1; } else if (value > maxs[jj]) { maxs[jj] = value; } } } /* for (jj ...) */ #if X_TYPE == 'r' /* Handle zero non-missing values */ for (jj=0; jj < ncols; jj++) { if (!is_counted[jj]) { maxs[jj] = R_NegInf; } } #endif } else if (what == 2) { /* colRanges() */ mins = ans; maxs = &ans[ncols]; for (jj=0; jj < ncols; jj++) { colBegin = R_INDEX_OP(COL_INDEX(ccols,jj), *, nrow); for (ii=0; ii < nrows; ii++) { idx = R_INDEX_OP(colBegin, +, ROW_INDEX(crows,ii)); value = R_INDEX_GET(x, idx, X_NA); if (X_ISNAN(value)) { if (!narm) { mins[jj] = value; maxs[jj] = value; is_counted[jj] = 1; /* Early stopping? */ #if X_TYPE == 'i' break; #elif X_TYPE == 'r' if (X_ISNA(value)) break; #endif } } else if (!is_counted[jj]) { mins[jj] = value; maxs[jj] = value; is_counted[jj] = 1; } else if (value < mins[jj]) { mins[jj] = value; } else if (value > maxs[jj]) { maxs[jj] = value; } } } /* for (jj ...) */ #if X_TYPE == 'r' /* Handle zero non-missing values */ for (jj=0; jj < ncols; jj++) { if (!is_counted[jj]) { mins[jj] = R_PosInf; maxs[jj] = R_NegInf; } } #endif } /* if (what ...) */ } else { /* No missing values */ if (what == 0) { /* colMins() */ mins = ans; /* Initiate results */ for (jj=0; jj < ncols; jj++) { mins[jj] = x[jj]; } for (jj=1; jj < ncols; jj++) { colBegin = COL_INDEX_NONA(ccols,jj) * nrow; for (ii=0; ii < nrows; ii++) { value = x[ROW_INDEX_NONA(crows,ii)+colBegin]; if (value < mins[jj]) mins[jj] = value; } } } else if (what == 1) { /* colMax() */ maxs = ans; /* Initiate results */ for (jj=0; jj < ncols; jj++) { maxs[jj] = x[jj]; } for (jj=1; jj < ncols; jj++) { colBegin = COL_INDEX_NONA(ccols,jj) * nrow; for (ii=0; ii < nrows; ii++) { value = x[ROW_INDEX_NONA(crows,ii)+colBegin]; if (value > maxs[jj]) maxs[jj] = value; } } } else if (what == 2) { /* colRanges()*/ mins = ans; maxs = &ans[ncols]; /* Initiate results */ for (jj=0; jj < ncols; jj++) { mins[jj] = x[jj]; maxs[jj] = x[jj]; } for (jj=1; jj < ncols; jj++) { colBegin = COL_INDEX_NONA(ccols,jj) * nrow; for (ii=0; ii < nrows; ii++) { value = x[ROW_INDEX_NONA(crows,ii)+colBegin]; if (value < mins[jj]) { mins[jj] = value; } else if (value > maxs[jj]) { maxs[jj] = value; } } } } /* if (what ...) */ } /* if (narm) */ } /*************************************************************************** HISTORY: 2015-06-07 [DJ] o Supported subsetted computation. 2014-11-16 [HB] o Created. **************************************************************************/ matrixStats/src/rowRanges_lowlevel.h0000644000175100001440000000753113073627232017446 0ustar hornikusers#include #include "000.types.h" #include "000.utils.h" /* Native API (dynamically generated via macros): void rowRanges_int_arows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void rowRanges_int_arows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void rowRanges_int_arows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void rowRanges_int_irows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void rowRanges_int_irows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void rowRanges_int_irows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void rowRanges_int_drows_acols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void rowRanges_int_drows_icols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void rowRanges_int_drows_dcols(int *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, int *ans, int *is_counted) void rowRanges_dbl_arows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void rowRanges_dbl_arows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void rowRanges_dbl_arows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void rowRanges_dbl_irows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void rowRanges_dbl_irows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void rowRanges_dbl_irows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void rowRanges_dbl_drows_acols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void rowRanges_dbl_drows_icols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) void rowRanges_dbl_drows_dcols(double *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t Rf_nrows, void *cols, R_xlen_t Rf_ncols, int what, int narm, int hasna, double *ans, int *is_counted) */ #define METHOD rowRanges #define RETURN_TYPE void #define ARGUMENTS_LIST X_C_TYPE *x, R_xlen_t nrow, R_xlen_t ncol, void *rows, R_xlen_t nrows, void *cols, R_xlen_t ncols, int what, int narm, int hasna, X_C_TYPE *ans, int *is_counted #define X_TYPE 'i' #include "000.templates-gen-matrix.h" #define X_TYPE 'r' #include "000.templates-gen-matrix.h" matrixStats/NAMESPACE0000644000175100001440000000416413070644022014035 0ustar hornikusers# Generated by roxygen2: do not edit by hand export(allValue) export(allocArray) export(allocMatrix) export(allocVector) export(anyMissing) export(anyValue) export(binCounts) export(binMeans) export(colAlls) export(colAnyMissings) export(colAnyNAs) export(colAnys) export(colAvgsPerRowSet) export(colCollapse) export(colCounts) export(colCummaxs) export(colCummins) export(colCumprods) export(colCumsums) export(colDiffs) export(colIQRDiffs) export(colIQRs) export(colLogSumExps) export(colMadDiffs) export(colMads) export(colMaxs) export(colMeans2) export(colMedians) export(colMins) export(colOrderStats) export(colProds) export(colQuantiles) export(colRanges) export(colRanks) export(colSdDiffs) export(colSds) export(colSums2) export(colTabulates) export(colVarDiffs) export(colVars) export(colWeightedMads) export(colWeightedMeans) export(colWeightedMedians) export(colWeightedSds) export(colWeightedVars) export(count) export(diff2) export(indexByRow) export(iqr) export(iqrDiff) export(logSumExp) export(madDiff) export(mean2) export(meanOver) export(product) export(rowAlls) export(rowAnyMissings) export(rowAnyNAs) export(rowAnys) export(rowAvgsPerColSet) export(rowCollapse) export(rowCounts) export(rowCummaxs) export(rowCummins) export(rowCumprods) export(rowCumsums) export(rowDiffs) export(rowIQRDiffs) export(rowIQRs) export(rowLogSumExps) export(rowMadDiffs) export(rowMads) export(rowMaxs) export(rowMeans2) export(rowMedians) export(rowMins) export(rowOrderStats) export(rowProds) export(rowQuantiles) export(rowRanges) export(rowRanks) export(rowSdDiffs) export(rowSds) export(rowSums2) export(rowTabulates) export(rowVarDiffs) export(rowVars) export(rowWeightedMads) export(rowWeightedMeans) export(rowWeightedMedians) export(rowWeightedSds) export(rowWeightedVars) export(sdDiff) export(signTabulate) export(sum2) export(sumOver) export(t_tx_OP_y) export(validateIndices) export(varDiff) export(weightedMad) export(weightedMean) export(weightedMedian) export(weightedSd) export(weightedVar) export(x_OP_y) importFrom(stats,mad) importFrom(stats,median) importFrom(stats,quantile) useDynLib("matrixStats", .registration = TRUE, .fixes = "C_") matrixStats/NEWS0000644000175100001440000011234313073627103013320 0ustar hornikusersPackage: matrixStats ==================== Version: 0.52.2 [2017-04-13] BUG FIX: o Several of the row- and column-based functions would core dump R if the matrix was of a data type other than logical, integer, or numeric, e.g. character or complex. This is now detected and an informative error is produced instead. Similarly, some vector-based functions could potentially core dump R or silently return a nonsense result. Thank you Hervé Pagès, Bioconductor Core, for the report. DEPRECATED AND DEFUNCT: o rowVars(..., method = "0.14.2") that was added for very unlikely needs of backward compatibility of an invalid degree-of-freedom term is deprecated. Version: 0.52.1 [2017-04-04] BUG FIX: o The package test on matrixStats:::benchmark() tried to run even if not all suggested packages were available. Version: 0.52.0 [2017-04-03] SIGNIFICANT CHANGES: o Since anyNA() is a built-in function since R (>= 3.1.0), please use that instead of anyMissing() part of this package. The latter will eventually be deprecated. For consistency with the anyNA() name, colAnyNAs() and rowAnyNAs() are now also available replacing the identically colAnyMissings() and rowAnyMissings() functions, which will also be deprecated in a future release. o meanOver() was renamed to mean2() and sumOver() was renamed to sum2(). NEW FEATURES: o Added colSums2() and rowSums2() which work like colSums() and rowSums() of the base package but also supports efficient subsetting via optional arguments 'rows' and 'cols'. o Added colMeans2() and rowMeans2() which work like colMeans() and rowMeans() of the base package but also supports efficient subsetting via optional arguments 'rows' and 'cols'. o Functions colDiffs() and rowDiffs() gained argument 'dim.'. o Functions colWeightedMads() and rowWeightedMads() gained arguments 'constant' and 'center'. The current implementation only support scalars for these arguments, which means that the same values are applied to all columns and rows, respectively. In previous version a hard-to-understand error would be produced if 'center' was of length greater than one; now an more informative error message is given. o Package is now silent when loaded; it no longer displays a startup message. SOFTWARE QUALITY: o Continuous-integration testing is now also done on macOS, in addition to Linux and Windows. o ROBUSTNESS: Package now registers the native API using also R_useDynamicSymbols(). CODE REFACTORING: o Cleaned up native low-level API and renamed native source code files to make it easier to navigate the native API. o Now using roxygen for help and NAMESPACE (was R.oo::Rdoc). BUG FIXES: o rowAnys(x) on numeric matrices 'x' would return rowAnys(x == 1) and not rowAnys(x != 0). Same for colAnys(), rowAlls(), and colAlls(). Thanks Richard Cotton for reporting on this. o sumOver(x) and meanOver(x) would incorrectly return -Inf or +Inf if the intermediate sum would have that value, even if one of the following elements would turn the intermediate sum into NaN or NA, e.g. with 'x' as c(-Inf, NaN), c(-Inf, +Inf), or c(+Inf, NA). o WORKAROUND: Benchmark reports generated by matrixStats:::benchmark() would use any custom R prompt that is currently set in the R session, which may not render very well. Now it forces the prompt to be the built-in "> " one. DEPRECATED AND DEFUNCT: o The package API is only intended for matrices and vectors of type numeric, integer and logical. However, a few functions would still return if called with a data.frame. This was never intended to work and is now an error. Specifically, functions colAlls(), colAnys(), colProds(), colQuantiles(), colIQRs(), colWeightedMeans(), colWeightedMedians(), and colCollapse() now produce warnings if called with a data.frame. Same for the corresponding row- functions. The use of a data.frame will be produce an error in future releases. o meanOver() and sumOver() are deprecated because they were renamed to mean2() and sum2(), respectively. o Previously deprecated (and ignored) argument 'flavor' of colRanks() and rowRanks() is now defunct. Version: 0.51.0 [2016-10-08] PERFORMANCE AND MEMORY: o SPEEDUP / CLEANUP: rowMedians() and colMedians() are now plain functions. They were previously S4 methods (due to a Bioconductor legacy). The package no longer imports the methods package. o SPEEDUP: Now native API is formally registered allowing for faster lookup of routines from R. Version: 0.50.2 [2016-04-24] BUG FIXES: o Package now installs on R (>= 2.12.0) as claimed. Thanks to Mikko Korpela at Aalto University School of Science, Finland, for troubleshooting and providing a fix. o logSumExp(c(-Inf, -Inf, ...)) would return NaN rather than -Inf. Thanks to Jason Xu (University of Washington) for reporting and Brennan Vincent for troubleshooting and contributing a fix. Version: 0.50.1 [2015-12-14] BUG FIXES: o The Undefined Behavior Sanitizer (UBsan) reported on a memcall(src, dest, 0) call when dest == null. Thanks to Brian Ripley and the CRAN check tools for catching this. We could reproduce this with gcc 5.1.1 but not with gcc 4.9.2. Version: 0.50.0 [2015-12-13] NEW FEATURES: o MAJOR FEATURE UPDATE: Subsetting arguments 'idxs', 'rows' and 'cols' were added to all functions such that the calculations are performed on the requested subset while avoiding creating a subsetted copy, i.e. rowVars(x, cols = 4:6) is a much faster and more memory efficient version than rowVars(x[, 4:6]) and even yet more efficient than apply(x, MARGIN = 1L, FUN = var). These features were added by Dongcan Jiang, Peking University, with support from the Google Summer of Code program. A great thank you to Dongcan and to Google for making this possible. Version: 0.15.0 [2015-10-26] NEW FEATURES: o CONSISTENCY: Now all weight arguments ('w' and 'W') default to NULL, which corresponds to uniform weights. CODE REFACTORING: o ROBUSTNESS: Importing 'stats' functions in namespace. BUG FIXES: o weightedVar(x, w) used the wrong bias correction factor resulting in an estimate that was tau too large, where tau = ((sum(w) - 1) / sum(w)) / ((length(w) - 1) / length(w)). Thanks to Wolfgang Abele for reporting and troubleshooting on this. o weightedVar(x) with length(x) = 1 returned 0 no NA. Same for weightedSd(). o weightedMedian(x, w = NA_real_) returned 'x' rather than NA_real_. This only happened for length(w) = 1. o allocArray(dim) failed for prod(dim) >= .Machine$integer.max. DEPRECATED AND DEFUNCT: o CLEANUP: Defunct argument 'centers' for col-/rowMads(); use 'center'. Version: 0.14.2 [2015-06-23] BUG FIXES: o x_OP_y() and t_tx_OP_y() would return garbage on Solaris SPARC (and possibly other architectures as well) when input was integer and had missing values. Version: 0.14.1 [2015-06-17] BUG FIXES: o product(x, na.rm = FALSE) for integer 'x' with both zeros and NAs returned zero rather than NA. o weightedMean(x, w, na.rm = TRUE) did not handle missing values in 'x' properly, if it was an integer. It would also return NaN if there were weights 'w' with missing values, whereas stats::weighted.mean() would skip such data points. Now weightedMean() does the same. o (col|row)WeightedMedians() did not handle infinite weights as weightedMedian() does. o x_OP_y(x, y, OP, na.rm = FALSE) returned garbage iff 'x' or 'y' had missing values of type integer. o rowQuantiles() and rowIQRs() did not work for single-row matrices. Analogously for the corresponding column functions. o rowCumsums(), rowCumprods() rowCummins(), and rowCummaxs(), accessed out-of-bound elements for Nx0 matrices where N > 0. The corresponding column methods has similar memory errors for 0xK matrices where K > 0. o anyMissing(list(NULL)) returned NULL; now FALSE. o rowCounts() resulted in garbage if a previous column had NAs (because it forgot to update index kk in such cases). o rowCumprods(x) handled missing values and zeros incorrectly for integer 'x (not double); a zero would trump an existing missing value causing the following cumulative products to become zero. It was only a zero that trumped NAs; any other integer would work as expected. Note, this bug was not in colCumprods(). o rowAnys(x, value, na.rm = FALSE) did not handle missing values in a numeric 'x' properly. Similarly, for non-numeric and non-logical 'x', row- and colAnys(), row- and colAlls(), anyValue() and allValue() did not handle when 'value' was a missing value. o All of the above bugs were identified and fixed by Dongcan Jiang (Peking University, China), who also added corresponding unit tests. Version: 0.14.0 [2015-02-13] SIGNIFICANT CHANGES: o CLEANUP: anyMissing() is no longer an S4 generic. This was done as part of the migration of making all functions of matrixStats plain R functions, which minimizes calling overhead and it will also allow us to drop 'methods' from the package dependencies. I've scanned all CRAN and Bioconductor packages depending on matrixStats and none of them relied on anyMissing() dispatching on class, so hopefully this move has little impact. The only remaining S4 methods are now colMedians() and rowMedians(). NEW FEATURES: o CONSISTENCY: Renamed argument 'centers' of col- and rowMads() to 'center'. This is consistent with col- and rowVars(). o CONSISTENCY: col- and rowVars() now use na.rm = FALSE as the default (na.rm = TRUE was mistakenly introduced as the default in v0.9.7). PERFORMANCE AND MEMORY: o SPEEDUP: The check for user interrupts at the C level is now done less frequently of the functions. It does every k:th iteration, where k = 2^20, which is tested for using (iter % k == 0). It turns out, at least with the default compiler optimization settings that I use, that this test is 3 times faster if k = 2^n where n is an integer. The following functions checks for user interrupts: logSumExp(), (col|row)LogSumExps(), (col|row)Medians(),, (col|row)Mads(), (col|row)Vars(), and (col|row)Cum(Min|Max|prod|sum)s(). o SPEEDUP: logSumExp(x) is now faster if 'x' does not contain any missing values. It is also faster if all values are missing or the maximum value is +Inf - in both cases it can skip the actual summation step. SOFTWARE QUALITY: o ROBUSTNESS/TESTS: Package tests cover 96% of the code (was 91%). CODE REFACTORING: o CLEANUP: Package no longer depends on R.methodsS3. BUG FIXES: o all() and any() flavored methods on non-numeric and non-logical (e.g. character) vectors and matrices with na.rm = FALSE did not give results consistent with all() and any() if there were missing values. For example, with x <- c("a", NA, "b") we have all(x == "a") == FALSE and any(x == "a") == TRUE whereas our corresponding methods would return NA in those cases. The methods fixed are allValue(), anyValue(), col- and rowAlls(), and col- and rowAnys(). Added more package tests to cover these cases. o logSumExp(x, na.rm = TRUE) would return NA if all values were NA and length(x) > 1. Now it returns -Inf for all length(x):s. Version: 0.13.1 [2015-01-21] BUG FIXES: o diff2() with differences >= 3 would *read* spurious values beyond the allocated memory. This error, introduced in 0.13.0, was harmless in the sense that the returned value was unaffected and still correct. Thanks to Brian Ripley and the CRAN check tools for catching this. I could reproduce it locally with 'valgrind'. Version: 0.13.0 [2015-01-20] SIGNIFICANT CHANGES: o SPEEDUP/CLEANUP: Turned several S3 and S4 methods into plain R functions, which decreases the overhead of calling the functions. After this there are no longer any S3 methods. Remaining S4 methods are anyMissing() and rowMedians(). NEW FEATURES: o Added weightedMean(), which is ~10 times faster than stats::weighted.mean(). o Added count(x, value) which is a notably faster than sum(x == value). This can also be used to count missing values etc. o Added allValue() and anyValue() for all(x == value) and any(x == value). o Added diff2(), which is notably faster than base::diff() for vectors, which it is designed for. o Added iqrDiff() and (col|row)IqrDiffs(). o CONSISTENCY: Now rowQuantiles(x, na.rm = TRUE) returns all NAs for rows with missing values. Analogously for colQuantiles(), colIQRs(), rowIQRs() and iqr(). Previously, all these functions gave an error saying missing values are not allowed. o COMPLETENESS: Added corresponding "missing" vector functions for already existing column and row functions. Similarly, added "missing" column and row functions for already existing vector functions, e.g. added iqr() and count() to complement already existing (col|row)IQRs() and (col|row)Counts() functions. o ROBUSTNESS: Now column and row methods give slightly more informative error messages if a data.frame is passed instead of a matrix. DOCUMENTATION: o DOCUMENTATION: Added vignette summarizing available functions. PERFORMANCE AND MEMORY: o SPEEDUP: (col|row)Diffs() are now implemented in native code and notably faster than diff() for matrices. o SPEEDUP: Made binCounts() and binMeans() a bit faster. o SPEEDUP: Implemented weightedMedian() in native code, which made it ~3-10 times faster. Dropped support for ties = "both", because it would have to return two values in case of ties, which made the API unnecessarily complicated. If really needed, then call the function twice with ties = "min" and ties = "max". o SPEEDUP: (col|row)Anys() and (col|row)Alls() is now notably faster compared to previous versions. CODE REFACTORING: o CLEANUP: In the effort of migrating anyMissing() into a plain R function, the specific anyMissing() implementations for data.frame:s and and list:s were dropped and is now handled by anyMissing() for "ANY", which is the only S4 method remaining now. In a near future release, this remaining "ANY" method will turned into a plain R function and the current S4 generic will be dropped. We know of know CRAN and Bioconductor packages that relies on it being a generic function. Note also that since R (>= 3.1.0) there is a base::anyNA() function that does the exact same thing making anyMissing() obsolete. BUG FIXES: o weightedMedian(..., ties = "both") would give an error if there was a tie. Added package test for this case. Version: 0.12.2 [2014-12-07] BUG FIXES: o CODE FIX: The native code for product() on integer vector incorrectly used C-level abs() on intermediate values despite those being doubles requiring fabs(). Despite this, the calculated product would still be correct (at least when validated on several local setups as well as on the CRAN servers). Again, thanks to Brian Ripley for pointing out another invalid integer-double coersion at the C level. Version: 0.12.1 [2014-12-06] SOFTWARE QUALITY: o ROBUSTNESS: Updated package tests to check methods in more scenarios, especially with both integer and numeric input data. BUG FIXES: o (col|row)Cumsums(x) where 'x' is integer would return garbage for columns (rows) containing missing values. o rowMads(x) where 'x' is numeric (not integer) would give incorrect results for rows that had an *odd* number of values (no ties). Analogously issues with colMads(). Added package tests for such cases too. Thanks to Brian Ripley and the CRAN check tools for (yet again) catching another coding mistake. Details: This was because the C-level calculation of the absolute value of residuals toward the median would use integer-based abs() rather than double-based fabs(). Now it fabs() is used when the values are double and abs() when they are integers. Version: 0.12.0 [2014-12-05] o Submitted to CRAN. Version: 0.11.9 [2014-11-26] NEW FEATURES: o Added (col|row)Cumsums(), (col|row)Cumprods(), (col|row)Cummins(), and (col|row)Cummaxs(). BUG FIXES: o (col|row)WeightedMeans() with all zero weights gave mean estimates with values 0 instead of NaN. Version: 0.11.8 [2014-11-25] PERFORMANCE AND MEMORY: o SPEEDUP: Implemented (col|row)Mads(), (col|row)Sds() and (col|row)Vars() in native code. o SPEEDUP: Made (col|row)Quantiles(x) faster for 'x' without missing values (and default type = 7L quantiles). It should still be implemented in native code though. o SPEEDUP: Made rowWeightedMeans() faster. BUG FIXES: o (col|row)Medians(x) when 'x' is integer would give invalid median values in case (a) it was calculated as the mean of two values ("ties"), and (b) the sum of those values where greater than .Machine$integer.max. Now such ties are calculated using floating point precision. Add lots of package tests. Version: 0.11.6 [2014-11-16] PERFORMANCE AND MEMORY: o SPEEDUP: Now (col|row)Mins(), (col|row)Maxs() and (col|row)Ranges() are implemented in native code providing a significant speedup. o SPEEDUP: Now colOrderStats() also is implemented in native code, which indirectly makes colMins(), colMaxs() and colRanges() faster. o SPEEDUP: colTabulates(x) no longer uses rowTabulates(t(x)). o SPEEDUP: colQuantiles(x) no longer uses rowQuantiles(t(x)). DEPRECATED AND DEFUNCT: o CLEANUP: Argument 'flavor' of (col|row)Ranks() is now ignored. Version: 0.11.5 [2014-11-15] SIGNIFICANT CHANGES: o (col|row)Prods() now uses default method = "direct" (was "expSumLog"). PERFORMANCE AND MEMORY: o SPEEDUP: Now colCollapse(x) no longer utilizes rowCollapse(t(x)). Added package tests for (col|row)Collapse(). o SPEEDUP: Now colDiffs(x) no longer uses rowDiffs(t(x)). Added package tests for (col|row)Diffs(). o SPEEDUP: Package no longer utilizes match.arg() due to its overhead; methods sumOver(), (col|row)Prods() and (col|row)Ranks() were updated. Version: 0.11.4 [2014-11-14] NEW FEATURES: o Added support for vector input to several of the row- and column methods as long as the "intended" matrix dimension is specified via argument 'dim'. For instance, rowCounts(x, dim = c(nrow, ncol)) is the same as rowCounts(matrix(x, nrow, ncol)), but more efficient since it avoids creating/allocating a temporary matrix. PERFORMANCE AND MEMORY: o SPEEDUP: Now colCounts() is implemented in native code. Moreover, (col|row)Counts() are now also implemented in native code for logical input (previously only for integer and double input). Added more package tests and benchmarks for these functions. Version: 0.11.3 [2014-11-11] SIGNIFICANT CHANGES: o Turned sdDiff(), madDiff(), varDiff(), weightedSd(), weightedVar() and weightedMad() into plain functions (were generic functions). CODE REFACTORING: o Removed unnecessary usage of '::'. Version: 0.11.2 [2014-11-09] SIGNIFICANT CHANGES: o SPEEDUP: Implemented indexByRow() in native code and it is no longer a generic function, but a regular function, which is also faster to call. The first argument of indexByRow() has been changed to 'dim' such that one should use indexByRow(dim(X)) instead of indexByRow(X) as in the past. The latter form is still supported, but deprecated. NEW FEATURES: o Added allocVector(), allocMatrix() and allocArray() for faster allocation numeric vectors, matrices and arrays, particularly when filled with non-missing values. DEPRECATED AND DEFUNCT: o Calling indexByRow(X) with a matrix 'X' is deprectated. Instead call it with indexByRow(dim(X)). Version: 0.11.1 [2014-11-07] NEW FEATURES: o Better support for long vectors. o PRECISION: Using greater floating-point precision in more internal intermediate calculations, where possible. SOFTWARE QUALITY: o ROBUSTNESS: Although unlikely, with long vectors support for binCounts() and binMeans() it is possible that a bin gets a higher count than what can be represented by an R integer (.Machine$integer.max = 2^31-1). If that happens, an informative warning is generated and the bin count is set to .Machine$integer.max. If this happens for binMeans(), the corresponding mean is still properly calculated and valid. CODE REFACTORING: o CLEANUP: Cleanup and harmonized the internal C API such there are two well defined API levels. The high-level API is called by R via .Call() and takes care of most of the argument validation and construction of the return value. This function dispatch to functions in the low-level API based on data type(s) and other arguments. The low-level API is written to work with basic C data types only. BUG FIXES: o Package incorrectly redefined R_xlen_t on R (>= 3.0.0) systems where LONG_VECTOR_SUPPORT is not supported. Version: 0.11.0 [2014-11-02] NEW FEATURES: o Added sumOver() and meanOver(), which are notably faster versions of sum(x[idxs]) and mean(x[idxs]). Moreover, instead of having to do sum(as.numeric(x)) to avoid integer overflow when 'x' is an integer vector, one can do sumOver(x, mode = "numeric"), which avoids the extra copy created when coercing to numeric (this numeric copy is also twice as large as the integer vector). Added package tests and benchmark reports for these functions. Version: 0.10.4 [2014-11-01] PERFORMANCE AND MEMORY: o SPEEDUP: Made anyMissing(), logSumExp(), (col|row)Medians(), (col|row)Counts() slightly faster by making the native code assign the results directly to the native vector instead of to the R vector, e.g. ansp[i] = v where ansp = REAL(ans) instead of REAL(ans)[i] = v. o Added benchmark reports for anyMissing() and logSumExp(). Version: 0.10.3 [2014-10-01] BUG FIXES: o binMeans() returned 0.0 instead of NA_real_ for empty bins. Version: 0.10.2 [2014-09-01] BUG FIXES: o On some systems, the package failed to build on R (<= 2.15.3) with compilation error: "redefinition of typedef 'R_xlen_t'". Version: 0.10.1 [2014-06-09] PERFORMANCE AND MEMORY: o Added benchmark reports for also non-matrixStats functions col/rowSums() and col/rowMeans(). o Now all colNnn() and rowNnn() methods are benchmarked in a combined report making it possible to also compare colNnn(x) with rowNnn(t(x)). Version: 0.10.0 [2014-06-07] SOFTWARE QUALITY: o Relaxed some packages tests such that they assert numerical correctness via all.equal() rather than identical(). o Submitted to CRAN. BUG FIXES: o The package tests for product() incorrectly assumed that the value of prod(c(NaN, NA)) is uniquely defined. However, as documented in help("is.nan"), it may be NA or NaN depending on R system/platform. Version: 0.9.7 [2014-06-05] BUG FIXES: o Introduced a bug in v0.9.5 causing col- and rowVars() and hence also col- and rowSds() to return garbage. Add package tests for these now. o Submitted to CRAN. Version: 0.9.6 [2014-06-04] NEW FEATURES: o Added signTabulate() for tabulating the number of negatives, zeros, positives and missing values. For doubles, the number of negative and positive infinite values are also counted. PERFORMANCE AND MEMORY: o SPEEDUP: Now col- and rowProds() utilizes new product() function. o SPEEDUP: Added product() for calculating the product of a numeric vector via the logarithm. Version: 0.9.5 [2014-06-04] SIGNIFICANT CHANGES: o SPEEDUP: Made weightedMedian() a plain function (was an S3 method). o CLEANUP: Now only exporting plain functions and generic functions. o SPEEDUP: Turned more S4 methods into S3 methods, e.g. rowCounts(), rowAlls(), rowAnys(), rowTabulates() and rowCollapse(). NEW FEATURES: o Added argument 'method' to col- and rowProds() for controlling how the product is calculated. PERFORMANCE AND MEMORY: o SPEEDUP: Package is now byte compiled. o SPEEDUP: Made rowProds() and rowTabulates() notably faster. o SPEEDUP: Now rowCounts(), rowAnys(), rowAlls() and corresponding column methods can search for any value in addition to the default TRUE. The search for a matching integer or double value is done in native code, which is notably faster (and more memory efficient because it avoids creating any new objects). o SPEEDUP: Made colVars() and colSds() notably faster and rowVars() and rowSds() a slightly bit faster. o Added benchmark reports, e.g. matrixStats:::benchmark('colMins'). Version: 0.9.4 [2014-05-23] SIGNIFICANT CHANGES: o SPEEDUP: Turned several S4 methods into S3 methods, e.g. indexByRow(), madDiff(), sdDiff() and varDiff(). Version: 0.9.3 [2014-04-26] NEW FEATURES: o Added argument 'trim' to madDiff(), sdDiff() and varDiff(). Version: 0.9.2 [2014-04-04] BUG FIXES: o The native code of binMeans(x, bx) would try to access an out-of-bounds value of argument 'y' iff 'x' contained elements that are left of all bins in 'bx'. This bug had no impact on the results and since no assignment was done it should also not crash/core dump R. This was discovered thanks to new memtests (ASAN and valgrind) provided by CRAN. Version: 0.9.1 [2014-03-31] BUG FIXES: o rowProds() would throw "Error in rowSums(isNeg) : 'x' must be an array of at least two dimensions" on matrices where all rows contained at least one zero. Thanks to Roel Verbelen at KU Leuven for the report. Version: 0.9.0 [2014-03-26] NEW FEATURES: o Added weighedVar() and weightedSd(). Version: 0.8.14 [2013-11-23] PERFORMANCE AND MEMORY: o MEMORY: Updated all functions to do a better job of cleaning out temporarily allocated objects as soon as possible such that the garbage collector can remove them sooner, iff wanted. This increase the chance for a smaller memory footprint. o Submitted to CRAN. Version: 0.8.13 [2013-10-08] NEW FEATURES: o Added argument 'right' to binCounts() and binMeans() to specify whether binning should be done by (u,v] or [u,v). Added system tests validating the correctness of the two cases. CODE REFACTORING: o Bumped up package dependencies. Version: 0.8.12 [2013-09-26] PERFORMANCE AND MEMORY: o SPEEDUP: Now utilizing anyMissing() everywhere possible. Version: 0.8.11 [2013-09-21] SOFTWARE QUALITY: o ROBUSTNESS: Now importing 'loadMethod' from 'methods' package such that 'matrixStats' S4-based methods also work when 'methods' is not loaded, e.g. when 'Rscript' is used, cf. Section 'Default packages' in 'R Installation and Administration'. o ROBUSTNESS: Updates package system tests such that the can run with only the 'base' package loaded. Version: 0.8.10 [2013-09-15] CODE REFACTORING: o CLEANUP: Now only importing two functions from the 'methods' package. o Bumped up package dependencies. Version: 0.8.9 [2013-08-29] NEW FEATURES: o CLEANUP: Now the package startup message acknowledges argument 'quietly' of library()/require(). Version: 0.8.8 [2013-07-29] DOCUMENTATION: o The dimension of the return value was swapped in help("rowQuantiles"). Version: 0.8.7 [2013-07-28] PERFORMANCE AND MEMORY: o SPEEDUP: Made (col|row)Mins() and (col|row)Maxs() much faster. BUG FIXES: o rowRanges(x) on an Nx0 matrix would give an error. Same for colRanges(x) on an 0xN matrix. Added system tests for these and other special cases. Version: 0.8.6 [2013-07-20] CODE REFACTORING: o Bumped up package dependencies. BUG FIXES: o Forgot to declare S3 methods (col|row)WeightedMedians(). Version: 0.8.5 [2013-05-25] PERFORMANCE AND MEMORY: o Minor speedup of (col|row)Tabulates() by replacing rm() calls with NULL assignments. Version: 0.8.4 [2013-05-20] DOCUMENTATION: o CRAN POLICY: Now all Rd \usage{} lines are at most 90 characters long. Version: 0.8.3 [2013-05-10] PERFORMANCE AND MEMORY: o SPEEDUP: binCounts() and binMeans() now uses Hoare's Quicksort for presorting 'x' before counting/averaging. They also no longer test in every iteration (== for every data point) whether the last bin has been reached or not, but only after completing a bin. Version: 0.8.2 [2013-05-02] DOCUMENTATION: o Minor corrections and updates to help pages. Version: 0.8.1 [2013-05-02] BUG FIXES: o Native code of logSumExp() used an invalid check for missing value of an integer argument. Detected by Brian Ripley upon CRAN submission. Version: 0.8.0 [2013-05-01] NEW FEATURES: o Added logSumExp(lx) and (col|row)LogSumExps(lx) for accurately computing of log(sum(exp(lx))) for standalone vectors, and row and column vectors of matrices. Thanks to Nakayama (Japan) for the suggestion and contributing a draft in R. Version: 0.7.1 [2013-04-23] NEW FEATURES: o Added argument 'preserveShape' to colRanks(). For backwardcompatibility the default is preserveShape = FALSE, but it may change in the future. BUG FIXES: o Since v0.6.4, (col|row)Ranks() gave the incorrect results for integer matrices with missing values. o Since v0.6.4, (col|row)Medians() for integers would calculate ties as floor(tieAvg). Version: 0.7.0 [2013-01-14] NEW FEATURES: o Now (col|row)Ranks() support "max" (default), "min" and "average" for argument 'ties.method'. Added system tests validation these cases. Thanks Peter Langfelder (UCLA) for contributing this. Version: 0.6.4 [2013-01-13] NEW FEATURES: o Added argument 'ties.method' to rowRanks() and colRanks(), but still only support for "max" (as before). CODE REFACTORING: o ROBUSTNESS: Lots of cleanup of the internal/native code. Native code for integer and double cases have been harmonized and are now generated from a common code template. This was inspired by code contributions from Peter Langfelder (UCLA). Version: 0.6.3 [2013-01-13] NEW FEATURES: o Added anyMissing() for data type 'raw', which always returns FALSE. SOFTWARE QUALITY: o ROBUSTNESS: Added system test for anyMissing(). o ROBUSTNESS: Now S3 methods are declared in the namespace. Version: 0.6.2 [2012-11-15] SOFTWARE QUALITY: o CRAN POLICY: Made example(weightedMedian) faster. Version: 0.6.1 [2012-10-10] BUG FIXES: o In some cases binCounts() and binMeans() could try to go past the last bin resulting a core dump. o binCounts() and binMeans() would return random/garbage values for bins that were beyond the last data point. Version: 0.6.0 [2012-10-04] NEW FEATURES: o Added binMeans() for fast sample-mean calculation in bins. Thanks to Martin Morgan at the Fred Hutchinson Cancer Research Center, Seattle, for contributing the core code for this. o Added binCounts() for fast element counting in bins. Version: 0.5.3 [2012-09-10] SOFTWARE QUALITY: o CRAN POLICY: Replaced the .Internal(psort(...)) call with a call to a new internal partial sorting function, which utilizes the native rPsort() part of the R internals. Version: 0.5.2 [2012-07-02] CODE REFACTORING: o Updated package dependencies to match CRAN. Version: 0.5.1 [2012-06-25] NEW FEATURES: o GENERALIZATION: Now (col|row)Prods() handle missing values. CODE REFACTORING: o Package now only imports the 'methods' package. BUG FIXES: o In certain cases, (col|row)Prods() would return NA instead of 0 for some elements. Added a redundancy test for the case. Thanks Brenton Kenkel at University of Rochester for reporting on this. Version: 0.5.0 [2012-04-16] NEW FEATURES: o Added weightedMad() from aroma.core v2.5.0. o Added weightedMedian() from aroma.light v1.25.2. CODE REFACTORING: o This package no longer depends on the aroma.light package for any of its functions. o Now this package only imports R.methodsS3, meaning it no longer loads R.methodsS3 when it is loaded. Version: 0.4.5 [2012-03-19] NEW FEATURES: o Updated the default argument 'centers' of rowMads()/colMads() to explicitly be (col|row)Medians(x,...). The default behavior has not changed. Version: 0.4.4 [2012-03-05] SOFTWARE QUALITY: o ROBUSTNESS: Added system/redundancy tests for rowMads()/colMads(). o CRAN: Made the system tests "lighter" by default, but full tests can still be run, cf. tests/*.R scripts. BUG FIXES: o colMads() would return the incorrect estimates. This bug was introduced in matrixStats v0.4.0 (2011-11-11). Version: 0.4.3 [2011-12-11] BUG FIXES: o rowMedians(..., na.rm = TRUE) did not handle NaN (only NA). The reason for this was the the native code used ISNA() to test for NA and NaN, but it should have been ISNAN(), which is opposite to how is.na() and is.nan() at the R level work. Added system tests for this case. Version: 0.4.2 [2011-11-29] NEW FEATURES: o Added rowAvgsPerColSet() and colAvgsPerRowSet(). Version: 0.4.1 [2011-11-25] DOCUMENTATION: o Added help pages with an example to rowIQRs() and colIQRs(). o Added example to rowQuantiles(). BUG FIXES: o rowIQRs() and colIQRs() would return the 25% and the 75% quantiles, not the difference between them. Thanks Pierre Neuvial at CNRS, Evry, France for the report. Version: 0.4.0 [2011-11-11] SIGNIFICANT CHANGES: o Dropped the previously introduced expansion of 'center' in rowMads() and colMads(). It added unnecessary overhead if not needed. NEW FEATURES: o Added rowRanks() and colRanks(). Thanks Hector Corrada Bravo (University of Maryland) and Harris Jaffee (John Hopkins). Version: 0.3.0 [2011-10-13] PERFORMANCE AND MEMORY: o SPEEDUP/LESS MEMORY: colMedians(x) no longer uses rowMedians(t(x)); instead there is now an optimized native-code implementation. Also, colMads() utilizes the new colMedians() directly. This improvement was kindly contributed by Harris Jaffee at Biostatistics of John Hopkins, USA. SOFTWARE QUALITY: o Added additional unit tests for colMedians() and rowMedians(). Version: 0.2.2 [2010-10-06] NEW FEATURES: o Now the result of (col|row)Quantiles() contains column names. Version: 0.2.1 [2010-04-05] NEW FEATURES: o Added a startup message when package is loaded. CODE REFACTORING: o CLEANUP: Removed obsolete internal .First.lib() and .Last.lib(). Version: 0.2.0 [2010-03-30] o DOCUMENTATION: Fixed some incorrect cross references. Version: 0.1.9 [2010-02-03] BUG FIXES: o (col|row)WeightedMeans(..., na.rm = TRUE) would incorrectly treat missing values as zeros. Added corresponding redundancy tests (also for the median case). Thanks Pierre Neuvial for reporting this. Version: 0.1.8 [2009-11-13] BUG FIXES: o colRanges(x) would return a matrix of wrong dimension if 'x' did not have any missing values. This would affect all functions relying on colRanges(), e.g. colMins() and colMaxs(). Added a redundancy test for this case. Thanks Pierre Neuvial at UC Berkeley for reporting this. o (col|row)Ranges() return a matrix with dimension names. Version: 0.1.7 [2009-06-20] BUG FIXES: o WORKAROUND: Cannot use "%#x" in rowTabulates() when creating the column names of the result matrix. It gave an error OSX with R v2.9.0 devel (2009-01-13 r47593b) current the OSX server at R-forge. Version: 0.1.6 [2009-06-17] DOCUMENTATION: o Updated the help example for rowWeightedMedians() to run conditionally on aroma.light, which is only a suggested package - not a required one. This in order to prevent R CMD check to fail on CRAN, which prevents it for building binaries (as it currently happens on their OSX servers). Version: 0.1.5 [2009-02-04] BUG FIXES: o For some errors in rowOrderStats(), the stack would not become UNPROTECTED before calling error. Version: 0.1.4 [2009-02-02] NEW FEATURES: o Added methods (col|row)Weighted(Mean|Median)s() for weighted averaging. DOCUMENTATION: o Added help to more functions. SOFTWARE QUALITY: o Package passes R CMD check flawlessly. Version: 0.1.3 [2008-07-30] NEW FEATURES: o Added (col|row)Tabulates() for integer and raw matrices. BUG FIXES: o rowCollapse(x) was broken and returned the wrong elements. Version: 0.1.2 [2008-04-13] NEW FEATURES: o Added (col|row)Collapse(). o Added varDiff(), sdDiff() and madDiff(). o Added indexByRow(). Version: 0.1.1 [2008-03-25] NEW FEATURES: o Added (col|row)OrderStats(). o Added (col|row)Ranges() and (col|row)(Min|Max)s(). o Added colMedians(). o Now anyMissing() support most data types as structures. Version: 0.1.0 [2007-11-26] NEW FEATURES: o Imported the rowNnn() methods from Biobase. o Created. matrixStats/R/0000755000175100001440000000000013073627232013021 5ustar hornikusersmatrixStats/R/signTabulate.R0000644000175100001440000000165213073232324015564 0ustar hornikusers#' Calculates the number of negative, zero, positive and missing values #' #' Calculates the number of negative, zero, positive and missing values in a #' \code{\link[base]{numeric}} vector. For \code{\link[base]{double}} vectors, #' the number of negative and positive infinite values are also counted. #' #' #' @param x a \code{\link[base]{numeric}} \code{\link[base]{vector}}. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{name}}d \code{\link[base]{numeric}} #' \code{\link[base]{vector}}. #' #' @author Henrik Bengtsson #' @seealso \code{\link[base]{sign}}(). #' @keywords internal #' @export signTabulate <- function(x, idxs = NULL, ...) { res <- .Call(C_signTabulate, x, idxs) names(res) <- c("-1", "0", "+1", "NA", "-Inf", "+Inf")[1:length(res)] res } matrixStats/R/rowMeans2.R0000644000175100001440000000300613073232324015012 0ustar hornikusers#' Calculates the mean for each row (column) in a matrix #' #' Calculates the mean for each row (column) in a matrix. #' #' The implementation of \code{rowMeans2()} and \code{colMeans2()} is #' optimized for both speed and memory. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s #' are excluded first, otherwise not. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @author Henrik Bengtsson #' #' @keywords array iteration robust univar #' @export rowMeans2 <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) has_nas <- TRUE return(.Call(C_rowMeans2, x, dim., rows, cols, na.rm, has_nas, TRUE)) } #' @rdname rowMeans2 #' @export colMeans2 <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) has_nas <- TRUE return(.Call(C_rowMeans2, x, dim., rows, cols, na.rm, has_nas, FALSE)) } matrixStats/R/diff2.R0000644000175100001440000000254313073232324014134 0ustar hornikusers#' Fast lagged differences #' #' Computes the lagged and iterated differences. #' #' @param x A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length #' N. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param lag An \code{\link[base]{integer}} specifying the lag. #' #' @param differences An \code{\link[base]{integer}} specifying the order of #' difference. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N - \code{differences}. #' #' @examples #' diff2(1:10) #' #' @author Henrik Bengtsson #' #' @seealso \code{\link[base]{diff}}(). #' @keywords univar internal #' #' @export diff2 <- function(x, idxs = NULL, lag = 1L, differences = 1L, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'lag': if (length(lag) != 1L) { stop("Argument 'lag' is not a scalar: ", length(lag)) } # Argument 'differences': if (length(differences) != 1L) { stop("Argument 'differences' is not a scalar: ", length(differences)) } lag <- as.integer(lag) differences <- as.integer(differences) .Call(C_diff2, x, idxs, lag, differences) } matrixStats/R/rowRanks.R0000644000175100001440000001043413073232324014746 0ustar hornikusers#' Gets the rank of each row (column) of a matrix #' #' Gets the rank of each row (column) of a matrix. #' #' The row ranks of \code{x} are collected as \emph{rows} of the result matrix. #' #' The column ranks of \code{x} are collected as \emph{rows} if #' \code{preserveShape = FALSE}, otherwise as \emph{columns}. #' #' The implementation is optimized for both speed and memory. To avoid #' coercing to \code{\link[base]{double}}s (and hence memory allocation), there #' is a unique implementation for \code{\link[base]{integer}} matrices. It is #' more memory efficient to do \code{colRanks(x, preserveShape = TRUE)} than #' \code{t(colRanks(x, preserveShape = FALSE))}. #' #' Any \code{\link[base]{names}} of \code{x} are ignored and absent in the #' result. #' #' @param x A \code{\link[base]{numeric}} or \code{\link[base]{integer}} NxK #' \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param ties.method A \code{\link[base]{character}} string specifying how #' ties are treated. For details, see below. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param preserveShape A \code{\link[base]{logical}} specifying whether the #' \code{\link[base]{matrix}} returned should preserve the input shape of #' \code{x}, or not. #' #' @param ... Not used. #' #' @return An \code{\link[base]{integer}} \code{\link[base]{matrix}} is #' returned. The \code{rowRanks()} function always returns an NxK #' \code{\link[base]{matrix}}, where N (K) is the number of rows (columns) #' whose ranks are calculated. #' #' The \code{colRanks()} function returns an NxK \code{\link[base]{matrix}}, if #' \code{preserveShape = TRUE}, otherwise a KxN \code{\link[base]{matrix}}. #' #' %% The mode of the returned matrix is \code{\link[base]{integer}}, except #' for %% \code{ties.method == "average"} when it is #' \code{\link[base]{double}}. #' #' @section Missing and non- values: These are ranked as \code{NA}, as with #' \code{na.last = "keep"} in the \code{\link[base]{rank}}() function. #' #' @author Hector Corrada Bravo and Harris Jaffee. Peter Langfelder for adding #' 'ties.method' support. Henrik Bengtsson adapted the original native #' implementation of \code{rowRanks()} from Robert Gentleman's \code{rowQ()} in #' the \pkg{Biobase} package. #' #' @seealso \code{\link[base]{rank}}(). For developers, see also Section #' 'Utility functions' in 'Writing R Extensions manual', particularly the #' native functions \code{R_qsort_I()} and \code{R_qsort_int_I()}. #' @keywords array iteration robust univar #' #' @export rowRanks <- function(x, rows = NULL, cols = NULL, ties.method = c("max", "average", "min"), dim. = dim(x), ...) { # Argument 'ties.method': ties.method <- ties.method[1L] if (is.element("flavor", names(list(...)))) { .Defunct(msg = "Argument 'flavor' of rowRanks() is defunct.", package = "matrixStats") } ties_method <- charmatch(ties.method, c("max", "average", "min"), nomatch = 0L) if (ties_method == 0L) { stop("Unknown value of argument 'ties.method': ", ties.method) } dim. <- as.integer(dim.) # byrow = TRUE .Call(C_rowRanksWithTies, x, dim., rows, cols, ties_method, TRUE) } #' @rdname rowRanks #' @export colRanks <- function(x, rows = NULL, cols = NULL, ties.method = c("max", "average", "min"), dim. = dim(x), preserveShape = FALSE, ...) { # Argument 'ties.method': ties.method <- ties.method[1L] if (is.element("flavor", names(list(...)))) { .Defunct(msg = "Argument 'flavor' of colRanks() is defunct.", package = "matrixStats") } # Argument 'preserveShape' preserveShape <- as.logical(preserveShape) ties_method <- charmatch(ties.method, c("max", "average", "min"), nomatch = 0L) if (ties_method == 0L) { stop("Unknown value of argument 'ties.method': ", ties.method) } dim. <- as.integer(dim.) # byrow = FALSE y <- .Call(C_rowRanksWithTies, x, dim., rows, cols, ties_method, FALSE) if (!preserveShape) y <- t(y) y } matrixStats/R/rowCollapse.R0000644000175100001440000000541613073232620015435 0ustar hornikusers#' Extracts one cell per row (column) from a matrix #' #' Extracts one cell per row (column) from a matrix. The implementation is #' optimized for memory and speed. #' #' @param x An NxK \code{\link[base]{matrix}}. #' #' @param idxs An index \code{\link[base]{vector}} of (maximum) length N (K) #' specifying the columns (rows) to be extracted. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{vector}} of length N (K). #' #' @example incl/rowCollapse.R #' #' @author Henrik Bengtsson #' #' @seealso \emph{Matrix indexing} to index elements in matrices and arrays, #' cf. \code{\link[base]{[}}(). #' @keywords utilities #' @export rowCollapse <- function(x, idxs, rows = NULL, dim. = dim(x), ...) { # Argument 'x': if (!is.matrix(x) && !is.vector(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix or a vector. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Apply subset if (is.vector(x)) dim(x) <- dim. if (!is.null(rows)) { x <- x[rows, , drop = FALSE] idxs <- idxs[rows] } dim. <- dim(x) # Argument 'idxs': idxs <- rep(idxs, length.out = dim.[1L]) # Columns of interest cols <- 0:(dim.[2L] - 1L) cols <- cols[idxs] # Calculate column-based indices idxs <- dim.[1L] * cols + seq_len(dim.[1L]) cols <- NULL # Not needed anymore x[idxs] } #' @rdname rowCollapse #' @export colCollapse <- function(x, idxs, cols = NULL, dim. = dim(x), ...) { # Argument 'x': if (!is.matrix(x) && !is.vector(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix or a vector. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Apply subset if (is.vector(x)) dim(x) <- dim. if (!is.null(cols)) { x <- x[, cols, drop = FALSE] idxs <- idxs[cols] } dim. <- dim(x) # Argument 'idxs': idxs <- rep(idxs, length.out = dim.[2L]) # Rows of interest rows <- seq_len(dim.[1L]) rows <- rows[idxs] # Calculate column-based indices idxs <- dim.[1L] * 0:(dim.[2L] - 1L) + rows rows <- NULL # Not needed anymore x[idxs] } matrixStats/R/weightedMean.R0000644000175100001440000000500213073232324015534 0ustar hornikusers#' Weighted Arithmetic Mean #' #' Computes the weighted sample mean of a numeric vector. #' #' #' @param x a \code{\link[base]{numeric}} \code{\link[base]{vector}} containing #' the values whose weighted mean is to be computed. #' #' @param w a vector of weights the same length as \code{x} giving the weights #' to use for each element of \code{x}. Negative weights are treated as zero #' weights. Default value is equal weight to all values. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm a logical value indicating whether \code{\link[base]{NA}} #' values in \code{x} should be stripped before the computation proceeds, or #' not. If \code{\link[base]{NA}}, no check at all for \code{\link[base]{NA}}s #' is done. Default value is \code{\link[base]{NA}} (for efficiency). #' #' @param refine If \code{\link[base:logical]{TRUE}} and \code{x} is #' \code{\link[base]{numeric}}, then extra effort is used to calculate the #' average with greater numerical precision, otherwise not. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} scalar. If \code{x} is of #' zero length, then \code{NaN} is returned, which is consistent with #' \code{\link[base]{mean}}(). #' #' @example incl/weightedMean.R #' #' @section Missing values: This function handles missing values consistently #' \code{\link[stats]{weighted.mean}}. More precisely, if \code{na.rm = FALSE}, #' then any missing values in either \code{x} or \code{w} will give result #' \code{NA_real_}. If \code{na.rm = TRUE}, then all \code{(x, w)} data points #' for which \code{x} is missing are skipped. Note that if both \code{x} and #' \code{w} are missing for a data points, then it is also skipped (by the same #' rule). However, if only \code{w} is missing, then the final results will #' always be \code{NA_real_} regardless of \code{na.rm}. #' #' @author Henrik Bengtsson #' #' @seealso \code{\link[base]{mean}}() and \code{\link[stats]{weighted.mean}}. #' @keywords univar robust #' @export weightedMean <- function(x, w = NULL, idxs = NULL, na.rm = FALSE, refine = FALSE, ...) { # Argument 'refine': refine <- as.logical(refine) # Argument 'w': if (is.null(w)) { ## We won't fall back to stats::mean(), because it's has some overhead ## and it doesn't support refine = FALSE. w <- rep(1, times = length(x)) } else { w <- as.numeric(w) } .Call(C_weightedMean, x, w, idxs, na.rm, refine) } matrixStats/R/rowProds.R0000644000175100001440000000766113073232555014775 0ustar hornikusers#' Calculates the product for each row (column) in a matrix #' #' Calculates the product for each row (column) in a matrix. #' #' If \code{method = "expSumLog"}, then then \code{\link{product}}() function is #' used, which calculates the produce via the logarithmic transform (treating #' negative values specially). This improves the precision and lowers the risk #' for numeric overflow. If \code{method = "direct"}, the direct product is #' calculated via the \code{\link[base]{prod}}() function. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param idxs,rows,cols A \code{\link[base]{vector}} indicating subset of #' elements (or rows and/or columns) to operate over. If #' \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, missing values are #' ignored, otherwise not. #' #' @param method A \code{\link[base]{character}} string specifying how each #' product is calculated. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @section Missing values: #' Note, if \code{method = "expSumLog"}, \code{na.rm = FALSE}, and \code{x} #' contains missing values (\code{\link[base]{NA}} or #' \code{\link[base:is.finite]{NaN}}), then the calculated value is also #' missing value. Note that it depends on platform whether #' \code{\link[base:is.finite]{NaN}} or \code{\link[base]{NA}} is returned #' when an \code{\link[base:is.finite]{NaN}} exists, cf. #' \code{\link[base]{is.nan}}(). #' #' @author Henrik Bengtsson #' #' @keywords array iteration robust univar #' @export rowProds <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, method = c("direct", "expSumLog"), ...) { # Argument 'x': if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Preallocate result (zero:ed by default) n <- nrow(x) y <- double(length = n) # Nothing todo? if (n == 0L) return(y) # Argument 'method': method <- method[1L] # How to calculate product? if (method == "expSumLog") { prod <- product } else if (method == "direct") { } else { stop("Unknown value of argument 'method': ", method) } for (ii in seq_len(n)) { y[ii] <- prod(x[ii, , drop = TRUE], na.rm = na.rm) } y } #' @rdname rowProds #' @export colProds <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, method = c("direct", "expSumLog"), ...) { # Argument 'x': if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Preallocate result (zero:ed by default) n <- ncol(x) y <- double(length = n) # Nothing todo? if (n == 0L) return(y) # Argument 'method': method <- method[1L] # How to calculate product? if (method == "expSumLog") { prod <- product } else if (method == "direct") { } else { stop("Unknown value of argument 'method': ", method) } for (ii in seq_len(n)) { y[ii] <- prod(x[, ii, drop = TRUE], na.rm = na.rm) } y } matrixStats/R/x_OP_y.R0000644000175100001440000000466113073232324014342 0ustar hornikusers#' Fast calculation of 'z <- x OP y' and 'z <- t(t(x) OP y)' #' #' Fast calculation of 'z <- x OP y' and 'z <- t(t(x) OP y)', where OP can be #' +, -, *, and /. For + and *, na.rm = TRUE will drop missing values first. #' #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param y A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length #' L. #' #' @param OP A \code{\link[base]{character}} specifying which operator to use. #' #' @param xrows,xcols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over 'x'. If \code{\link[base]{NULL}}, no #' subsetting is done. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over 'y'. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param commute If \code{\link[base:logical]{TRUE}}, 'y OP x' ('t(y OP #' t(x))') is calculated, otherwise 'x OP y' ('t(t(x) OP y)'). #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, missing values are #' ignored, otherwise not. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} NxK #' \code{\link[base]{matrix}}. #' #' @example incl/x_OP_y.R #' #' @section Missing values: If \code{na.rm = TRUE}, then missing values are #' "dropped" before applying the operator to each pair of values. For #' instance, if \code{x[1, 1]} is a missing value, then the result of #' \code{x[1, 1] + y[1]} equals \code{y[1]}. If also \code{y[1]} is a missing #' value, then the result is a missing value. This only applies to additions #' and multiplications. For subtractions and divisions, argument \code{na.rm} #' is ignored. #' #' @author Henrik Bengtsson #' #' @keywords internal #' @export x_OP_y <- function(x, y, OP, xrows = NULL, xcols = NULL, yidxs = NULL, commute = FALSE, na.rm = FALSE) { commute <- as.logical(commute) na.rm <- as.logical(na.rm) op <- charmatch(OP, c("+", "-", "*", "/"), nomatch = 0L) stopifnot(op > 0L) .Call(C_x_OP_y, x, y, dim(x), op, xrows, xcols, yidxs, commute, na.rm, TRUE, FALSE) } #' @rdname x_OP_y #' @export t_tx_OP_y <- function(x, y, OP, xrows = NULL, xcols = NULL, yidxs = NULL, commute = FALSE, na.rm = FALSE) { commute <- as.logical(commute) na.rm <- as.logical(na.rm) op <- charmatch(OP, c("+", "-", "*", "/"), nomatch = 0L) stopifnot(op > 0L) .Call(C_x_OP_y, x, y, dim(x), op, xrows, xcols, yidxs, commute, na.rm, TRUE, TRUE) } matrixStats/R/validateIndices.R0000644000175100001440000000126313073232324016230 0ustar hornikusers#' Validate indices #' #' Computes validated positive indices from given indices. #' #' #' @param idxs A \code{\link[base]{integer}} \code{\link[base]{vector}}. If #' \code{\link[base]{NULL}}, all indices are considered. #' #' @param maxIdx The possible max index. #' #' @param allowOutOfBound Allow positive out of bound to indicate #' \code{\link[base]{NA}}. #' #' @return Returns a validated integers list indicating the indices. #' #' @example incl/validateIndices.R #' #' @keywords internal #' @export validateIndices <- function(idxs = NULL, maxIdx, allowOutOfBound = TRUE) { ans <- .Call(C_validate, idxs, maxIdx, allowOutOfBound) if (is.null(ans)) ans <- seq_len(maxIdx) ans } matrixStats/R/rowRanges.R0000644000175100001440000000527713073232324015120 0ustar hornikusers#' Gets the range of values in each row (column) of a matrix #' #' Gets the range of values in each row (column) of a matrix. #' #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s #' are excluded first, otherwise not. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return \code{rowRanges()} (\code{colRanges()}) returns a #' \code{\link[base]{numeric}} Nx2 (Kx2) \code{\link[base]{matrix}}, where N #' (K) is the number of rows (columns) for which the ranges are calculated. #' #' \code{rowMins()/rowMaxs()} (\code{colMins()/colMaxs()}) returns a #' \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). #' #' @author Henrik Bengtsson #' #' @seealso \code{\link{rowOrderStats}}() and \code{\link[base]{pmin.int}}(). #' #' @keywords array iteration robust univar #' #' @export rowRanges <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) .Call(C_rowRanges, x, dim., rows, cols, 2L, na.rm, TRUE) } #' @rdname rowRanges #' @export rowMins <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) .Call(C_rowRanges, x, dim., rows, cols, 0L, na.rm, TRUE) } #' @rdname rowRanges #' @export rowMaxs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) .Call(C_rowRanges, x, dim., rows, cols, 1L, na.rm, TRUE) } #' @rdname rowRanges #' @export colRanges <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) .Call(C_colRanges, x, dim., rows, cols, 2L, na.rm, TRUE) } #' @rdname rowRanges #' @export colMins <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) .Call(C_colRanges, x, dim., rows, cols, 0L, na.rm, TRUE) } #' @rdname rowRanges #' @export colMaxs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) .Call(C_colRanges, x, dim., rows, cols, 1L, na.rm, TRUE) } matrixStats/R/rowAlls.R0000644000175100001440000002224113073232674014572 0ustar hornikusers#' Checks if a value exists / does not exist in each row (column) of a matrix #' #' Checks if a value exists / does not exist in each row (column) of a matrix. #' #' These functions takes either a matrix or a vector as input. If a vector, #' then argument \code{dim.} must be specified and fulfill \code{prod(dim.) == #' length(x)}. The result will be identical to the results obtained when #' passing \code{matrix(x, nrow = dim.[1L], ncol = dim.[2L])}, but avoids #' having to temporarily create/allocate a matrix, if only such is needed #' only for these calculations. #' #' @param x An NxK \code{\link[base]{matrix}} or an N * K #' \code{\link[base]{vector}}. #' #' @param idxs,rows,cols A \code{\link[base]{vector}} indicating subset of #' elements (or rows and/or columns) to operate over. If #' \code{\link[base]{NULL}}, no subsetting is done. #' #' @param value A value to search for. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s #' are excluded first, otherwise not. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return \code{rowAlls()} (\code{colAlls()}) returns an #' \code{\link[base]{logical}} \code{\link[base]{vector}} of length N (K). #' Analogously for \code{rowAnys()} (\code{rowAlls()}). #' #' @section Logical \code{value}: #' When \code{value} is logical, the result is as if the function is applied #' on \code{as.logical(x)}. More specifically, if \code{x} is numeric, then #' all zeros are treates as \code{FALSE}, non-zero values as \code{TRUE}, #' and all missing values as \code{NA}. #' #' @example incl/rowAlls.R #' #' @author Henrik Bengtsson #' @seealso rowCounts #' @keywords array logic iteration univar #' @export rowAlls <- function(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) { if (is.numeric(x) && is.logical(value) && !is.na(value)) { na.rm <- as.logical(na.rm) has_nas <- TRUE ## rowAlls(x, value = ) == !rowAnys(x, value = !) value <- !value counts <- .Call(C_rowCounts, x, dim., rows, cols, value, 1L, na.rm, has_nas) (counts == 0L) } else if (is.numeric(x) || is.logical(x)) { na.rm <- as.logical(na.rm) has_nas <- TRUE counts <- .Call(C_rowCounts, x, dim., rows, cols, value, 0L, na.rm, has_nas) as.logical(counts) } else { if (is.vector(x)) { dim(x) <- dim. } else if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix or a vector. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) if (is.na(value)) { rowAlls(is.na(x), na.rm = na.rm, dim. = dim., ...) } else { rowAlls(x == value, na.rm = na.rm, dim. = dim., ...) } } } #' @rdname rowAlls #' @export colAlls <- function(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) { if (is.numeric(x) && is.logical(value) && !is.na(value)) { na.rm <- as.logical(na.rm) has_nas <- TRUE ## colAlls(x, value = ) == !colAnys(x, value = !) value <- !value counts <- .Call(C_colCounts, x, dim., rows, cols, value, 1L, na.rm, has_nas) (counts == 0L) } else if (is.numeric(x) || is.logical(x)) { na.rm <- as.logical(na.rm) has_nas <- TRUE counts <- .Call(C_colCounts, x, dim., rows, cols, value, 0L, na.rm, has_nas) as.logical(counts) } else { if (is.vector(x)) { dim(x) <- dim. } else if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix or a vector. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) if (is.na(value)) { colAlls(is.na(x), na.rm = na.rm, dim. = dim., ...) } else { colAlls(x == value, na.rm = na.rm, dim. = dim., ...) } } } #' @rdname rowAlls #' @export allValue <- function(x, idxs = NULL, value = TRUE, na.rm = FALSE, ...) { if (is.numeric(x) && is.logical(value) && !is.na(value)) { na.rm <- as.logical(na.rm) has_nas <- TRUE ## allValue(x, value = ) == !anyValue(x, value = !) value <- !value counts <- .Call(C_count, x, idxs, value, 1L, na.rm, has_nas) (counts == 0L) } else if (is.numeric(x) || is.logical(x)) { na.rm <- as.logical(na.rm) has_nas <- TRUE counts <- .Call(C_count, x, idxs, value, 0L, na.rm, has_nas) as.logical(counts) } else { # Apply subset if (!is.null(idxs)) x <- x[idxs] if (is.na(value)) { allValue(is.na(x), na.rm = na.rm, ...) } else { allValue(x == value, na.rm = na.rm, ...) } } } #' @rdname rowAlls #' @export rowAnys <- function(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) { if (is.numeric(x) && is.logical(value) && !is.na(value)) { na.rm <- as.logical(na.rm) has_nas <- TRUE ## rowAnys(x, value = ) == !rowAlls(x, value = !) value <- !value counts <- .Call(C_rowCounts, x, dim., rows, cols, value, 0L, na.rm, has_nas) (counts == 0L) } else if (is.numeric(x) || is.logical(x)) { na.rm <- as.logical(na.rm) has_nas <- TRUE counts <- .Call(C_rowCounts, x, dim., rows, cols, value, 1L, na.rm, has_nas) as.logical(counts) } else { if (is.vector(x)) { dim(x) <- dim. } else if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix or a vector. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) if (is.na(value)) { rowAnys(is.na(x), na.rm = na.rm, dim. = dim., ...) } else { rowAnys(x == value, na.rm = na.rm, dim. = dim., ...) } } } #' @rdname rowAlls #' @export colAnys <- function(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) { if (is.numeric(x) && is.logical(value) && !is.na(value)) { na.rm <- as.logical(na.rm) has_nas <- TRUE ## colAnys(x, value = ) == !colAlls(x, value = !) value <- !value counts <- .Call(C_colCounts, x, dim., rows, cols, value, 0L, na.rm, has_nas) (counts == 0L) } else if (is.numeric(x) || is.logical(x)) { na.rm <- as.logical(na.rm) has_nas <- TRUE counts <- .Call(C_colCounts, x, dim., rows, cols, value, 1L, na.rm, has_nas) as.logical(counts) } else { if (is.vector(x)) { dim(x) <- dim. } else if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix or a vector. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) if (is.na(value)) { colAnys(is.na(x), na.rm = na.rm, dim. = dim., ...) } else { colAnys(x == value, na.rm = na.rm, dim. = dim., ...) } } } #' @rdname rowAlls #' @export anyValue <- function(x, idxs = NULL, value = TRUE, na.rm = FALSE, ...) { if (is.numeric(x) && is.logical(value) && !is.na(value)) { na.rm <- as.logical(na.rm) has_nas <- TRUE ## anyValue(x, value = ) == !allValue(x, value = !) value <- !value counts <- .Call(C_count, x, idxs, value, 0L, na.rm, has_nas) (counts == 0L) } else if (is.numeric(x) || is.logical(x)) { na.rm <- as.logical(na.rm) has_nas <- TRUE counts <- .Call(C_count, x, idxs, value, 1L, na.rm, has_nas) as.logical(counts) } else { # Apply subset if (!is.null(idxs)) x <- x[idxs] if (is.na(value)) { anyValue(is.na(x), na.rm = na.rm, ...) } else { anyValue(x == value, na.rm = na.rm, ...) } } } matrixStats/R/rowWeightedMeans.R0000644000175100001440000001530313073232442016415 0ustar hornikusers#' Calculates the weighted means for each row (column) in a matrix #' #' Calculates the weighted means for each row (column) in a matrix. #' #' The implementations of these methods are optimized for both speed and #' memory. If no weights are given, the corresponding #' \code{rowMeans()}/\code{colMeans()} is used. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param w A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length #' K (N). #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, missing values are #' excluded from the calculation, otherwise not. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @example incl/rowWeightedMeans.R #' #' @author Henrik Bengtsson #' #' @seealso See \code{rowMeans()} and \code{colMeans()} in #' \code{\link[base]{colSums}}() for non-weighted means. See also #' \code{\link[stats]{weighted.mean}}. #' #' @keywords array iteration robust univar #' @export rowWeightedMeans <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Argument 'w': has_weights <- !is.null(w) if (has_weights) { n <- ncol(x) if (length(w) != n) { stop("The length of argument 'w' is does not match the number of column in 'x': ", length(w), " != ", n) #nolint } if (!is.numeric(w)) { stop("Argument 'w' is not numeric: ", mode(w)) } if (any(!is.na(w) & w < 0)) { stop("Argument 'w' has negative weights.") } } # Apply subset on x if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Apply subset on w if (!is.null(w) && !is.null(cols)) w <- w[cols] if (has_weights) { # Allocate results m <- nrow(x) if (m == 0L) return(double(0L)) # Drop entries with zero weight? ...but keep NAs idxs <- which(is.na(w) | w != 0) nw <- length(idxs) if (nw == 0L) { return(rep(NaN, times = m)) } else if (nw < n) { w <- w[idxs] x <- x[, idxs, drop = FALSE] } idxs <- NULL # Not needed anymore # Has missing values? if (na.rm) { # Really? na.rm <- anyMissing(x) } if (na.rm) { # Indices of missing values nas <- which(is.na(x)) # Weight matrix W <- matrix(w, nrow = nrow(x), ncol = ncol(x), byrow = TRUE) w <- NULL # Not needed anymore W[nas] <- NA wS <- rowSums(W, na.rm = TRUE) # Standarized weights summing to one w/out missing values W[nas] <- 0 W <- W / wS x[nas] <- 0 nas <- NULL # Not needed anymore x <- W * x W <- NULL # Not needed anymore } else { wS <- sum(w) # Standardize weights summing to one. w <- w / wS # Weighted values ## SLOW: for (rr in 1:m) x[rr, ] <- w * x[rr, , drop = TRUE] ## FAST: x <- t_tx_OP_y(x, w, OP = "*", na.rm = FALSE) w <- NULL # Not needed anymore } # Here we know there are no missing value in the new 'x' res <- rowSums(x, na.rm = FALSE) } else { res <- rowMeans(x, na.rm = na.rm) } res } #' @rdname rowWeightedMeans #' @export colWeightedMeans <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Argument 'w': has_weights <- !is.null(w) if (has_weights) { n <- nrow(x) if (length(w) != n) { stop("The length of argument 'w' is does not match the number of rows in 'x': ", length(w), " != ", n) #nolint } if (!is.numeric(w)) { stop("Argument 'w' is not numeric: ", mode(w)) } if (any(!is.na(w) & w < 0)) { stop("Argument 'w' has negative weights.") } } # Apply subset on x if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Apply subset on w if (!is.null(w) && !is.null(rows)) w <- w[rows] if (has_weights) { # Allocate results m <- ncol(x) if (m == 0L) return(double(0L)) # Drop entries with zero weight? ...but keep NAs idxs <- which(is.na(w) | w != 0) nw <- length(idxs) if (nw == 0L) { return(rep(NaN, times = m)) } else if (nw < n) { w <- w[idxs] x <- x[idxs, , drop = FALSE] } idxs <- NULL # Not needed anymore # Has missing values? if (na.rm) { # Really? na.rm <- anyMissing(x) } if (na.rm) { # Indices of missing values nas <- which(is.na(x)) # Weight matrix W <- matrix(w, nrow = nrow(x), ncol = ncol(x), byrow = FALSE) w <- NULL # Not needed anymore W[nas] <- NA wS <- colSums(W, na.rm = TRUE) # Standarized weights summing to one w/out missing values W[nas] <- 0 for (cc in 1:m) { W[, cc] <- W[, cc, drop = TRUE] / wS[cc] } x[nas] <- 0 nas <- NULL # Not needed anymore x <- W * x W <- NULL # Not needed anymore } else { wS <- sum(w) # Standardize weights summing to one. w <- w / wS # Weighted values x <- w * x ## SLIGHTLY SLOWER: x <- x_OP_y(x, w, OP = "*") w <- NULL # Not needed anymore } # Here we know there are no missing value in the new 'x' res <- colSums(x, na.rm = FALSE) } else { res <- colMeans(x, na.rm = na.rm) } res } matrixStats/R/sum2.R0000644000175100001440000000520713073232324014030 0ustar hornikusers#' Fast sum over subset of vector elements #' #' Computes the sum of all or a subset of values. #' #' \code{sum2(x, idxs)} gives equivalent results as \code{sum(x[idxs])}, but #' is faster and more memory efficient since it avoids the actual subsetting #' which requires copying of elements and garbage collection thereof. #' #' Furthermore, \code{sum2(x, mode = "double")} is equivalent to #' \code{sum(as.numeric(x))} and may therefore be used to avoid integer #' overflow, but at the same time is much more memory efficient that #' the regular \code{sum()} function when \code{x} is an #' \code{\link[base]{integer}} vector. #' #' @param x A \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, missing values are #' skipped, otherwise not. #' #' @param mode A \code{\link[base]{character}} string specifying the data type #' of the return value. Default is to use the same mode as argument \code{x}. #' #' @param ... Not used. #' #' @return Returns a scalar of the data type specified by argument \code{mode}. #' If \code{mode = "integer"}, then integer overflow occurs if the \emph{sum} #' is outside the range of defined integer values. #' Note that the intermediate sum (\code{sum(x[1:n])}) is internally #' represented as a floating point value and will therefor never be outside of #' the range. #' #' @example incl/sum2.R #' #' @author Henrik Bengtsson #' #' @seealso \code{\link[base]{sum}}(). #' To efficiently average over a subset, see \code{\link{mean2}}(). #' #' @keywords univar internal #' @export sum2 <- function(x, idxs = NULL, na.rm = FALSE, mode = typeof(x), ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': if (!is.numeric(x)) { stop("Argument 'x' is not numeric: ", mode(x)) } # Argument 'na.rm': if (!is.logical(na.rm)) { stop("Argument 'na.rm' is not logical: ", mode(na.rm)) } # Argument 'mode': mode <- mode[1L] mode_idx <- charmatch(mode, c("integer", "double"), nomatch = 0L) if (mode_idx == 0L) { stop("Unknown value of argument 'mode': ", mode) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Summing # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .Call(C_sum2, x, idxs, na.rm, mode_idx) } #' @rdname sum2 #' @export sumOver <- function(...) { .Deprecated(new = "sum2") sum2(...) } matrixStats/R/indexByRow.R0000644000175100001440000000161313073232324015231 0ustar hornikusers#' Translates matrix indices by rows into indices by columns #' #' Translates matrix indices by rows into indices by columns. #' #' @param dim A \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length two specifying the length of the "template" matrix. #' #' @param idxs A \code{\link[base]{vector}} of indices. If #' \code{\link[base]{NULL}}, all indices are returned. #' #' @param ... Not use. #' #' @return Returns an \code{\link[base]{integer}} \code{\link[base]{vector}} of #' indices. #' #' @example incl/indexByRow.R #' #' @author Henrik Bengtsson #' @keywords iteration logic #' @export indexByRow <- function(dim, idxs = NULL, ...) { if (is.matrix(dim)) { # BACKWARD COMPATIBILITY: Keep for a while, but deprecate # in the future. dim <- dim(dim) } else { dim <- as.integer(dim) } if (!is.null(idxs)) idxs <- as.integer(idxs) .Call(C_indexByRow, dim, idxs) } matrixStats/R/binCounts.R0000644000175100001440000000627213073232324015111 0ustar hornikusers#' Fast element counting in non-overlapping bins #' #' Counts the number of elements in non-overlapping bins #' #' \code{binCounts(x, bx, right = TRUE)} gives equivalent results as #' \code{rev(binCounts(-x, bx = rev(-bx), right = FALSE))}, but is faster #' and more memory efficient. #' #' @param x A \code{\link[base]{numeric}} \code{\link[base]{vector}} of K #' positions for to be binned and counted. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param bx A \code{\link[base]{numeric}} \code{\link[base]{vector}} of B + 1 #' ordered positions specifying the B > 0 bins \code{[bx[1], bx[2])}, #' \code{[bx[2], bx[3])}, ..., \code{[bx[B], bx[B + 1])}. #' #' @param right If \code{\link[base:logical]{TRUE}}, the bins are right-closed #' (left open), otherwise left-closed (right open). #' #' @param ... Not used. #' #' @return Returns an \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length B with non-negative integers. #' #' @section Missing and non-finite values: #' Missing values in \code{x} are ignored/dropped. Missing values in \code{bx} #' are not allowed and gives an error. #' #' @author Henrik Bengtsson #' #' @seealso An alternative for counting occurrences within bins is #' \code{\link[graphics]{hist}}, e.g. \code{hist(x, breaks = bx, #' plot = FALSE)$counts}. That approach is ~30-60\% slower than #' \code{binCounts(..., right = TRUE)}. #' #' To count occurrences of indices \code{x} (positive #' \code{\link[base]{integer}}s) in \code{[1, B]}, use \code{tabulate(x, #' nbins = B)}, where \code{x} does \emph{not} have to be sorted first. For #' details, see \code{\link[base]{tabulate}}(). #' #' To average values within bins, see \code{\link{binMeans}}(). #' #' @keywords univar #' @export binCounts <- function(x, idxs = NULL, bx, right = FALSE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': if (!is.numeric(x)) { stop("Argument 'x' is not numeric: ", mode(x)) } # Argument 'bx': if (!is.numeric(bx)) { stop("Argument 'bx' is not numeric: ", mode(bx)) } if (any(is.infinite(bx))) { stop("Argument 'bx' must not contain Inf values.") } if (is.unsorted(bx)) { stop("Argument 'bx' is not ordered.") } # Apply subset if (!is.null(idxs)) x <- x[idxs] # Argument 'right': right <- as.logical(right) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Preprocessing of x # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Drop missing values keep <- which(!is.na(x)) if (length(keep) < length(x)) { x <- x[keep] } keep <- NULL # Not needed anymore # Order x (by increasing x). # If 'x' is already sorted, the overhead of (re)sorting is # relatively small. x <- sort.int(x, method = "quick") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Bin # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- as.numeric(x) bx <- as.numeric(bx) .Call(C_binCounts, x, bx, right) } matrixStats/R/rowOrderStats.R0000644000175100001440000000431313073232324015761 0ustar hornikusers#' Gets an order statistic for each row (column) in a matrix #' #' Gets an order statistic for each row (column) in a matrix. #' #' The implementation of \code{rowOrderStats()} is optimized for both speed and #' memory. To avoid coercing to \code{\link[base]{double}}s (and hence memory #' allocation), there is a unique implementation for #' \code{\link[base]{integer}} matrices. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param which An \code{\link[base]{integer}} index in [1,K] ([1,N]) #' indicating which order statistic to be returned. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @section Missing values: This method does \emph{not} handle missing values, #' that is, the result corresponds to having \code{na.rm = FALSE} (if such an #' argument would be available). #' #' @author The native implementation of \code{rowOrderStats()} was adopted by #' Henrik Bengtsson from Robert Gentleman's \code{rowQ()} in the \pkg{Biobase} #' package. #' #' @seealso See \code{rowMeans()} in \code{\link[base]{colSums}}(). #' #' @keywords array iteration robust univar #' @export rowOrderStats <- function(x, rows = NULL, cols = NULL, which, dim. = dim(x), ...) { dim. <- as.integer(dim.) # Check missing values if (anyMissing(x)) { stop("Argument 'x' must not contain missing value") } which <- as.integer(which) .Call(C_rowOrderStats, x, dim., rows, cols, which) } #' @rdname rowOrderStats #' @export colOrderStats <- function(x, rows = NULL, cols = NULL, which, dim. = dim(x), ...) { dim. <- as.integer(dim.) # Check missing values if (anyMissing(x)) { stop("Argument 'x' must not contain missing value") } which <- as.integer(which) .Call(C_colOrderStats, x, dim., rows, cols, which) } matrixStats/R/rowCumsums.R0000644000175100001440000000464413073232324015332 0ustar hornikusers#' Cumulative sums, products, minima and maxima for each row (column) in a #' matrix #' #' Cumulative sums, products, minima and maxima for each row (column) in a #' matrix. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of elements #' (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no #' subsetting is done. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}} #' of the same mode as \code{x}. #' #' @example incl/rowCumsums.R #' #' @author Henrik Bengtsson #' #' @seealso See \code{\link[base]{cumsum}}(), \code{\link[base]{cumprod}}(), #' \code{\link[base]{cummin}}(), and \code{\link[base]{cummax}}(). #' #' @keywords array iteration univar #' @export rowCumsums <- function(x, rows = NULL, cols = NULL, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowCumsums, x, dim, rows, cols, TRUE) } #' @rdname rowCumsums #' @export colCumsums <- function(x, rows = NULL, cols = NULL, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowCumsums, x, dim, rows, cols, FALSE) } #' @rdname rowCumsums #' @export rowCumprods <- function(x, rows = NULL, cols = NULL, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowCumprods, x, dim, rows, cols, TRUE) } #' @rdname rowCumsums #' @export colCumprods <- function(x, rows = NULL, cols = NULL, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowCumprods, x, dim, rows, cols, FALSE) } #' @rdname rowCumsums #' @export rowCummins <- function(x, rows = NULL, cols = NULL, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowCummins, x, dim, rows, cols, TRUE) } #' @rdname rowCumsums #' @export colCummins <- function(x, rows = NULL, cols = NULL, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowCummins, x, dim, rows, cols, FALSE) } #' @rdname rowCumsums #' @export rowCummaxs <- function(x, rows = NULL, cols = NULL, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowCummaxs, x, dim, rows, cols, TRUE) } #' @rdname rowCumsums #' @export colCummaxs <- function(x, rows = NULL, cols = NULL, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowCummaxs, x, dim, rows, cols, FALSE) } matrixStats/R/benchmark.R0000644000175100001440000000114513073232324015071 0ustar hornikusersbenchmark <- function(fcn, tags = NULL, path = NULL, workdir = "reports", envir = parent.frame(), ...) { requireNamespace("R.rsp") || stop("R.rsp not installed.") if (is.function(fcn)) { fcn <- deparse(substitute(fcn)) } if (is.null(path)) { path <- system.file("benchmarking", package = "matrixStats") } fullname <- paste(c(fcn, tags), collapse = ", ") filename <- sprintf("%s.md.rsp", fullname) pathname <- file.path(path, filename) oopts <- options("prompt" = "> ") on.exit(options(oopts)) R.rsp::rfile(pathname, workdir = workdir, envir = envir, ...) } matrixStats/R/rowAvgsPerColSet.R0000644000175100001440000001306613073232324016355 0ustar hornikusers#' Applies a row-by-row (column-by-column) averaging function to equally-sized #' subsets of matrix columns (rows) #' #' Applies a row-by-row (column-by-column) averaging function to equally-sized #' subsets of matrix columns (rows). Each subset is averaged independently of #' the others. #' #' If argument \code{S} is a single column vector with indices \code{1:N}, then #' \code{rowAvgsPerColSet(X, S = S, FUN = rowMeans)} gives the same result as #' \code{rowMeans(X)}. Analogously, for \code{rowAvgsPerColSet()}. #' #' @param X A \code{\link[base]{numeric}} NxM \code{\link[base]{matrix}}. #' #' @param W An optional \code{\link[base]{numeric}} NxM #' \code{\link[base]{matrix}} of weights. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param S An \code{\link[base]{integer}} KxJ \code{\link[base]{matrix}} #' specifying the J subsets. Each column holds K column (row) indices for the #' corresponding subset. #' #' @param FUN The row-by-row (column-by-column) \code{\link[base]{function}} #' used to average over each subset of \code{X}. This function must accept a #' \code{\link[base]{numeric}} NxK (KxM) \code{\link[base]{matrix}} and the #' \code{\link[base]{logical}} argument \code{na.rm} (which is automatically #' set), and return a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (M). #' #' @param ... Additional arguments passed to then \code{FUN} #' \code{\link[base]{function}}. #' #' @param tFUN If \code{\link[base:logical]{TRUE}}, the NxK (KxM) #' \code{\link[base]{matrix}} passed to \code{FUN()} is transposed first. #' #' @return Returns a \code{\link[base]{numeric}} JxN (MxJ) #' \code{\link[base]{matrix}}, where row names equal \code{rownames(X)} #' (\code{colnames(S)}) and column names \code{colnames(S)} #' (\code{colnames(X)}). #' #' @example incl/rowAvgsPerColSet.R #' #' @author Henrik Bengtsson #' @keywords internal utilities #' @export rowAvgsPerColSet <- function(X, W = NULL, rows = NULL, S, FUN = rowMeans, ..., tFUN = FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'X': if (!is.matrix(X)) { stop("Argument 'X' is not a matrix: ", class(X)[1L]) } dimX <- dim(X) # Argument 'W': hasW <- !is.null(W) if (hasW) { if (!is.matrix(W)) { stop("Argument 'W' is not a matrix: ", class(W)[1L]) } if (any(dim(W) != dimX)) { stop("Argument 'W' does not have the same dimension as 'X': ", paste(dim(W), collapse = "x"), " != ", paste(dimX, collapse = "x")) } if (!is.numeric(W)) { stop("Argument 'W' is not numeric: ", mode(W)) } } # Argument 'S': if (!is.matrix(S)) { stop("Argument 'S' is not a matrix: ", class(S)[1L]) } nbrOfSets <- ncol(S) setNames <- colnames(S) # Argument 'FUN': if (!is.function(FUN)) { stop("Argument 'FUN' is not a function: ", mode(S)) } # Apply subset if (!is.null(rows)) { X <- X[rows, , drop = FALSE] if (hasW) W <- W[rows, , drop = FALSE] dimX <- dim(X) } # Argument 'tFUN': tFUN <- as.logical(tFUN) # Check if missing values have to be excluded while averaging na.rm <- (anyMissing(X) || anyMissing(S)) # Record names of dimension rownamesX <- rownames(X) dimnames(X) <- NULL # Average in sets of columns of X. Z <- apply(S, MARGIN = 2L, FUN = function(jj) { # Extract set of columns from X jj <- jj[is.finite(jj)] Zjj <- X[, jj, drop = FALSE] jj <- NULL # Not needed anymore if (tFUN) { Zjj <- t(Zjj) } # Average by weights if (hasW) { Wjj <- W[, jj, drop = FALSE] Zjj <- FUN(Zjj, W = Wjj, ..., na.rm = na.rm) Wjj <- NULL # Not needed anymore } else { Zjj <- FUN(Zjj, ..., na.rm = na.rm) } # Sanity check stopifnot(length(Zjj) == dimX[1L]) # Return set average Zjj }) # Sanity check stopifnot(dim(Z) == c(dimX[1L], nbrOfSets)) # Set names rownames(Z) <- rownamesX colnames(Z) <- setNames Z } #' @rdname rowAvgsPerColSet #' @export colAvgsPerRowSet <- function(X, W = NULL, cols = NULL, S, FUN = colMeans, tFUN = FALSE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'X': if (!is.matrix(X)) { stop("Argument 'X' is not a matrix: ", class(X)[1L]) } # Argument 'W': # Argument 'S': if (!is.matrix(S)) { stop("Argument 'S' is not a matrix: ", class(S)[1L]) } # Argument 'FUN': if (!is.function(FUN)) { stop("Argument 'FUN' is not a function: ", mode(S)) } # Apply subset if (!is.null(cols)) { X <- X[, cols, drop = FALSE] if (is.null(W)) W <- W[, cols, drop = FALSE] } # Argument 'tFUN': tFUN <- as.logical(tFUN) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Transpose # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - tX <- t(X) if (is.null(W)) { tW <- NULL } else { tW <- t(W) } # ... tZ <- rowAvgsPerColSet(X = tX, W = tW, S = S, FUN = FUN, tFUN = !tFUN, ...) tX <- tW <- NULL # Not needed anymore # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Transpose back # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Z <- t(tZ) tZ <- NULL # Not needed anymore Z } matrixStats/R/allocMatrix.R0000644000175100001440000000240513073232324015416 0ustar hornikusers#' Allocates an empty vector, matrix or array #' #' Allocates an empty vector, matrix or array faster than the corresponding #' function in R. #' #' #' @param value A \code{\link[base]{numeric}} scalar that all elements will #' have as value. #' #' @param ... Not used. #' #' @param length,nrow,ncol,dim \code{\link[base]{numeric}}s specifying the #' dimension of the created \code{\link[base]{vector}}, #' \code{\link[base]{matrix}} or \code{\link[base]{array}}. #' #' @return Returns a \code{\link[base]{vector}}, \code{\link[base]{matrix}} and #' \code{\link[base]{array}} respectively of the same data type as #' \code{value}. #' #' @author Henrik Bengtsson #' #' @seealso See also \code{\link[base]{vector}}, \code{\link[base]{matrix}} and #' \code{\link[base]{array}}. #' #' @keywords internal programming #' #' @export allocMatrix <- function(nrow, ncol, value = 0.0, ...) { nrow <- as.integer(nrow) ncol <- as.integer(ncol) .Call(C_allocMatrix2, nrow, ncol, value) } #' @rdname allocMatrix #' @export allocVector <- function(length, value = 0.0, ...) { length <- as.integer(length) .Call(C_allocVector2, length, value) } #' @rdname allocMatrix #' @export allocArray <- function(dim, value = 0.0, ...) { dim <- as.integer(dim) .Call(C_allocArray2, dim, value) } matrixStats/R/rowWeightedMedians.R0000644000175100001440000001111213073232422016722 0ustar hornikusers#' Calculates the weighted medians for each row (column) in a matrix #' #' Calculates the weighted medians for each row (column) in a matrix. #' #' The implementations of these methods are optimized for both speed and #' memory. If no weights are given, the corresponding #' \code{\link{rowMedians}}()/\code{colMedians()} is used. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param w A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length #' K (N). #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, missing values are #' excluded from the calculation, otherwise not. #' #' @param ... Additional arguments passed to \code{\link{weightedMedian}}(). #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @example incl/rowWeightedMedians.R #' #' @author Henrik Bengtsson #' #' @seealso See \code{\link{rowMedians}}() and \code{colMedians()} for #' non-weighted medians. Internally, \code{\link{weightedMedian}}() is used. #' @keywords array iteration robust univar #' @export rowWeightedMedians <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Argument 'w': has_weights <- !is.null(w) if (has_weights) { n <- ncol(x) if (length(w) != n) { stop("The length of argument 'w' is does not match the number of column in 'x': ", length(w), " != ", n) #nolint } if (!is.numeric(w)) { stop("Argument 'w' is not numeric: ", mode(w)) } if (any(!is.na(w) & w < 0)) { stop("Argument 'w' has negative weights.") } } # Apply subset on x if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Apply subset on w if (!is.null(w) && !is.null(cols)) w <- w[cols] if (has_weights) { # Allocate results m <- nrow(x) if (m == 0L) return(double(0L)) res <- apply(x, MARGIN = 1L, FUN = function(x) { weightedMedian(x, w = w, na.rm = na.rm, ...) }) w <- NULL # Not needed anymore } else { res <- rowMedians(x, na.rm = na.rm) } res } #' @rdname rowWeightedMedians #' @export colWeightedMedians <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Argument 'w': has_weights <- !is.null(w) if (has_weights) { n <- nrow(x) if (length(w) != n) { stop("The length of argument 'w' is does not match the number of rows in 'x': ", length(w), " != ", n) #nolint } if (!is.numeric(w)) { stop("Argument 'w' is not numeric: ", mode(w)) } if (any(!is.na(w) & w < 0)) { stop("Argument 'w' has negative weights.") } } # Apply subset on x if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Apply subset on w if (!is.null(w) && !is.null(rows)) w <- w[rows] if (has_weights) { # Allocate results m <- ncol(x) if (m == 0L) return(double(0L)) res <- apply(x, MARGIN = 2L, FUN = function(x) { weightedMedian(x, w = w, na.rm = na.rm, ...) }) w <- NULL # Not needed anymore } else { res <- colMedians(x, na.rm = na.rm) } res } matrixStats/R/rowMedians.R0000644000175100001440000000427313073232324015254 0ustar hornikusers#' Calculates the median for each row (column) in a matrix #' #' Calculates the median for each row (column) in a matrix. #' #' The implementation of \code{rowMedians()} and \code{colMedians()} is #' optimized for both speed and memory. To avoid coercing to #' \code{\link[base]{double}}s (and hence memory allocation), there is a #' special implementation for \code{\link[base]{integer}} matrices. That is, #' if \code{x} is an \code{\link[base]{integer}} \code{\link[base]{matrix}}, #' then \code{rowMedians(as.double(x))} (\code{rowMedians(as.double(x))}) would #' require three times the memory of \code{rowMedians(x)} #' (\code{colMedians(x)}), but all this is avoided. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s #' are excluded first, otherwise not. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @author Henrik Bengtsson, Harris Jaffee #' #' @seealso See \code{\link{rowMedians}}() and \code{colMedians()} for weighted #' medians. For mean estimates, see \code{rowMeans()} in #' \code{\link[base]{colSums}}(). #' #' @keywords array iteration robust univar #' @export rowMedians <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) has_nas <- TRUE # Add as an argument? /2007-08-24 .Call(C_rowMedians, x, dim., rows, cols, na.rm, has_nas, TRUE) } #' @rdname rowMedians #' @export colMedians <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) has_nas <- TRUE # Add as an argument? /2007-08-24 .Call(C_rowMedians, x, dim., rows, cols, na.rm, has_nas, FALSE) } matrixStats/R/rowLogSumExps.R0000644000175100001440000000372513073232324015743 0ustar hornikusers#' Accurately computes the logarithm of the sum of exponentials across rows or #' columns #' #' Accurately computes the logarithm of the sum of exponentials across rows or #' columns. #' #' #' @param lx A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' Typically \code{lx} are \eqn{log(x)} values. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, any missing values are #' ignored, otherwise not. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N #' (K). #' #' @section Benchmarking: #' These methods are implemented in native code and have been optimized for #' speed and memory. #' #' @author Native implementation by Henrik Bengtsson. Original R code by #' Nakayama ??? (Japan). #' #' @seealso To calculate the same on vectors, \code{\link{logSumExp}}(). #' #' @keywords array #' @export rowLogSumExps <- function(lx, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(lx), ...) { dim. <- as.integer(dim.) has_na <- TRUE res <- .Call(C_rowLogSumExps, lx, dim., rows, cols, as.logical(na.rm), has_na, TRUE) # Preserve names names <- rownames(lx) if (!is.null(names)) { names(res) <- names } res } #' @rdname rowLogSumExps #' @export colLogSumExps <- function(lx, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(lx), ...) { dim. <- as.integer(dim.) has_na <- TRUE res <- .Call(C_rowLogSumExps, lx, dim., rows, cols, as.logical(na.rm), has_na, FALSE) # Preserve names names <- colnames(lx) if (!is.null(names)) { names(res) <- names } res } matrixStats/R/rowVars.R0000644000175100001440000000760113073232324014605 0ustar hornikusers#' Variance estimates for each row (column) in a matrix #' #' Variance estimates for each row (column) in a matrix. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param center (optional) The center, defaults to the row means. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s #' are excluded first, otherwise not. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Additional arguments passed to \code{rowMeans()} and #' \code{rowSums()}. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @example incl/rowMethods.R #' #' @author Henrik Bengtsson #' #' @seealso See \code{rowMeans()} and \code{rowSums()} in #' \code{\link[base]{colSums}}(). #' @keywords array iteration robust univar #' @export rowVars <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, center = NULL, dim. = dim(x), ...) { dim. <- as.integer(dim.) if (is.null(center)) { na.rm <- as.logical(na.rm) has_nas <- TRUE sigma2 <- .Call(C_rowVars, x, dim., rows, cols, na.rm, has_nas, TRUE) return(sigma2) } # Apply subset on 'x' if (is.vector(x)) dim(x) <- dim. if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) # Apply subset on 'center' if (!is.null(rows)) center <- center[rows] ncol <- ncol(x) # Nothing to do? if (ncol <= 1L) { x <- rep(NA_real_, times = nrow(x)) return(x) } if (na.rm) { # Count number of missing values in each row na_counts <- rowCounts(x, value = NA_real_, na.rm = FALSE) # Number of non-missing values n <- ncol - na_counts has_na <- any(na_counts > 0L) if (has_na) { # Set NA estimates for rows with less than two observations n[n <= 1L] <- NA_integer_ } else { # No need to check for missing values below na.rm <- FALSE } } else { # Assuming no missing values n <- ncol } # Spread x <- x * x x <- rowMeans(x, na.rm = na.rm) # Variance x <- (x - center^2) x * (n / (n - 1)) } #' @rdname rowVars #' @export colVars <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, center = NULL, dim. = dim(x), ...) { dim. <- as.integer(dim.) if (is.null(center)) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) has_nas <- TRUE sigma2 <- .Call(C_rowVars, x, dim., rows, cols, na.rm, has_nas, FALSE) return(sigma2) } # Apply subset on 'x' if (is.vector(x)) dim(x) <- dim. if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) # Apply subset on 'center' if (!is.null(cols)) center <- center[cols] nrow <- nrow(x) # Nothing to do? if (nrow <= 1L) { x <- rep(NA_real_, times = ncol(x)) return(x) } if (na.rm) { # Count number of missing values in each column na_counts <- colCounts(x, value = NA_real_, na.rm = FALSE) # Number of non-missing values n <- nrow - na_counts has_na <- any(na_counts > 0L) if (has_na) { # Set NA estimates for rows with less than two observations n[n <= 1L] <- NA_integer_ } else { # No need to check for missing values below na.rm <- FALSE } } else { # Assuming no missing values n <- nrow } # Spread x <- x * x x <- colMeans(x, na.rm = na.rm) # Variance x <- (x - center^2) x * (n / (n - 1)) } matrixStats/R/product.R0000644000175100001440000000023113073232324014612 0ustar hornikusers#' @rdname rowProds #' @export product <- function(x, idxs = NULL, na.rm = FALSE, ...) { .Call(C_productExpSumLog, x, idxs, as.logical(na.rm), TRUE) } matrixStats/R/weightedMedian.R0000644000175100001440000001072113073232324016055 0ustar hornikusers#' Weighted Median Value #' #' Computes a weighted median of a numeric vector. #' #' For the \code{n} elements \code{x = c(x[1], x[2], ..., x[n])} with positive #' weights \code{w = c(w[1], w[2], ..., w[n])} such that \code{sum(w) = S}, the #' \emph{weighted median} is defined as the element \code{x[k]} for which the #' total weight of all elements \code{x[i] < x[k]} is less or equal to #' \code{S/2} and for which the total weight of all elements \code{x[i] > x[k]} #' is less or equal to \code{S/2} (c.f. [1]). #' #' If \code{w} is missing then all elements of \code{x} are given the same #' positive weight. If all weights are zero, \code{\link[base]{NA}}_real_ is #' returned. #' #' If one or more weights are \code{Inf}, it is the same as these weights have #' the same weight and the others has zero. This makes things easier for cases #' where the weights are result of a division with zero. #' #' The weighted median solves the following optimization problem: #' #' \deqn{\alpha^* = \arg_\alpha \min \sum_{k = 1}{K} w_k |x_k-\alpha|} where #' \eqn{x = (x_1, x_2, \ldots, x_K)} are scalars and #' \eqn{w = (w_1, w_2, \ldots, w_K)} are the corresponding "weights" for each #' individual \eqn{x} value. #' #' @param x a \code{\link[base]{numeric}} \code{\link[base]{vector}} containing #' the values whose weighted median is to be computed. #' #' @param w a vector of weights the same length as \code{x} giving the weights #' to use for each element of \code{x}. Negative weights are treated as zero #' weights. Default value is equal weight to all values. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm a logical value indicating whether \code{\link[base]{NA}} #' values in \code{x} should be stripped before the computation proceeds, or #' not. If \code{\link[base]{NA}}, no check at all for \code{\link[base]{NA}}s #' is done. Default value is \code{\link[base]{NA}} (for efficiency). #' #' @param interpolate If \code{\link[base:logical]{TRUE}}, linear interpolation #' is used to get a consistent estimate of the weighted median. #' #' @param ties If \code{interpolate == FALSE}, a character string specifying #' how to solve ties between two \code{x}'s that are satisfying the weighted #' median criteria. Note that at most two values can satisfy the criteria. #' When \code{ties} is \code{"min"}, the smaller value of the two is returned #' and when it is \code{"max"}, the larger value is returned. If \code{ties} #' is \code{"mean"}, the mean of the two values is returned. Finally, if #' \code{ties} is \code{"weighted"} (or \code{\link[base]{NULL}}) a weighted #' average of the two are returned, where the weights are weights of all values #' \code{x[i] <= x[k]} and \code{x[i] >= x[k]}, respectively. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} scalar. #' #' @example incl/weightedMedian.R #' #' @author Henrik Bengtsson and Ola Hossjer, Centre for Mathematical Sciences, #' Lund University. Thanks to Roger Koenker, Econometrics, University of #' Illinois, for the initial ideas. #' #' @seealso \code{\link[stats]{median}}, \code{\link[base]{mean}}() and #' #' \code{\link{weightedMean}}(). #' @references [1] T.H. Cormen, C.E. Leiserson, R.L. Rivest, Introduction to #' Algorithms, The MIT Press, Massachusetts Institute of Technology, 1989. #' #' @keywords univar robust #' @export weightedMedian <- function(x, w = NULL, idxs = NULL, na.rm = FALSE, interpolate = is.null(ties), ties = NULL, ...) { # Argument 'x': # Argument 'w': if (is.null(w)) { w <- rep(1, times = length(x)) } else { w <- as.double(w) } # Argument 'na.rm': na.rm <- as.logical(na.rm) if (is.na(na.rm)) na.rm <- FALSE # Argument 'interpolate': interpolate <- as.logical(interpolate) # Argument 'ties': if (is.null(ties)) { ties_id <- 1L } else { if (ties == "weighted") { ties_id <- 1L } else if (ties == "min") { ties_id <- 2L } else if (ties == "max") { ties_id <- 4L } else if (ties == "mean") { ties_id <- 8L } else if (ties == "both") { .Defunct("As of matrixStats (> 0.12.2), weightedMedian(..., interpolate = FALSE, ties = \"both\") is no longer supported. Use ties = \"min\" and then ties = \"max\" to achieve the same result.") #nolint } else { stop("Unknown value on 'ties': ", ties) } } .Call(C_weightedMedian, x, w, idxs, na.rm, interpolate, ties_id) } matrixStats/R/rowMads.R0000644000175100001440000000507313073232324014557 0ustar hornikusers#' @rdname rowSds #' @export rowMads <- function(x, rows = NULL, cols = NULL, center = NULL, constant = 1.4826, na.rm = FALSE, dim. = dim(x), centers = NULL, ...) { ## BACKWARD COMPATIBILITY: ## - Added to matrixStats 0.14.0. ## - Defunct in matrixStats (>= 0.15.0) if (!is.null(centers)) { center <- centers .Defunct(msg = "Argument 'centers' for matrixStats::rowMads() has been renamed to 'center'. Please update code accordingly.") #nolint } if (is.null(center)) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) constant <- as.numeric(constant) has_nas <- TRUE x <- .Call(C_rowMads, x, dim., rows, cols, constant, na.rm, has_nas, TRUE) } else { # Apply subset on 'x' if (is.vector(x)) dim(x) <- dim. if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) # Apply subset on 'center' if (!is.null(rows)) center <- center[rows] x <- x - center if (is.null(dim(x))) dim(x) <- dim. # prevent from dim dropping x <- abs(x) x <- rowMedians(x, na.rm = na.rm, ...) x <- constant * x } x } #' @rdname rowSds #' @export colMads <- function(x, rows = NULL, cols = NULL, center = NULL, constant = 1.4826, na.rm = FALSE, dim. = dim(x), centers = NULL, ...) { ## BACKWARD COMPATIBILITY: ## - Added to matrixStats 0.14.0. ## - Defunct in matrixStats (>= 0.15.0) if (!is.null(centers)) { center <- centers .Defunct(msg = "Argument 'centers' for matrixStats::colMads() has been renamed to 'center'. Please update code accordingly.") #nolint } if (is.null(center)) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) constant <- as.numeric(constant) has_nas <- TRUE x <- .Call(C_rowMads, x, dim., rows, cols, constant, na.rm, has_nas, FALSE) } else { # Apply subset on 'x' if (is.vector(x)) dim(x) <- dim. if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) # Apply subset on 'center' if (!is.null(cols)) center <- center[cols] ## SLOW: # for (cc in seq_len(ncol(x))) { # x[, cc] <- x[, cc] - center[cc] # } ## FAST: x <- t_tx_OP_y(x, center, OP = "-", na.rm = FALSE) x <- abs(x) x <- colMedians(x, na.rm = na.rm, ...) x <- constant * x } x } matrixStats/R/varDiff.R0000644000175100001440000002251413073232324014523 0ustar hornikusers#' Estimation of scale based on sequential-order differences #' #' Estimation of scale based on sequential-order differences, corresponding to #' the scale estimates provided by \code{\link[stats]{var}}, #' \code{\link[stats]{sd}}, \code{\link[stats]{mad}} and #' \code{\link[stats]{IQR}}. #' #' Note that n-order difference MAD estimates, just like the ordinary MAD #' estimate by \code{\link[stats]{mad}}, apply a correction factor such that #' the estimates are consistent with the standard deviation under Gaussian #' distributions. #' #' The interquartile range (IQR) estimates does \emph{not} apply such a #' correction factor. If asymptotically normal consistency is wanted, the #' correction factor for IQR estimate is \code{1 / (2 * qnorm(3/4))}, which is #' half of that used for MAD estimates, which is \code{1 / qnorm(3/4)}. This #' correction factor needs to be applied manually, i.e. there is no #' \code{constant} argument for the IQR functions. #' #' @param x A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length #' N or a \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param idxs,rows,cols A \code{\link[base]{vector}} indicating subset of #' elements (or rows and/or columns) to operate over. If #' \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s #' are excluded, otherwise not. #' #' @param diff The positional distance of elements for which the difference #' should be calculated. #' #' @param trim A \code{\link[base]{double}} in [0,1/2] specifying the fraction #' of observations to be trimmed from each end of (sorted) \code{x} before #' estimation. #' #' @param constant A scale factor adjusting for asymptotically normal #' consistency. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length 1, length N, or length K. #' #' @author Henrik Bengtsson #' #' @seealso For the corresponding non-differentiated estimates, see #' \code{\link[stats]{var}}, \code{\link[stats]{sd}}, \code{\link[stats]{mad}} #' and \code{\link[stats]{IQR}}. Internally, \code{\link{diff2}}() is used #' which is a faster version of \code{\link[base]{diff}}(). #' #' @references [1] J. von Neumann et al., \emph{The mean square successive #' difference}. Annals of Mathematical Statistics, 1941, 12, 153-162.\cr #' #' @keywords iteration robust univar #' @export varDiff <- function(x, idxs = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(idxs)) x <- x[idxs] if (na.rm) x <- x[!is.na(x)] # Nothing to do? n <- length(x) if (n <= 1L) return(NA_real_) # Calculate differences? if (diff > 0L) { x <- diff2(x, differences = diff) # Nothing to do? n <- length(x) if (n == 1L) return(NA_real_) } # Trim? if (trim > 0 && n > 0L) { if (anyMissing(x)) return(NA_real_) lo <- floor(n * trim) + 1 hi <- (n + 1) - lo partial <- unique(c(lo, hi)) x <- sort.int(x, partial = partial) x <- x[lo:hi] } # Estimate var <- var(x, na.rm = FALSE) x <- NULL # Not needed anymore # Correction for the differentiation var / (2^diff) } #' @rdname varDiff #' @export sdDiff <- function(x, idxs = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(idxs)) x <- x[idxs] if (na.rm) x <- x[!is.na(x)] # Nothing to do? n <- length(x) if (n <= 1L) return(NA_real_) # Calculate differences? if (diff > 0L) { x <- diff2(x, differences = diff) # Nothing to do? n <- length(x) if (n == 1L) return(NA_real_) } # Trim? if (trim > 0 && n > 0L) { if (anyMissing(x)) return(NA_real_) lo <- floor(n * trim) + 1 hi <- (n + 1) - lo partial <- unique(c(lo, hi)) x <- sort.int(x, partial = partial) x <- x[lo:hi] } # Estimate sd <- sd(x, na.rm = FALSE) x <- NULL # Not needed anymore # Correction for the differentiation sd / (sqrt(2) ^ diff) } #' @importFrom stats mad #' @rdname varDiff #' @export madDiff <- function(x, idxs = NULL, na.rm = FALSE, diff = 1L, trim = 0, constant = 1.4826, ...) { # Apply subset if (!is.null(idxs)) x <- x[idxs] if (na.rm) x <- x[!is.na(x)] # Nothing to do? n <- length(x) if (n <= 0L) return(NA_real_) # Calculate differences? if (diff > 0L) { x <- diff2(x, differences = diff) # Nothing to do? n <- length(x) if (n == 1L) return(NA_real_) } # Trim? if (trim > 0 && n > 0L) { if (anyMissing(x)) return(NA_real_) lo <- floor(n * trim) + 1 hi <- (n + 1) - lo partial <- unique(c(lo, hi)) x <- sort.int(x, partial = partial) x <- x[lo:hi] } # Estimate sd <- mad(x, na.rm = FALSE, constant = constant, ...) x <- NULL # Not needed anymore # Correction for the differentiation sd / (sqrt(2) ^ diff) } #' @importFrom stats quantile #' @rdname varDiff #' @export iqrDiff <- function(x, idxs = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(idxs)) x <- x[idxs] if (na.rm) { x <- x[!is.na(x)] } else if (anyMissing(x)) { return(NA_real_) } # At this point, there should be no missing values # Nothing to do? n <- length(x) if (n == 0L) { return(NA_real_) } else if (n == 1L) { return(0) } # Calculate differences? if (diff > 0L) { x <- diff2(x, differences = diff) # Nothing to do? n <- length(x) if (n == 1L) return(0) } # Trim? if (trim > 0 && n > 0L) { lo <- floor(n * trim) + 1 hi <- (n + 1) - lo partial <- unique(c(lo, hi)) x <- sort.int(x, partial = partial) x <- x[lo:hi] } # Estimate qs <- quantile(x, probs = c(0.25, 0.75), na.rm = FALSE, names = FALSE, ...) x <- NULL # Not needed anymore iqr <- (qs[2L] - qs[1L]) # Correction for the differentiation iqr / (sqrt(2) ^ diff) } #' @rdname varDiff #' @export rowVarDiffs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] apply(x, MARGIN = 1L, FUN = varDiff, na.rm = na.rm, diff = diff, trim = trim, ...) } #' @rdname varDiff #' @export colVarDiffs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] apply(x, MARGIN = 2L, FUN = varDiff, na.rm = na.rm, diff = diff, trim = trim, ...) } #' @rdname varDiff #' @export rowSdDiffs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] apply(x, MARGIN = 1L, FUN = sdDiff, na.rm = na.rm, diff = diff, trim = trim, ...) } #' @rdname varDiff #' @export colSdDiffs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] apply(x, MARGIN = 2L, FUN = sdDiff, na.rm = na.rm, diff = diff, trim = trim, ...) } #' @rdname varDiff #' @export rowMadDiffs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] apply(x, MARGIN = 1L, FUN = madDiff, na.rm = na.rm, diff = diff, trim = trim, ...) } #' @rdname varDiff #' @export colMadDiffs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] apply(x, MARGIN = 2L, FUN = madDiff, na.rm = na.rm, diff = diff, trim = trim, ...) } #' @rdname varDiff #' @export rowIQRDiffs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] apply(x, MARGIN = 1L, FUN = iqrDiff, na.rm = na.rm, diff = diff, trim = trim, ...) } #' @rdname varDiff #' @export colIQRDiffs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) { # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] apply(x, MARGIN = 2L, FUN = iqrDiff, na.rm = na.rm, diff = diff, trim = trim, ...) } matrixStats/R/rowTabulates.R0000644000175100001440000000774313073232324015625 0ustar hornikusers#' Tabulates the values in a matrix by row (column) #' #' Tabulates the values in a matrix by row (column). #' #' #' @param x An \code{\link[base]{integer}} or \code{\link[base]{raw}} NxK #' \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param values An \code{\link[base]{vector}} of J values of count. If #' \code{\link[base]{NULL}}, all (unique) values are counted. #' #' @param ... Not used. #' #' @return Returns a NxJ (KxJ) \code{\link[base]{matrix}} where N (K) is the #' number of row (column) \code{\link[base]{vector}}s tabulated and J is the #' number of values counted. #' #' @example incl/rowTabulates.R #' #' @author Henrik Bengtsson #' @keywords utilities #' @export rowTabulates <- function(x, rows = NULL, cols = NULL, values = NULL, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': if (is.integer(x)) { } else if (is.raw(x)) { } else { stop("Argument 'x' is not of type integer or raw: ", class(x)[1]) } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Argument 'values': if (is.null(values)) { values <- as.vector(x) values <- unique(values) if (is.raw(values)) { values <- as.integer(values) values <- sort(values) # WORKAROUND: Cannot use "%#x" because it gives an error OSX with # R v2.9.0 devel (2009-01-13 r47593b) at R-forge. /HB 2009-06-20 names <- sprintf("%x", values) names <- paste("0x", names, sep = "") values <- as.raw(values) } else { values <- sort(values) names <- as.character(values) } } else { if (is.raw(values)) { names <- sprintf("%x", as.integer(values)) names <- paste("0x", names, sep = "") } else { names <- as.character(values) } } nbr_of_values <- length(values) counts <- matrix(0L, nrow = nrow(x), ncol = nbr_of_values) colnames(counts) <- names for (kk in seq_len(nbr_of_values)) { counts[, kk] <- rowCounts(x, value = values[kk], ...) } counts } #' @rdname rowTabulates #' @export colTabulates <- function(x, rows = NULL, cols = NULL, values = NULL, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': if (is.integer(x)) { } else if (is.raw(x)) { } else { stop("Argument 'x' is not of type integer or raw: ", class(x)[1]) } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Argument 'values': if (is.null(values)) { values <- as.vector(x) values <- unique(values) if (is.raw(values)) { values <- as.integer(values) values <- sort(values) # WORKAROUND: Cannot use "%#x" because it gives an error OSX with # R v2.9.0 devel (2009-01-13 r47593b) at R-forge. /HB 2009-06-20 names <- sprintf("%x", values) names <- paste("0x", names, sep = "") values <- as.raw(values) } else { values <- sort(values) names <- as.character(values) } } else { if (is.raw(values)) { names <- sprintf("%x", as.integer(values)) names <- paste("0x", names, sep = "") } else { names <- as.character(values) } } transpose <- FALSE if (!transpose) { nbr_of_values <- length(values) counts <- matrix(0L, nrow = ncol(x), ncol = nbr_of_values) colnames(counts) <- names for (kk in seq_len(nbr_of_values)) { counts[, kk] <- colCounts(x, value = values[kk], ...) } } counts } matrixStats/R/weightedMad.R0000644000175100001440000001300713073232324015361 0ustar hornikusers#' Weighted Median Absolute Deviation (MAD) #' #' Computes a weighted MAD of a numeric vector. #' #' #' @param x a \code{\link[base]{numeric}} \code{\link[base]{vector}} containing #' the values whose weighted MAD is to be computed. #' #' @param w a vector of weights the same length as \code{x} giving the weights #' to use for each element of \code{x}. Negative weights are treated as zero #' weights. Default value is equal weight to all values. #' #' @param idxs,rows,cols A \code{\link[base]{vector}} indicating subset of #' elements (or rows and/or columns) to operate over. If #' \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm a logical value indicating whether \code{\link[base]{NA}} #' values in \code{x} should be stripped before the computation proceeds, or #' not. If \code{\link[base]{NA}}, no check at all for \code{\link[base]{NA}}s #' is done. Default value is \code{\link[base]{NA}} (for efficiency). #' #' @param constant A \code{\link[base]{numeric}} scale factor, cf. #' \code{\link[stats]{mad}}. #' #' @param center Optional \code{\link[base]{numeric}} scalar specifying the #' center location of the data. If \code{\link[base]{NULL}}, it is estimated #' from data. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} scalar. #' #' @example incl/weightedMad.R #' #' @section Missing values: Missing values are dropped at the very beginning, #' if argument \code{na.rm} is \code{\link[base:logical]{TRUE}}, otherwise not. #' #' @author Henrik Bengtsson #' #' @seealso For the non-weighted MAD, see \code{\link[stats]{mad}}. Internally #' \code{\link{weightedMedian}}() is used to calculate the weighted median. #' #' @importFrom stats mad median #' @keywords univar robust #' @export weightedMad <- function(x, w = NULL, idxs = NULL, na.rm = FALSE, constant = 1.4826, center = NULL, ...) { # No weights? Fall back to non-weighted method. if (is.null(w)) { if (is.null(center)) center <- median(x, na.rm = na.rm) return(mad(x, center = center, constant = constant, na.rm = na.rm, ...)) } # Argument 'x': n <- length(x) # Argument 'w': if (length(w) != n) { stop("The number of elements in arguments 'w' and 'x' does not match: ", length(w), " != ", n) } else if (!is.null(idxs)) { # Apply subset on w w <- w[idxs] } # Argument 'constant': stopifnot(length(constant) == 1L, is.numeric(constant)) # Argument 'center': stopifnot(length(center) <= 1L) # Apply subset on x if (!is.null(idxs)) { x <- x[idxs] n <- length(x) } na_value <- NA storage.mode(na_value) <- storage.mode(x) # Remove values with zero (and negative) weight. This will: # 1) take care of the case when all weights are zero, # 2) it will most likely speed up the sorting. tmp <- (w > 0) if (!all(tmp)) { x <- .subset(x, tmp) w <- .subset(w, tmp) n <- length(x) } tmp <- NULL # Not needed anymore # Drop missing values? if (na.rm) { keep <- which(!is.na(x) & !is.na(w)) x <- .subset(x, keep) w <- .subset(w, keep) n <- length(x) keep <- NULL # Not needed anymore } else if (anyMissing(x)) { return(na_value) } # Are any weights Inf? Then treat them with equal weight and all others # with weight zero. tmp <- is.infinite(w) if (any(tmp)) { keep <- tmp x <- .subset(x, keep) n <- length(x) w <- rep(1, times = n) keep <- NULL # Not needed anymore } tmp <- NULL # Not needed anymore # Are there any values left to calculate the weighted median of? # This is consistent with how stats::mad() works. if (n == 0L) { return(na_value) } else if (n == 1L) { zero_value <- 0 storage.mode(zero_value) <- storage.mode(x) return(zero_value) } # Estimate the mean? if (is.null(center)) { center <- weightedMedian(x, w = w, na.rm = NA) } # Estimate the standard deviation x <- abs(x - center) sigma <- weightedMedian(x, w = w, na.rm = NA) x <- w <- NULL # Not needed anymore # Rescale for normal distributions sigma <- constant * sigma sigma } #' @rdname weightedMad #' @export rowWeightedMads <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, constant = 1.4826, center = NULL, ...) { # Argument 'constant': stopifnot(length(constant) == 1L, is.numeric(constant)) # Argument 'center': stopifnot(length(center) <= 1L) # Apply subset on x if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Apply subset on w if (!is.null(w) && !is.null(cols)) w <- w[cols] apply(x, MARGIN = 1L, FUN = weightedMad, w = w, na.rm = na.rm, constant = constant, center = center, ...) } #' @rdname weightedMad #' @export colWeightedMads <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, constant = 1.4826, center = NULL, ...) { # Argument 'constant': stopifnot(length(constant) == 1L, is.numeric(constant)) # Argument 'center': stopifnot(length(center) <= 1L) # Apply subset on x if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Apply subset on w if (!is.null(w) && !is.null(rows)) w <- w[rows] apply(x, MARGIN = 2L, FUN = weightedMad, w = w, na.rm = na.rm, constant = constant, center = center, ...) } matrixStats/R/rowCounts.R0000644000175100001440000001215713073232324015147 0ustar hornikusers#' Counts the number of TRUE values in each row (column) of a matrix #' #' Counts the number of TRUE values in each row (column) of a matrix. #' #' These functions takes either a matrix or a vector as input. If a vector, #' then argument \code{dim.} must be specified and fulfill \code{prod(dim.) == #' length(x)}. The result will be identical to the results obtained when #' passing \code{matrix(x, nrow = dim.[1L], ncol = dim.[2L])}, but avoids #' having to temporarily create/allocate a matrix, if only such is needed #' only for these calculations. #' #' @param x An NxK \code{\link[base]{matrix}} or an N * K #' \code{\link[base]{vector}}. #' #' @param idxs,rows,cols A \code{\link[base]{vector}} indicating subset of #' elements (or rows and/or columns) to operate over. If #' \code{\link[base]{NULL}}, no subsetting is done. #' #' @param value A value to search for. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s #' are excluded first, otherwise not. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return \code{rowCounts()} (\code{colCounts()}) returns an #' \code{\link[base]{integer}} \code{\link[base]{vector}} of length N (K). #' #' @example incl/rowCounts.R #' #' @author Henrik Bengtsson #' @seealso rowAlls #' @keywords array logic iteration univar #' @export rowCounts <- function(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) { # Argument 'x': if (is.matrix(x)) { } else if (is.vector(x)) { } else { stop("Argument 'x' must be a matrix or a vector: ", mode(x)[1L]) } # Argument 'dim.': dim. <- as.integer(dim.) # Argument 'value': if (length(value) != 1L) { stop("Argument 'value' has to be a single value: ", length(value)) } # Coerce 'value' to matrix storage.mode(value) <- storage.mode(x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Count # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (is.numeric(x) || is.logical(x)) { na.rm <- as.logical(na.rm) has_nas <- TRUE counts <- .Call(C_rowCounts, x, dim., rows, cols, value, 2L, na.rm, has_nas) } else { if (is.vector(x)) dim(x) <- dim. # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) if (is.na(value)) { counts <- apply(x, MARGIN = 1L, FUN = function(x) sum(is.na(x))) } else { counts <- apply(x, MARGIN = 1L, FUN = function(x) { sum(x == value, na.rm = na.rm) }) } } as.integer(counts) } #' @rdname rowCounts #' @export colCounts <- function(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) { # Argument 'x': if (is.matrix(x)) { } else if (is.vector(x)) { } else { stop("Argument 'x' must be a matrix or a vector: ", mode(x)[1L]) } # Argument 'dim.': dim. <- as.integer(dim.) # Argument 'value': if (length(value) != 1L) { stop("Argument 'value' has to be a single value: ", length(value)) } # Coerce 'value' to matrix storage.mode(value) <- storage.mode(x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Count # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (is.numeric(x) || is.logical(x)) { na.rm <- as.logical(na.rm) has_nas <- TRUE counts <- .Call(C_colCounts, x, dim., rows, cols, value, 2L, na.rm, has_nas) } else { if (is.vector(x)) dim(x) <- dim. # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] dim. <- dim(x) if (is.na(value)) { counts <- apply(x, MARGIN = 2L, FUN = function(x) sum(is.na(x)) ) } else { counts <- apply(x, MARGIN = 2L, FUN = function(x) sum(x == value, na.rm = na.rm) ) } } as.integer(counts) } #' @rdname rowCounts #' @export count <- function(x, idxs = NULL, value = TRUE, na.rm = FALSE, ...) { # Argument 'x': if (!is.vector(x)) { stop("Argument 'x' must be a vector: ", mode(x)[1L]) } # Argument 'value': if (length(value) != 1L) { stop("Argument 'value' has to be a single value: ", length(value)) } # Coerce 'value' to matrix storage.mode(value) <- storage.mode(x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Count # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (is.numeric(x) || is.logical(x)) { na.rm <- as.logical(na.rm) has_nas <- TRUE counts <- .Call(C_count, x, idxs, value, 2L, na.rm, has_nas) } else { # Apply subset if (!is.null(idxs)) x <- x[idxs] if (is.na(value)) { counts <- sum(is.na(x)) } else { counts <- sum(x == value, na.rm = na.rm) } } as.integer(counts) } matrixStats/R/psortKM.R0000644000175100001440000000020013073232324014525 0ustar hornikusers.psortKM <- function(x, k = length(x), m = 1L, ...) { .Call(C_psortKM, as.numeric(x), k = as.integer(k), m = as.integer(m)) } matrixStats/R/rowDiffs.R0000644000175100001440000000277213073232324014731 0ustar hornikusers#' Calculates difference for each row (column) in a matrix #' #' Calculates difference for each row (column) in a matrix. #' #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param lag An \code{\link[base]{integer}} specifying the lag. #' #' @param differences An \code{\link[base]{integer}} specifying the order of #' difference. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} Nx(K-1) or (N-1)xK #' \code{\link[base]{matrix}}. #' #' @example incl/rowDiffs.R #' #' @author Henrik Bengtsson #' #' @seealso See also \code{\link{diff2}}(). #' @keywords array iteration robust univar #' @export rowDiffs <- function(x, rows = NULL, cols = NULL, lag = 1L, differences = 1L, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowDiffs, x, dim., rows, cols, as.integer(lag), as.integer(differences), TRUE) } #' @rdname rowDiffs #' @export colDiffs <- function(x, rows = NULL, cols = NULL, lag = 1L, differences = 1L, dim. = dim(x), ...) { dim <- as.integer(dim.) .Call(C_rowDiffs, x, dim., rows, cols, as.integer(lag), as.integer(differences), FALSE) } matrixStats/R/logSumExp.R0000644000175100001440000000527513073232324015072 0ustar hornikusers#' Accurately computes the logarithm of the sum of exponentials #' #' Accurately computes the logarithm of the sum of exponentials, that is, #' \eqn{log(sum(exp(lx)))}. If \eqn{lx = log(x)}, then this is equivalently to #' calculating \eqn{log(sum(x))}. #' #' This function, which avoid numerical underflow, is often used when computing #' the logarithm of the sum of small numbers (\eqn{|x| << 1}) such as #' probabilities. #' #' This is function is more accurate than \code{log(sum(exp(lx)))} when the #' values of \eqn{x = exp(lx)} are \eqn{|x| << 1}. The implementation of this #' function is based on the observation that \deqn{ log(a + b) = [ la = log(a), #' lb = log(b) ] = log( exp(la) + exp(lb) ) = la + log ( 1 + exp(lb - la) ) } #' Assuming \eqn{la > lb}, then \eqn{|lb - la| < |lb|}, and it is less likely #' that the computation of \eqn{1 + exp(lb - la)} will not underflow/overflow #' numerically. Because of this, the overall result from this function should #' be more accurate. Analogously to this, the implementation of this function #' finds the maximum value of \code{lx} and subtracts it from the remaining #' values in \code{lx}. #' #' @param lx A \code{\link[base]{numeric}} \code{\link[base]{vector}}. #' Typically \code{lx} are \eqn{log(x)} values. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, any missing values are #' ignored, otherwise not. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} scalar. #' #' @section Benchmarking: This method is optimized for correctness, that #' avoiding underflowing. It is implemented in native code that is optimized #' for speed and memory. #' #' @example incl/logSumExp.R #' #' @author Henrik Bengtsson #' #' @seealso To compute this function on rows or columns of a matrix, see #' \code{\link{rowLogSumExps}}(). #' #' For adding \emph{two} double values in native code, R provides the C #' function \code{logspace_add()} [1]. For properties of the #' log-sum-exponential function, see [2]. #' #' @references #' [1] R Core Team, \emph{Writing R Extensions}, v3.0.0, April 2013. \cr #' [2] Laurent El Ghaoui, \emph{Hyper-Textbook: Optimization Models #' and Applications}, University of California at Berkeley, August 2012. #' (Chapter 'Log-Sum-Exp (LSE) Function and Properties') \cr #' [3] R-help thread \emph{logsumexp function in R}, 2011-02-17. #' \url{https://stat.ethz.ch/pipermail/r-help/2011-February/269205.html}\cr #' #' @export logSumExp <- function(lx, idxs = NULL, na.rm = FALSE, ...) { has_na <- TRUE .Call(C_logSumExp, as.numeric(lx), idxs, as.logical(na.rm), has_na) } matrixStats/R/binMeans.R0000644000175100001440000001065713073232324014703 0ustar hornikusers#' Fast mean calculations in non-overlapping bins #' #' Computes the sample means in non-overlapping bins #' #' \code{binMeans(x, bx, right = TRUE)} gives equivalent results as #' \code{rev(binMeans(-x, bx = sort(-bx), right = FALSE))}, but is faster. #' #' @param y A \code{\link[base]{numeric}} \code{\link[base]{vector}} of K #' values to calculate means on. #' #' @param x A \code{\link[base]{numeric}} \code{\link[base]{vector}} of K #' positions for to be binned. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param bx A \code{\link[base]{numeric}} \code{\link[base]{vector}} of B + 1 #' ordered positions specifying the B > 0 bins \code{[bx[1], bx[2])}, #' \code{[bx[2], bx[3])}, ..., \code{[bx[B], bx[B + 1])}. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, missing values in \code{y} #' are dropped before calculating the mean, otherwise not. #' #' @param count If \code{\link[base:logical]{TRUE}}, the number of data points #' in each bins is returned as attribute \code{count}, which is an #' \code{\link[base]{integer}} \code{\link[base]{vector}} of length B. #' #' @param right If \code{\link[base:logical]{TRUE}}, the bins are right-closed #' (left open), otherwise left-closed (right open). #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length B. #' #' @section Missing and non-finite values: #' Data points where either of \code{y} and \code{x} is missing are dropped #' (and therefore are also not counted). Non-finite values in \code{y} are #' not allowed and gives an error. Missing values in \code{bx} are not allowed #' and gives an error. #' #' @example incl/binMeans.R #' #' @author Henrik Bengtsson with initial code contributions by #' Martin Morgan [1]. #' #' @seealso \code{\link{binCounts}}(). \code{\link[stats]{aggregate}} and #' \code{\link[base]{mean}}(). #' #' @references [1] R-devel thread \emph{Fastest non-overlapping binning mean #' function out there?} on Oct 3, 2012\cr #' #' @keywords univar #' @export binMeans <- function(y, x, idxs = NULL, bx, na.rm = TRUE, count = TRUE, right = FALSE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'y': if (!is.numeric(y)) { stop("Argument 'y' is not numeric: ", mode(y)) } if (any(is.infinite(y))) { stop("Argument 'y' must not contain Inf values.") } n <- length(y) # Argument 'x': if (!is.numeric(x)) { stop("Argument 'x' is not numeric: ", mode(x)) } if (length(x) != n) { stop("Argument 'y' and 'x' are of different lengths: ", length(y), " != ", length(x)) } # Argument 'bx': if (!is.numeric(bx)) { stop("Argument 'bx' is not numeric: ", mode(bx)) } if (any(is.infinite(bx))) { stop("Argument 'bx' must not contain Inf values.") } if (is.unsorted(bx)) { stop("Argument 'bx' is not ordered.") } # Argument 'na.rm': if (!is.logical(na.rm)) { stop("Argument 'na.rm' is not logical: ", mode(na.rm)) } # Argument 'count': if (!is.logical(count)) { stop("Argument 'count' is not logical: ", mode(count)) } # Apply subset if (!is.null(idxs)) { x <- x[idxs] y <- y[idxs] } # Argument 'right': right <- as.logical(right) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Preprocessing of (x, y) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Drop missing values in 'x' keep <- which(!is.na(x)) if (length(keep) < n) { x <- x[keep] y <- y[keep] n <- length(y) } keep <- NULL # Not needed anymore # Drop missing values in 'y'? if (na.rm) { keep <- which(!is.na(y)) if (length(keep) < n) { x <- x[keep] y <- y[keep] } keep <- NULL # Not needed anymore } # Order (x, y) by increasing x. # If 'x' is already sorted, the overhead of (re)sorting is # relatively small. x <- sort.int(x, method = "quick", index.return = TRUE) y <- y[x$ix] x <- x$x # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Bin # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - y <- as.numeric(y) x <- as.numeric(x) bx <- as.numeric(bx) count <- as.logical(count) .Call(C_binMeans, y, x, bx, count, right) } matrixStats/R/rowSums2.R0000644000175100001440000000277513073232324014712 0ustar hornikusers#' Calculates the sum for each row (column) in a matrix #' #' Calculates the sum for each row (column) in a matrix. #' #' The implementation of \code{rowSums2()} and \code{colSums2()} is #' optimized for both speed and memory. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s #' are excluded first, otherwise not. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @author Henrik Bengtsson #' #' @keywords array iteration robust univar #' @export rowSums2 <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) has_nas <- TRUE return(.Call(C_rowSums2, x, dim., rows, cols, na.rm, has_nas, TRUE)) } #' @rdname rowSums2 #' @export colSums2 <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) { dim. <- as.integer(dim.) na.rm <- as.logical(na.rm) has_nas <- TRUE return(.Call(C_rowSums2, x, dim., rows, cols, na.rm, has_nas, FALSE)) } matrixStats/R/999.package.R0000644000175100001440000000154613073627114015075 0ustar hornikusers#' Package matrixStats #' #' High-performing functions operating on rows and columns of matrices, e.g. #' col / rowMedians(), col / rowRanks(), and col / rowSds(). Functions #' optimized per data type and for subsetted calculations such that both memory #' usage and processing time is minimized. There are also optimized #' vector-based methods, e.g. binMeans(), madDiff() and weightedMedian(). #' #' @section How to cite this package: #' Henrik Bengtsson (2017). matrixStats: Functions that Apply to Rows and #' Columns of Matrices (and to Vectors). R package version 0.52.2. #' https://github.com/HenrikBengtsson/matrixStats #' #' @author Henrik Bengtsson, Hector Corrada Bravo, Robert Gentleman, Ola #' Hossjer, Harris Jaffee, Dongcan Jiang, Peter Langfelder #' #' @keywords package #' #' @name matrixStats-package #' @aliases matrixStats #' @docType package NULL matrixStats/R/weightedVar.R0000644000175100001440000001322213073232324015407 0ustar hornikusers#' Weighted variance and weighted standard deviation #' #' Computes a weighted variance / standard deviation of a numeric vector or #' across rows or columns of a matrix. #' #' #' @param x a \code{\link[base]{numeric}} \code{\link[base]{vector}} containing #' the values whose weighted variance is to be computed. #' #' @param w a vector of weights the same length as \code{x} giving the weights #' to use for each element of \code{x}. Negative weights are treated as zero #' weights. Default value is equal weight to all values. #' #' @param idxs,rows,cols A \code{\link[base]{vector}} indicating subset of #' elements (or rows and/or columns) to operate over. If #' \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm a logical value indicating whether \code{\link[base]{NA}} #' values in \code{x} should be stripped before the computation proceeds, or #' not. If \code{\link[base]{NA}}, no check at all for \code{\link[base]{NA}}s #' is done. Default value is \code{\link[base]{NA}} (for efficiency). #' #' @param center Optional \code{\link[base]{numeric}} scalar specifying the #' center location of the data. If \code{\link[base]{NULL}}, it is estimated #' from data. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} scalar. #' #' @section Missing values: Missing values are dropped at the very beginning, #' if argument \code{na.rm} is \code{\link[base:logical]{TRUE}}, otherwise not. #' #' @author Henrik Bengtsson #' #' @seealso For the non-weighted variance, see \code{\link[stats]{var}}. #' #' @keywords univar robust #' @export weightedVar <- function(x, w = NULL, idxs = NULL, na.rm = FALSE, center = NULL, ...) { # Argument 'x': n <- length(x) # Argument 'w': if (is.null(w)) { w <- rep(1, times = n) } else if (length(w) != n) { stop("The number of elements in arguments 'w' and 'x' does not match: ", length(w), " != ", n) } else if (!is.null(idxs)) { # Apply subset on 'w' w <- w[idxs] } # Apply subset on 'x' if (!is.null(idxs)) { x <- x[idxs] n <- length(x) } # Argument 'na.rm': # Argument 'method': method <- list(...)$method ## Backward compatible but incorrect estimate? ## See https://github.com/HenrikBengtsson/matrixStats/issues/72 use_0.14.2 <- (identical(method, "0.14.2")) if (use_0.14.2) { .Deprecated(msg = "weightedVar(..., method = \"0.14.2\") should not be used since it uses an incorrect degree-of-freedom term. It was supported only for very rare backward compatible reasons. It will be defunct in a future version of matrixStats.") #nolint } na_value <- NA storage.mode(na_value) <- storage.mode(x) # Remove values with zero (and negative) weight. This will: # 1) take care of the case when all weights are zero, # 2) it will most likely speed up the sorting. tmp <- (w > 0) if (!all(tmp)) { x <- .subset(x, tmp) w <- .subset(w, tmp) n <- length(x) } tmp <- NULL # Not needed anymore # Drop missing values? if (na.rm) { keep <- which(!is.na(x) & !is.na(w)) x <- .subset(x, keep) w <- .subset(w, keep) n <- length(x) keep <- NULL # Not needed anymore } else if (anyMissing(x)) { return(na_value) } # Are any weights Inf? Then treat them with equal weight and all others # with weight zero. tmp <- is.infinite(w) if (any(tmp)) { keep <- tmp x <- .subset(x, keep) n <- length(x) w <- rep(1, times = n) keep <- NULL # Not needed anymore } tmp <- NULL # Not needed anymore # Are there any values left to calculate the weighted variance of? # This is consistent with how stats::var() works. if (n <= 1L) return(na_value) # Standardize weights to sum to one wsum <- sum(w) w <- w / wsum # Estimate the mean? if (is.null(center)) { center <- sum(w * x) } # Estimate the variance x <- x - center # Residuals x <- x^2 # Squared residuals ## Correction factor lambda <- wsum / (wsum - 1) if (use_0.14.2) lambda <- n / (n - 1L) sigma2 <- lambda * sum(w * x) x <- w <- NULL # Not needed anymore sigma2 } #' @rdname weightedVar #' @export weightedSd <- function(...) { sqrt(weightedVar(...)) } #' @rdname weightedVar #' @export rowWeightedVars <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) { # Apply subset on 'x' if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Apply subset on 'w' if (!is.null(w) && !is.null(cols)) w <- w[cols] apply(x, MARGIN = 1L, FUN = weightedVar, w = w, na.rm = na.rm, ...) } #' @rdname weightedVar #' @export colWeightedVars <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) { # Apply subset on 'x' if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Apply subset on 'w' if (!is.null(w) && !is.null(rows)) w <- w[rows] apply(x, MARGIN = 2L, FUN = weightedVar, w = w, na.rm = na.rm, ...) } #' @rdname weightedVar #' @export rowWeightedSds <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) { sqrt(rowWeightedVars(x = x, w = w, rows = rows, cols = cols, na.rm = na.rm, ...)) } #' @rdname weightedVar #' @export colWeightedSds <- function(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) { sqrt(colWeightedVars(x = x, w = w, rows = rows, cols = cols, na.rm = na.rm, ...)) } matrixStats/R/mean2.R0000644000175100001440000000476513073232324014154 0ustar hornikusers#' Fast averaging over subset of vector elements #' #' Computes the sample mean of all or a subset of values. #' #' \code{mean2(x, idxs)} gives equivalent results as \code{mean(x[idxs])}, #' but is faster and more memory efficient since it avoids the actual #' subsetting which requires copying of elements and garbage collection #' thereof. #' #' If \code{x} is \code{\link[base]{numeric}} and \code{refine = TRUE}, then a #' two-pass scan is used to calculate the average. The first scan calculates #' the total sum and divides by the number of (non-missing) values. In the #' second scan, this average is refined by adding the residuals towards the #' first average. The \code{\link[base]{mean}}() uses this approach. #' \code{mean2(..., refine = FALSE)} is almost twice as fast as #' \code{mean2(..., refine = TRUE)}. #' #' @param x A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length #' N. #' #' @param idxs A \code{\link[base]{vector}} indicating subset of elements to #' operate over. If \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, missing values are #' skipped, otherwise not. #' #' @param refine If \code{\link[base:logical]{TRUE}} and \code{x} is #' \code{\link[base]{numeric}}, then extra effort is used to calculate the #' average with greater numerical precision, otherwise not. #' #' @param ... Not used. #' #' @return Returns a \code{\link[base]{numeric}} scalar. #' #' @example incl/mean2.R #' #' @author Henrik Bengtsson #' #' @seealso \code{\link[base]{mean}}(). #' To efficiently sum over a subset, see \code{\link{sum2}}(). #' @keywords univar internal #' @export mean2 <- function(x, idxs = NULL, na.rm = FALSE, refine = TRUE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': if (!is.numeric(x)) { stop("Argument 'x' is not numeric: ", mode(x)) } # Argument 'na.rm': if (!is.logical(na.rm)) { stop("Argument 'na.rm' is not logical: ", mode(na.rm)) } # Argument 'refine': if (!is.logical(refine)) { stop("Argument 'refine' is not logical: ", mode(refine)) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Averaging # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .Call(C_mean2, x, idxs, na.rm, refine) } #' @rdname mean2 #' @export meanOver <- function(...) { .Deprecated(new = "mean2") mean2(...) } matrixStats/R/rowSds.R0000644000175100001440000000324713073232324014425 0ustar hornikusers#' Standard deviation estimates for each row (column) in a matrix #' #' Standard deviation estimates for each row (column) in a matrix. #' #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param center A optional \code{\link[base]{numeric}} #' \code{\link[base]{vector}} of length N (K) with centers. By default, they #' are calculated using \code{\link{rowMedians}}(). #' #' @param constant A scale factor. See \code{\link[stats]{mad}} for details. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, missing values are removed #' first, otherwise not. #' #' @param dim. An \code{\link[base]{integer}} \code{\link[base]{vector}} of #' length two specifying the dimension of \code{x}, also when not a #' \code{\link[base]{matrix}}. #' #' @param ... Additional arguments passed to \code{\link{rowVars}}() and #' \code{\link{rowMedians}}(), respectively. #' #' @param centers (deprectated) use \code{center} instead. #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @author Henrik Bengtsson #' #' @seealso \code{\link[stats]{sd}}, \code{\link[stats]{mad}} and #' \code{\link[stats:cor]{var}}. \code{\link{rowIQRs}}(). #' @keywords array iteration robust univar #' #' @export rowSds <- function(x, rows = NULL, cols = NULL, ...) { x <- rowVars(x, rows = rows, cols = cols, ...) sqrt(x) } #' @rdname rowSds #' @export colSds <- function(x, rows = NULL, cols = NULL, ...) { x <- colVars(x, rows = rows, cols = cols, ...) sqrt(x) } matrixStats/R/zzz.R0000644000175100001440000000022313073232324013770 0ustar hornikusers#' @useDynLib "matrixStats", .registration = TRUE, .fixes = "C_" .onUnload <- function(libpath) { library.dynam.unload("matrixStats", libpath) } matrixStats/R/anyMissing.R0000644000175100001440000000426113073232324015262 0ustar hornikusers#' Checks if there are any missing values in an object or not #' #' Checks if there are any missing values in an object or not. #' \emph{Please use \code{base::anyNA()} instead of \code{anyMissing()}, #' \code{colAnyNAs()} instead of \code{colAnyMissings()}, and #' \code{rowAnyNAs()} instead of \code{rowAnyMissings()}.} #' #' The implementation of this method is optimized for both speed and memory. #' The method will return \code{\link[base:logical]{TRUE}} as soon as a missing #' value is detected. #' #' @param x A \code{\link[base]{vector}}, a \code{\link[base]{list}}, a #' \code{\link[base]{matrix}}, a \code{\link[base]{data.frame}}, or #' \code{\link[base]{NULL}}. #' #' @param idxs,rows,cols A \code{\link[base]{vector}} indicating subset of #' elements (or rows and/or columns) to operate over. If #' \code{\link[base]{NULL}}, no subsetting is done. #' @param ... Not used. #' #' @return Returns \code{\link[base:logical]{TRUE}} if a missing value was #' detected, otherwise \code{\link[base:logical]{FALSE}}. #' #' @examples #' x <- rnorm(n = 1000) #' x[seq(300, length(x), by = 100)] <- NA #' stopifnot(anyMissing(x) == any(is.na(x))) #' #' @author Henrik Bengtsson #' #' @seealso Starting with R v3.1.0, there is \code{anyNA()} in the \pkg{base}, #' which provides the same functionality as \code{anyMissing()}. #' #' @keywords iteration logic #' @export anyMissing <- function(x, idxs = NULL, ...) { ## All list or a data.frame? if (is.list(x)) { for (kk in seq_along(x)) { if (.Call(C_anyMissing, x[[kk]], idxs)) return(TRUE) } return(FALSE) } else { ## All other data types .Call(C_anyMissing, x, idxs) } } #' @rdname anyMissing #' @export colAnyMissings <- function(x, rows = NULL, cols = NULL, ...) { colAnys(x, rows, cols, value = NA, ...) } #' @rdname anyMissing #' @export rowAnyMissings <- function(x, rows = NULL, cols = NULL, ...) { rowAnys(x, rows, cols, value = NA, ...) } #' @rdname anyMissing #' @export colAnyNAs <- function(x, rows = NULL, cols = NULL, ...) { colAnys(x, rows, cols, value = NA, ...) } #' @rdname anyMissing #' @export rowAnyNAs <- function(x, rows = NULL, cols = NULL, ...) { rowAnys(x, rows, cols, value = NA, ...) } matrixStats/R/rowIQRs.R0000644000175100001440000000446213073232324014512 0ustar hornikusers#' Estimates of the interquartile range for each row (column) in a matrix #' #' Estimates of the interquartile range for each row (column) in a matrix. #' #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. #' #' @param idxs,rows,cols A \code{\link[base]{vector}} indicating subset of #' elements (or rows and/or columns) to operate over. If #' \code{\link[base]{NULL}}, no subsetting is done. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, missing values are dropped #' first, otherwise not. #' #' @param ... Additional arguments passed to \code{\link{rowQuantiles}}() #' (\code{colQuantiles()}). #' #' @return Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of #' length N (K). #' #' @section Missing values: Contrary to \code{\link[stats]{IQR}}, which gives #' an error if there are missing values and \code{na.rm = FALSE}, \code{iqr()} #' and its corresponding row and column-specific functions return #' \code{\link[base]{NA}}_real_. #' #' @example incl/rowIQRs.R #' #' @author Henrik Bengtsson #' @seealso See \code{\link[stats]{IQR}}. See \code{\link{rowSds}}(). #' @keywords array iteration robust univar #' #' @importFrom stats quantile #' @export rowIQRs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, ...) { Q <- rowQuantiles(x, rows = rows, cols = cols, probs = c(0.25, 0.75), na.rm = na.rm, drop = FALSE, ...) ans <- Q[, 2L, drop = TRUE] - Q[, 1L, drop = TRUE] # Remove attributes attributes(ans) <- NULL ans } #' @rdname rowIQRs #' @export colIQRs <- function(x, rows = NULL, cols = NULL, na.rm = FALSE, ...) { Q <- colQuantiles(x, rows = rows, cols = cols, probs = c(0.25, 0.75), na.rm = na.rm, drop = FALSE, ...) ans <- Q[, 2L, drop = TRUE] - Q[, 1L, drop = TRUE] # Remove attributes attributes(ans) <- NULL ans } #' @rdname rowIQRs #' @export iqr <- function(x, idxs = NULL, na.rm = FALSE, ...) { # Apply subset if (!is.null(idxs)) x <- x[idxs] if (na.rm) { x <- x[!is.na(x)] } else if (anyMissing(x)) { return(NA_real_) } # At this point, there should be no missing values # Nothing to do? n <- length(x) if (n == 0L) { return(NA_real_) } else if (n == 1L) { return(0) } q <- quantile(x, probs = c(0.25, 0.75), names = FALSE, na.rm = FALSE, ...) q[2L] - q[1L] } matrixStats/R/rowQuantiles.R0000644000175100001440000001616113073232536015645 0ustar hornikusers#' Estimates quantiles for each row (column) in a matrix #' #' Estimates quantiles for each row (column) in a matrix. #' #' @param x A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}} with #' N >= 0. #' #' @param rows,cols A \code{\link[base]{vector}} indicating subset of rows #' (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting #' is done. #' #' @param probs A \code{\link[base]{numeric}} \code{\link[base]{vector}} of J #' probabilities in [0, 1]. #' #' @param na.rm If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s #' are excluded first, otherwise not. #' #' @param type An \code{\link[base]{integer}} specify the type of estimator. #' See \code{\link[stats]{quantile}} for more details. #' #' @param ... Additional arguments passed to \code{\link[stats]{quantile}}. #' #' @param drop If TRUE, singleton dimensions in the result are dropped, #' otherwise not. #' #' @return Returns a \code{\link[base]{numeric}} NxJ (KxJ) #' \code{\link[base]{matrix}}, where N (K) is the number of rows (columns) for #' which the J quantiles are calculated. #' #' @example incl/rowQuantiles.R #' #' @author Henrik Bengtsson #' @seealso \code{\link[stats]{quantile}}. #' @keywords array iteration robust univar #' #' @importFrom stats quantile #' @export rowQuantiles <- function(x, rows = NULL, cols = NULL, probs = seq(from = 0, to = 1, by = 0.25), na.rm = FALSE, type = 7L, ..., drop = TRUE) { # Argument 'x': if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Argument 'probs': if (anyMissing(probs)) { stop("Argument 'probs' contains missing values") } eps <- 100 * .Machine$double.eps if (any((probs < -eps | probs > 1 + eps))) { stop("Argument 'probs' is out of range [0-eps, 1+eps]") } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Argument 'x': nrow <- nrow(x) ncol <- ncol(x) if (nrow > 0L && ncol > 0L) { na_rows <- rowAnyMissings(x) has_na <- any(na_rows) if (!has_na) na.rm <- FALSE if (!has_na && type == 7L) { n <- ncol idxs <- 1 + (n - 1) * probs idxs_lo <- floor(idxs) idxs_hi <- ceiling(idxs) partial <- sort(unique(c(idxs_lo, idxs_hi))) xp <- apply(x, MARGIN = 1L, FUN = sort, partial = partial) if (is.null(dim(xp))) dim(xp) <- c(1L, length(xp)) q <- apply(xp, MARGIN = 2L, FUN = .subset, idxs_lo) if (is.null(dim(q))) dim(q) <- c(1L, length(q)) # Adjust idxs_adj <- which(idxs > idxs_lo) if (length(idxs_adj) > 0L) { q_lo <- q[idxs_adj, , drop = FALSE] idxs_hi <- idxs_hi[idxs_adj] q_hi <- apply(xp, MARGIN = 2L, FUN = .subset, idxs_hi) w <- (idxs - idxs_lo)[idxs_adj] q[idxs_adj, ] <- (1 - w) * q_lo + w * q_hi # Not needed anymore xp <- q_lo <- q_hi <- NULL } # Backward compatibility q <- t(q) } else { # Allocate result na_value <- NA_real_ storage.mode(na_value) <- storage.mode(x) q <- matrix(na_value, nrow = nrow, ncol = length(probs)) # For each row... rows <- seq_len(nrow) # Rows with NAs should return all NAs (so skip those) if (has_na && !na.rm) rows <- rows[!na_rows] for (kk in rows) { xkk <- x[kk, ] if (na.rm) xkk <- xkk[!is.na(xkk)] q[kk, ] <- quantile(xkk, probs = probs, na.rm = FALSE, type = type, ...) } } # if (type ...) } else { na_value <- NA_real_ storage.mode(na_value) <- storage.mode(x) q <- matrix(na_value, nrow = nrow, ncol = length(probs)) } # Add names digits <- max(2L, getOption("digits")) colnames(q) <- sprintf("%.*g%%", digits, 100 * probs) # Drop singleton dimensions? if (drop) { q <- drop(q) } q } #' @importFrom stats quantile #' @rdname rowQuantiles #' @export colQuantiles <- function(x, rows = NULL, cols = NULL, probs = seq(from = 0, to = 1, by = 0.25), na.rm = FALSE, type = 7L, ..., drop = TRUE) { # Argument 'x': if (!is.matrix(x)) { .Deprecated(msg = sprintf("Argument 'x' is of class %s, but should be a matrix. The use of a %s is not supported, the correctness of the result is not guaranteed, and will be defunct (produce an error) in a future version of matrixStats. Please update your code accordingly.", sQuote(class(x)[1]), sQuote(class(x)[1]))) #nolint } # Argument 'probs': if (anyMissing(probs)) { stop("Argument 'probs' contains missing values") } eps <- 100 * .Machine$double.eps if (any((probs < -eps | probs > 1 + eps))) { stop("Argument 'probs' is out of range [0-eps, 1+eps]") } # Apply subset if (!is.null(rows) && !is.null(cols)) x <- x[rows, cols, drop = FALSE] else if (!is.null(rows)) x <- x[rows, , drop = FALSE] else if (!is.null(cols)) x <- x[, cols, drop = FALSE] # Argument 'x': nrow <- nrow(x) ncol <- ncol(x) if (nrow > 0L && ncol > 0L) { na_cols <- colAnyMissings(x) has_na <- any(na_cols) if (!has_na) na.rm <- FALSE if (!has_na && type == 7L) { n <- nrow idxs <- 1 + (n - 1) * probs idxs_lo <- floor(idxs) idxs_hi <- ceiling(idxs) partial <- sort(unique(c(idxs_lo, idxs_hi))) xp <- apply(x, MARGIN = 2L, FUN = sort, partial = partial) if (is.null(dim(xp))) dim(xp) <- c(1L, length(xp)) q <- apply(xp, MARGIN = 2L, FUN = .subset, idxs_lo) if (is.null(dim(q))) dim(q) <- c(1L, length(q)) # Adjust idxs_adj <- which(idxs > idxs_lo) if (length(idxs_adj) > 0L) { q_lo <- q[idxs_adj, , drop = FALSE] idxs_hi <- idxs_hi[idxs_adj] q_hi <- apply(xp, MARGIN = 2L, FUN = .subset, idxs_hi) w <- (idxs - idxs_lo)[idxs_adj] q[idxs_adj, ] <- (1 - w) * q_lo + w * q_hi # Not needed anymore xp <- q_lo <- q_hi <- NULL } # Backward compatibility q <- t(q) } else { # Allocate result na_value <- NA_real_ storage.mode(na_value) <- storage.mode(x) q <- matrix(na_value, nrow = ncol, ncol = length(probs)) # For each column... cols <- seq_len(ncol) # Columns with NAs should return all NAs (so skip those) if (has_na && !na.rm) cols <- cols[!na_cols] for (kk in cols) { xkk <- x[, kk] if (na.rm) xkk <- xkk[!is.na(xkk)] q[kk, ] <- quantile(xkk, probs = probs, na.rm = FALSE, type = type, ...) } } # if (type ...) } else { na_value <- NA_real_ storage.mode(na_value) <- storage.mode(x) q <- matrix(na_value, nrow = ncol, ncol = length(probs)) } # Add names digits <- max(2L, getOption("digits")) colnames(q) <- sprintf("%.*g%%", digits, 100 * probs) # Drop singleton dimensions? if (drop) { q <- drop(q) } q } matrixStats/vignettes/0000755000175100001440000000000013073627232014630 5ustar hornikusersmatrixStats/vignettes/matrixStats-methods.md.rsp0000644000175100001440000002131013070644022021727 0ustar hornikusers<%@meta language="R-vignette" content="-------------------------------- DIRECTIVES FOR R: %\VignetteIndexEntry{matrixStats: Summary of functions} %\VignetteAuthor{Henrik Bengtsson} %\VignetteKeyword{matrix} %\VignetteKeyword{vector} %\VignetteKeyword{apply} %\VignetteKeyword{rows} %\VignetteKeyword{columns} %\VignetteKeyword{memory} %\VignetteKeyword{speed} %\VignetteEngine{R.rsp::rsp} %\VignetteTangle{FALSE} --------------------------------------------------------------------"%> <% pkgName <- "matrixStats" library(pkgName, character.only=TRUE) ns <- getNamespace(pkgName) env <- as.environment(sprintf("package:%s", pkgName)) R.utils::use("R.utils") kable <- function(df, ...) { fcns <- as.character(df$Functions) fcns <- strsplit(fcns, split=",") fcns <- sapply(fcns, FUN=function(names) { names <- trim(names) ok <- sapply(names, FUN=exists, envir=ns, mode="function") names[ok] <- sprintf("%s()", names[ok]) names[!ok] <- sprintf("~~%s()~~", names[!ok]) names <- paste(names, collapse=", ") }) df$Functions <- fcns df$Example <- sprintf("`%s`", df$Example) print(knitr::kable(df, ..., format="markdown")) } # Find all functions all <- ls(envir=env) keep <- sapply(all, FUN=function(name) { is.function(get(name, envir=env)) }) all <- all[keep] keep <- !grepl("[.]([^.]*)$", all) all <- all[keep] # Hidden functions skip <- c("rowAvgsPerColSet", "colAvgsPerRowSet") skip <- c(skip, "allocArray", "allocMatrix", "allocVector") all <- setdiff(all, skip) # Column and row functions crfcns <- grep("^(col|row)", all, value=TRUE) # Vector functions vfcns <- setdiff(all, crfcns) %> # <%@meta name="title"%> <% pkg <- R.oo::Package(pkgName) %> <%@meta name="author"%> on <%=format(as.Date(pkg$date), format="%B %d, %Y")%> <% fcns <- crfcns base <- gsub("^(col|row)", "", fcns) groups <- tapply(fcns, base, FUN=list) stopifnot(all(sapply(groups, FUN=length) == 2L)) groups <- matrix(unlist(groups, use.names=FALSE), nrow=2L) %> <%--- ## Functions that apply to column and rows of matrices ``` <% print(fcns) %> ``` ---%> <% fcns <- vfcns %> <%--- ## Functions that apply to vectors ``` <% print(fcns) %> ``` ---%> ## Location and scale estimators <% tbl <- NULL row <- data.frame( "Estimator" = "Weighted sample mean", "Functions" = "weightedMean, colWeightedMeans, rowWeightedMeans", "Example" = "weightedMean(x, w); rowWeightedMeans(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Mean", "Functions" = "mean2, colMeans2, rowMeans2", "Example" = "mean2(x); rowMeans2(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Median", "Functions" = "median, colMedians, rowMedians", "Example" = "median(x); rowMedians(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Weighted median", "Functions" = "weightedMedian, colWeightedMedians, rowWeightedMedians", "Example" = "weightedMedian(x, w); rowWeightedMedians(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample variance", "Functions" = "var, colVars, rowVars", "Example" = "var(x); rowVars(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Weighted sample variance", "Functions" = "weightedVar, colWeightedVars, rowWeightedVars", "Example" = "weightedVar(x, w), rowWeightedVars(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample variance by n-order differences", "Functions" = "varDiff, colVarDiffs, rowVarDiffs", "Example" = "varDiff(x); rowVarDiffs(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample standard deviation", "Functions" = "sd, colSds, rowSds", "Example" = "sd(x); rowSds(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Weighted sample deviation", "Functions" = "weightedSd, colWeightedSds, rowWeightedSds", "Example" = "weightedSd(x, w), rowWeightedSds(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample standard deviation by n-order differences", "Functions" = "sdDiff, colSdDiffs, rowSdDiffs", "Example" = "sdDiff(x); rowSdDiffs(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Median absolute deviation (MAD)", "Functions" = "mad, colMads, rowMads", "Example" = "mad(x); rowMads(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Weighted median absolute deviation (MAD)", "Functions" = "weightedMad, colWeightedMads, rowWeightedMads", "Example" = "weightedMad(x, w), rowWeightedMads(x, w)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Median absolute deviation (MAD) by n-order differences", "Functions" = "madDiff, colMadDiffs, rowMadDiffs", "Example" = "madDiff(x); rowMadDiffs()" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Quantile", "Functions" = "quantile, colQuantiles, rowQuantiles", "Example" = "quantile(x, probs); rowQuantiles(x, probs)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Interquartile range (IQR)", "Functions" = "iqr, colIQRs, rowIQRs", "Example" = "iqr(x); rowIQRs(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Interquartile range (IQR) by n-order differences", "Functions" = "iqrDiff, colIQRDiffs, rowIQRDiffs", "Example" = "iqrDiff(x); rowIQRDiffs(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Range", "Functions" = "range, colRanges, rowRanges", "Example" = "range(x); rowRanges(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Minimum", "Functions" = "min, colMins, rowMins", "Example" = "min(x); rowMins(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Maximum", "Functions" = "max, colMaxs, rowMaxs", "Example" = "max(x); rowMaxs(x)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ## Testing for and counting values <% tbl <- NULL row <- data.frame( "Operator" = "Are there any missing values?", "Functions" = "anyMissing, colAnyMissings, rowAnyMissings", "Example" = "anyMissing(x); rowAnyMissings(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Does TRUE exists?", "Functions" = "any, colAnys, rowAnys", "Example" = "any(x); rowAnys(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Are all values TRUE?", "Functions" = "all, colAlls, rowAlls", "Example" = "all(x); rowAlls(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Does value exists?", "Functions" = "anyValue, colAnys, rowAnys", "Example" = "anyValue(x, value); rowAnys(x, value)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Do all elements have a given value?", "Functions" = "allValue, colAlls, rowAlls", "Example" = "allValue(x, value); rowAlls(x, value)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Number of occurrences of a value?", "Functions" = "count, colCounts, rowCounts", "Example" = "count(x, value); rowCounts(x, value)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ## Cumulative functions <% tbl <- NULL row <- data.frame( "Operator" = "Cumulative sum", "Functions" = "cumsum, colCumsums, rowCumsums", "Example" = "cumsum(x); rowCumsums(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Cumulative product", "Functions" = "cumprod, colCumprods, rowCumprods", "Example" = "cumprod(x); rowCumprods(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Cumulative minimum", "Functions" = "cummin, colCummins, rowCummins", "Example" = "cummin(x); rowCummins(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operator" = "Cumulative maximum", "Functions" = "cummax, colCummaxs, rowCummaxs", "Example" = "cummax(x); rowCummaxs(x)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ## Binning <% tbl <- NULL row <- data.frame( "Estimator" = "Counts in disjoint bins", "Functions" = "binCounts", "Example" = "binCounts(x, bx)" ) tbl <- rbind(tbl, row) row <- data.frame( "Estimator" = "Sample means (and counts) in disjoint bins", "Functions" = "binMeans", "Example" = "binMeans(y, x, bx)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ## Miscellaneous <% tbl <- NULL row <- data.frame( "Operation" = "Sum", "Functions" = "sum2, colSums2, rowSums2", "Example" = "sum2(x); rowSums2(x)" ) tbl <- rbind(tbl, row) row <- data.frame( "Operation" = "Lagged differences", "Functions" = c("diff2, colDiffs, rowDiffs"), "Example" = "diff2(x), rowDiffs(x)" ) tbl <- rbind(tbl, row) %> <% kable(tbl) %> ------------------------------------------------------------- <%=pkgName%> v<%=getVersion(pkg)%>. Release: [CRAN](https://cran.r-project.org/package=<%=pkgName%>), Development: [GitHub](<%=getUrl(pkg)%>). matrixStats/MD50000644000175100001440000005372313074160622013136 0ustar hornikuserse5cde2c8a5f3c6ff4867e5aca0e0e0a7 *DESCRIPTION 0860c5907218fd3eaaac3596f889e9fc *NAMESPACE 26ae3fd1cb8619871199341b48e2d982 *NEWS bb69907c26b811fcf67fddc0e9cd5b77 *R/999.package.R 289048c537d9ab3f0b2223f08abe92ef *R/allocMatrix.R 3f3bfbff10973a98681c2d5334247d9e *R/anyMissing.R 0ed10fdbab960b38d1f4b62cf744804e *R/benchmark.R 8366f88bc87c53275c02800bcc0d1aed *R/binCounts.R 437466072c57079a0d9efc844ccd96ac *R/binMeans.R afb42867c388669ecfc39176c85ab892 *R/diff2.R 88acc524848887771550bccaf06eec0a *R/indexByRow.R f806d6fb67d3c09166ffc1f3e7c70718 *R/logSumExp.R 6347f56ee3a433f281bb2ccfc36281b0 *R/mean2.R 53451895bb9b2462bc6f658234faa87f *R/product.R 9da47eff39df6e33896014f79961fd5c *R/psortKM.R 8da619fd8b707c6186ee8cc521942181 *R/rowAlls.R 87668d4ab6900232661afffbd839d74d *R/rowAvgsPerColSet.R 1e374bc89f726835992e89d52282858c *R/rowCollapse.R 6e42daebc46d5000359ad51272549508 *R/rowCounts.R 28fabe529a791811487b652730308b30 *R/rowCumsums.R 95709136f527104e4d1fb4b7b98855f8 *R/rowDiffs.R 82011349711cab2880b651e3ee2b75cb *R/rowIQRs.R 4ae81e1628f0f8579ae58917bfdc2f10 *R/rowLogSumExps.R 733dabe323eca532d73f18e8802295e4 *R/rowMads.R 73c0a45669fc1e1fdcb9fc3c98e96306 *R/rowMeans2.R ba918703d6234d3200e016863c3eec67 *R/rowMedians.R c84c74a047a3cf68afca42115b53fa29 *R/rowOrderStats.R 86dda49af401a2e9c1ee031f7e1dabf4 *R/rowProds.R 29bacf2d3c5ad3b2bbcf65850eba1cfb *R/rowQuantiles.R 90dca0731899c25cf911fa9e940e9707 *R/rowRanges.R 63aad2937f5568563e83b3d2d99295f8 *R/rowRanks.R 62eb7e4e166a39bab5304b7c99320feb *R/rowSds.R 77683a4eeb971266356ca3c4a636c7a7 *R/rowSums2.R 4790276a5cc82453e824841cee6aca87 *R/rowTabulates.R a99b8e4863287a5f945f7a1482ed175f *R/rowVars.R bb2b229342c7372d6c65102b9c9b5046 *R/rowWeightedMeans.R 0998063c639a26f8b6d3184c33b6e07c *R/rowWeightedMedians.R 3b5951b079abb8bdb0d79ae87ce8a9b0 *R/signTabulate.R 27fa54610a1448f2447dadb6e042567e *R/sum2.R ede21e545df3630a5060a50834c771b9 *R/validateIndices.R 488df0d43d67541e76dce16ab582b01a *R/varDiff.R ff531f9d6b666d2b7b254a338b0d6de8 *R/weightedMad.R 2e40f98c029a2763107ffcb525227529 *R/weightedMean.R e8f609861546951cbdcfbdc3ef25e056 *R/weightedMedian.R 57e7cedc4c27791c68ee11d65bf1eaa5 *R/weightedVar.R 053575f62c3d90e4687e560704e1503c *R/x_OP_y.R 2cd96f266da6085b411ef32fd98c1f3c *R/zzz.R e63f254e786172a52100404559bb80a8 *build/vignette.rds ca773a01fc2df607bef2bf6ee72f01fb *inst/benchmarking/R/random-matrices.R 68d9d75e6b36f6bd61569553be4cb133 *inst/benchmarking/R/random-vectors.R e00cf911d14b0c6bc13bb17b3dd62f1e *inst/benchmarking/allocMatrix.md.rsp 81d8eb603b80c27bed9570bd49ae03f0 *inst/benchmarking/allocVector.md.rsp 87c66c03ab530a473a7cfab448e30664 *inst/benchmarking/anyMissing.md.rsp f97927a62ed926d0092677057692449f *inst/benchmarking/anyMissing_subset.md.rsp 86bfbd81cb938e1caa98d01bfc32849c *inst/benchmarking/binCounts.md.rsp 17aa0aa0a6be8f9359f1cb0f09286db2 *inst/benchmarking/binCounts_subset.md.rsp 4e7fff2c598adc6b0982245a5542dfd9 *inst/benchmarking/binMeans.md.rsp 3797dd738454272a3431c4979b39c0c9 *inst/benchmarking/binMeans_subset.md.rsp 3a3911d3e2b396d9f55015baef8f04f5 *inst/benchmarking/colRowAlls.md.rsp ffe602c8b8a9e9ce2aab09ad6b3e37d8 *inst/benchmarking/colRowAlls_subset.md.rsp 23f7cd533e7631799278786bca210bf9 *inst/benchmarking/colRowAnyMissings.md.rsp 69ab6c0d6c537a30b5550ad5c4a231b2 *inst/benchmarking/colRowAnyMissings_subset.md.rsp 73f26ffb9340049cd3818c63b622a549 *inst/benchmarking/colRowAnys.md.rsp 0098b1085ada124e68e8dfa7f7d3620f *inst/benchmarking/colRowAnys_subset.md.rsp 40d79f5b1e5f42e33318a5bcd36a554d *inst/benchmarking/colRowCounts.md.rsp 313513c280d51f3638c2cd6eebf650d5 *inst/benchmarking/colRowCounts_subset.md.rsp 2b1c4e6a925ee6443499c01c846ea04b *inst/benchmarking/colRowCummins.md.rsp 5261ab39cdf0673af2d3589071f00fb2 *inst/benchmarking/colRowCummins_subset.md.rsp e619768942c419a9e0628d0ef324a914 *inst/benchmarking/colRowCumprods.md.rsp 6f6045c415f73cdceef948a6978f5707 *inst/benchmarking/colRowCumprods_subset.md.rsp a8697a83212a1d59887f547e097104b2 *inst/benchmarking/colRowCumsums.md.rsp efba595e480cbd813311cc298d5e2c88 *inst/benchmarking/colRowCumsums_subset.md.rsp 927737181751c970fae9963e4e4bc370 *inst/benchmarking/colRowDiffs.md.rsp 4e74122ee4454982b84331ef7d7951e9 *inst/benchmarking/colRowDiffs_subset.md.rsp c20505dc8b1d26b04899a0a627ec7bd3 *inst/benchmarking/colRowLogSumExps.md.rsp 505c90416b1dedd80ce017b7ebae6d9b *inst/benchmarking/colRowLogSumExps_subset.md.rsp 24d973f08bca1b563257c1dc1a10544a *inst/benchmarking/colRowMads.md.rsp 54cb05bb7c246cca315156a83cd8087d *inst/benchmarking/colRowMads_subset.md.rsp e4362ddc6881e551ad8609d15dfa5430 *inst/benchmarking/colRowMeans2.md.rsp 1625e937116e331749caaf0b6f3f23c7 *inst/benchmarking/colRowMeans2_subset.md.rsp 10cc2739e1485f274478af45cc535386 *inst/benchmarking/colRowMedians.md.rsp 2149f29d22e6f6a5ca0b3952ea4b9521 *inst/benchmarking/colRowMedians_subset.md.rsp fdc8aea9103c8f029188621562fbd985 *inst/benchmarking/colRowMins.md.rsp f8e85f562710a8ab093c7c64c8b88597 *inst/benchmarking/colRowMins_subset.md.rsp eb98ef33bed1925407cfcf6a2b133b5d *inst/benchmarking/colRowOrderStats.md.rsp ae91cc26681c8784f56d078a6983feb9 *inst/benchmarking/colRowOrderStats_subset.md.rsp 3d8008f33266df3de8da082280f93fa1 *inst/benchmarking/colRowProds.md.rsp 66699301fd6260e59762b488bf8c13fe *inst/benchmarking/colRowProds_subset.md.rsp c8bd43b47ecb77a45536af8f9ad39949 *inst/benchmarking/colRowQuantiles.md.rsp 7f84b255abdcf984e7d845a999662587 *inst/benchmarking/colRowQuantiles_subset.md.rsp 88c7df3b546ffb3b96dd82d7d7b584c1 *inst/benchmarking/colRowRanges.md.rsp 3513026d04a7983083fb4e8f06b99362 *inst/benchmarking/colRowRanges_subset.md.rsp f4f381ce25f6718d064cb9cffa89db68 *inst/benchmarking/colRowRanks.md.rsp 11291514300345f2ff5428b5a216d498 *inst/benchmarking/colRowRanks_subset.md.rsp ad61d0827bffb9751d6d2836b85387db *inst/benchmarking/colRowSums2.md.rsp 0b3508d6488f5f133dcdd3b98753d961 *inst/benchmarking/colRowSums2_subset.md.rsp 50b104a7f39a08ea581f0964907333e6 *inst/benchmarking/colRowTabulates.md.rsp 113d098fd3a2b8ccfa2657dc67c50d1b *inst/benchmarking/colRowTabulates_subset.md.rsp e4b8bb9d0bf8d9ef6bddd16f47df4dd0 *inst/benchmarking/colRowVars.md.rsp 09e70027a00db5722e2d77feaacbb144 *inst/benchmarking/colRowVars_subset.md.rsp 02b139cf5d9e2eb4abe496b26a745d76 *inst/benchmarking/colRowWeightedMeans.md.rsp 5643a1fd128eb081a40fa632404d87ee *inst/benchmarking/colRowWeightedMeans_subset.md.rsp bbaedf22f44a0a1d038d2e3b89826f37 *inst/benchmarking/colRowWeightedMedians.md.rsp 9545c448dd47ea1314617936fbf5fc81 *inst/benchmarking/colRowWeightedMedians_subset.md.rsp ca9f0ec0b3fdba6f089b42f284eafbae *inst/benchmarking/count.md.rsp 58aaf19b7253bb01ccca1de1719b9d9e *inst/benchmarking/count_subset.md.rsp ab9f5049c780d39eca80e084f60cf68e *inst/benchmarking/includes/appendix.md.rsp 75a4dbe1cebc11442ce3f8626cb2f786 *inst/benchmarking/includes/footer.md.rsp 80fec8731611547e148434c4a8af80a7 *inst/benchmarking/includes/header.md.rsp d4fe14ce0a8fe23b829bd5d40ecb8638 *inst/benchmarking/includes/references.md.rsp 5e343c63df6b19f2e8f3d13784ac522d *inst/benchmarking/includes/results.md.rsp 1127a9839354eb9de5fd6641e0d2949e *inst/benchmarking/includes/setup.md.rsp 25a63825318adf012501a440b2122bb4 *inst/benchmarking/index.md.rsp b9c2a2f843b653034c1654bc12d48fe5 *inst/benchmarking/indexByRow.md.rsp e55144f01e221ec010b701b273e164cc *inst/benchmarking/logSumExp.md.rsp 0c1b2fa6b417e39be2da23c774ff663b *inst/benchmarking/logSumExp_subset.md.rsp 1a6af4356e4e9edb2a59e9632e6d4615 *inst/benchmarking/madDiff.md.rsp 07ad9f539a5cee89cd0bdad8175990cf *inst/benchmarking/madDiff_subset.md.rsp a4dbef70e5817836b15dcf085deb426d *inst/benchmarking/mean2.md.rsp 9f87d271ce0a2ec1387c304ccdb128d9 *inst/benchmarking/mean2_subset.md.rsp 1402880c69595363a1e3c3c985bc013f *inst/benchmarking/product.md.rsp 62d982e249e0d8cfee8729d35af302ef *inst/benchmarking/product_subset.md.rsp 9c94919d6a73a46b27b97673f771afe1 *inst/benchmarking/sum2.md.rsp 18bdbfc55c0bff412054f683c4f26342 *inst/benchmarking/sum2_subset.md.rsp b744777ba0af2a8a50e5d1c9207e7177 *inst/benchmarking/t_tx_OP_y.md.rsp 03905f14b790eb96b401d934d953cfbd *inst/benchmarking/t_tx_OP_y_subset.md.rsp e8c65eec84796fa104ebd81eaf06baee *inst/benchmarking/varDiff.md.rsp 7673948c3ce870b5a2f9d777e1e94a16 *inst/benchmarking/varDiff_subset.md.rsp 234fa78ca45aba7ab315ce7bfa158326 *inst/benchmarking/weightedMean.md.rsp 414e2188ce3206a01b280c3786d187b2 *inst/benchmarking/weightedMean_subset.md.rsp 0d6e67649cafa21f08f3405456d0365e *inst/benchmarking/weightedMedian.md.rsp fa6e9a4a08145bce053c6e4d774e81a0 *inst/benchmarking/weightedMedian_subset.md.rsp e68f83709396b851d7c53e36561ed6de *inst/benchmarking/x_OP_y.md.rsp 2dd5fa9d134fc7d05ded89f7d458b1eb *inst/benchmarking/x_OP_y_subset.md.rsp 173783371a58a45ba50805a1340fc6a3 *inst/doc/matrixStats-methods.html d25f82a3b8a66d1f375186fdd85e4850 *inst/doc/matrixStats-methods.md.rsp e40a52ef7ac5f8e61a5e474786e5b01c *man/allocMatrix.Rd 5896d31d7eddfcbc1edda46e6e89bce4 *man/anyMissing.Rd 1597c2bff07ae712ad7f8ae2f4463bda *man/binCounts.Rd 460905206c57474d5a419aa155b6333a *man/binMeans.Rd 002193bcf08da4d3d4203baa818c5fc3 *man/diff2.Rd d08a32a4a039b9d1e8125637b97b0eb2 *man/indexByRow.Rd 2c3ab33c1470ea80106449d46f119ee1 *man/logSumExp.Rd d43c64f9b7c712624975ec95c1f35da8 *man/matrixStats-package.Rd 093fc551d63f4f8b701fbd9e341c9566 *man/mean2.Rd 400a1e00af2244a1d57c843c961f75fb *man/rowAlls.Rd be4c879dc4ca7ea6adced6fc62d91ef8 *man/rowAvgsPerColSet.Rd c4476f9b8a39f4a436df9f5aad6b87c7 *man/rowCollapse.Rd 07ff844b0e5b31c25be44e576ec7df67 *man/rowCounts.Rd 3a20c97c5e66ffe5a00227cbf5023394 *man/rowCumsums.Rd 064dd4c16d0cbd75155a46882edb089b *man/rowDiffs.Rd 72dcb5c53fa8907f0318e6b57ec7c11d *man/rowIQRs.Rd d2e69e2c87550e813c0530a6f14765bf *man/rowLogSumExps.Rd bce2d643c903513c9df0b0ea2d003a4f *man/rowMeans2.Rd b6b36fcc39da77e5cde435ce837d21f2 *man/rowMedians.Rd ce5c04f67e55ef11725d155ea8d56ac7 *man/rowOrderStats.Rd 4a9f543a5bff9bce8b4345fa95f24fed *man/rowProds.Rd ccee136a2732214e341c7a2b631e261b *man/rowQuantiles.Rd 0d0ea2af544d9cfa4f2772d575a20222 *man/rowRanges.Rd f39b0b343e02d6bd25952e55efc15774 *man/rowRanks.Rd 199c61b4944a01352b1bde37ec7d6d68 *man/rowSds.Rd b8868ffa55dbbdb21b813ec62dbc5d3d *man/rowSums2.Rd c0064adde36c5d2724c16b111a9b8010 *man/rowTabulates.Rd a396eb3aebe01dde81f880777cb3bdb8 *man/rowVars.Rd 69632845f68120c255998eb4594221f5 *man/rowWeightedMeans.Rd d7bbfba9232114dffa28fa8421657fa9 *man/rowWeightedMedians.Rd aa7b600a019f2582cd7428cc7f0398f4 *man/signTabulate.Rd a496880dd2e58b0ddf5d12b01f4f2025 *man/sum2.Rd b0e53b16e26c97d11e316df133576051 *man/validateIndices.Rd 860b55cbf9b14dc2a00e6727ab76c8d8 *man/varDiff.Rd 53f908ec40a77c54f31c8a3c910d7fef *man/weightedMad.Rd 0cb40480f00a427344baed3f94692ad7 *man/weightedMean.Rd b926e374286991d444129eabe6f09cee *man/weightedMedian.Rd c0d97842d90da915908c271a12b11523 *man/weightedVar.Rd 27539ebefe5b1b2e2ebe1a21bd4e83c0 *man/x_OP_y.Rd e6473129c48031742d7d73d7d93474da *src/000.api.h 74804bd3bded97ab988fe1949957b45c *src/000.init.c 141ae0557e5a54f4da3400d38a40250c *src/000.macros.h 3591d2ca94a33b65f00d043d8336c7d1 *src/000.templates-gen-matrix-vector.h 707b5b0c13bd4613ba117a0d4f04a80a *src/000.templates-gen-matrix.h 16aca8455b398420b74fc43d6726d0cc *src/000.templates-gen-vector.h e2b8d03a0e4cf42fc466359edfe4bf99 *src/000.templates-types.h 78bbf931f308f8cf910cf70f646d4597 *src/000.templates-types_undef.h 1fe96f23b52c292f78943b4980eb0f33 *src/000.types.h 7b8dc4193e3116e4428c16652b6341e0 *src/000.utils.h 4a1670c8cdf053e2aa559aac01864474 *src/allocMatrix2.c feaf7b52dd205961cdc11947499b97d4 *src/anyMissing.c 4eb9ab0b4af9231d3de551ca465fc6b4 *src/anyMissing_lowlevel.h 5b43b1f7fe64490e3cf90cdc167b5fdd *src/anyMissing_lowlevel_template.h ec1fbc1b0025fafa1689bf21ed262ecd *src/binCounts.c f026702ce73cfca5e4c129595a871b8c *src/binCounts_lowlevel.h d972d21de1f4216d249fe461d3b87a53 *src/binCounts_lowlevel_template.h 7f24eaca486646513f0a6d7125362217 *src/binMeans.c a50741688f74c650961f648bd4c8bba6 *src/binMeans_lowlevel.h df1efd4c8913d7023fd6636c41cee040 *src/binMeans_lowlevel_template.h 35a0f685f14959c8a25511b4b8b10d3e *src/colCounts.c 42a053c6c1dc96059757f0b41c00ff04 *src/colCounts_lowlevel.h 40918cfac497d6826e5c8e27ef2cdbbd *src/colCounts_lowlevel_template.h e5ffd3aa0456ba7ac35be017df6c1960 *src/colOrderStats.c 359a2e4da7666753819569351c0373fb *src/colOrderStats_lowlevel.h 4bf46a1ae2856e59fddbeba2d67a1974 *src/colOrderStats_lowlevel_template.h 4a08776f519190fc6e22357223b9c5c8 *src/colRanges.c 79158648832475da677f87b3d48a0ec0 *src/colRanges_lowlevel.h 12d23ea6d3745d64120ec009476f7b06 *src/colRanges_lowlevel_template.h 36578c07bc7fb2697b0b5b37a15d9edc *src/diff2.c fb3691e79f19c6b0f2c7dcd3cb24adf5 *src/diff2_lowlevel.h 0972de162530a040555498b86fcd6df4 *src/diff2_lowlevel_template.h 4d4ad8ba836e6c75c3d0d063917bd78f *src/indexByRow.c 5aa728b09ce4fbf00a5b54f723d0fb4b *src/logSumExp.c fd9f1169008b8115b7901b8cf44ffe81 *src/logSumExp_lowlevel.h dd32ebb1098c476c9ac62974cd79fd29 *src/logSumExp_lowlevel_template.h 121d94e29f26f0f13fe36fb8233f6d72 *src/mean2.c c1785a9d9c10c808b3a1504b2431b06e *src/mean2_lowlevel.h 44f74e9c5dab33f06d2aefc75c7449f9 *src/mean2_lowlevel_template.h 23ea2df48a202e47ca0b11fe134da6fc *src/productExpSumLog.c 60d7ea1d4d6f92621b30d022e8d43445 *src/productExpSumLog_lowlevel.h b646b38e4464413a31e81df6f2375100 *src/productExpSumLog_lowlevel_template.h a2e008bbd2037b65edec7e0d65724354 *src/psortKM.c 0dedd6bc1341cffb008fd7b66a7dee6d *src/rowCounts.c 3a4b5bb778be99d347be03d6642443f4 *src/rowCounts_lowlevel.h 760aa50d8ec5b64a70c56cc4f5ed1a31 *src/rowCounts_lowlevel_template.h 65aa6d8221284fbfac4a8bd5194adc30 *src/rowCumMinMaxs_lowlevel_template.h 53fc6f5bb452bebcf3469e874a7cf8a6 *src/rowCummaxs.c 07d1d916ae388c733026062862ba13bf *src/rowCummaxs_lowlevel.h 255c555b1f7654237d8d28eed92b6ede *src/rowCummins.c 0fa46bcb16aaf34600aa184102318799 *src/rowCummins_lowlevel.h 4309ec9ea0e0dee0b01b2e0823aa1fdc *src/rowCumprods.c 3fa8f683acc95a730f1d46cd58efeef9 *src/rowCumprods_lowlevel.h 7fae315a20665fc99e67994c8b05be14 *src/rowCumprods_lowlevel_template.h 6b204e666056c087d91b89227b373e20 *src/rowCumsums.c 8a6797eeb9bf4b923e43da25743bf41a *src/rowCumsums_lowlevel.h 92be5461cd17744339ec503c8db697f5 *src/rowCumsums_lowlevel_template.h 81ae11b16d080484ad1bcf032e2c0b02 *src/rowDiffs.c 0e651bc76f95f2a52deeba3a289b1c07 *src/rowDiffs_lowlevel.h b0236c0394cd01fa8c07dd7bb8128220 *src/rowDiffs_lowlevel_template.h de18187f82fe9609a415928b0e75faed *src/rowLogSumExp.c 3e64d628440648db06fd942f86047efa *src/rowLogSumExp_lowlevel.h 30a8660aa4d281368f33315187c8172f *src/rowLogSumExp_lowlevel_template.h e5c30b2c558e898247b9a71503366fba *src/rowMads.c 8327907e2482ae845ed100f1ab6bf7f3 *src/rowMads_lowlevel.h f35bcc4664b45ceb2490f2f1b0c92952 *src/rowMads_lowlevel_template.h 2e3d9bf0639487edd6db13f3b88fd98b *src/rowMeans2.c 89ab6eb588036ef9b3908715889eb9b1 *src/rowMeans2_lowlevel.h de27ea88407cf7f18f9d562e3b33da0a *src/rowMeans2_lowlevel_template.h d8461f2d666d0a7df9c2082321d3047e *src/rowMedians.c 8ed00931c54b94690312da9cfe57bd76 *src/rowMedians_lowlevel.h c5895290d43b23befd1ed834eafc588c *src/rowMedians_lowlevel_template.h 14ccec4adb727117230efc5a21ce4acc *src/rowOrderStats.c 64b2f4c64275ec71a5e3fa8cf74d7da7 *src/rowOrderStats_lowlevel.h 24aa22df80078258ee4745da30af7737 *src/rowOrderStats_lowlevel_template.h 91946074c2a59f909cc535f67d7b4537 *src/rowRanges.c a53121c18aea6c874436b41415dbdc4a *src/rowRanges_lowlevel.h 11692bfa29223952a437047e28796866 *src/rowRanges_lowlevel_template.h 6f414a2d284f2aa888e11988f08a8c9e *src/rowRanksWithTies.c e644665ec1dfbafab08889f52d346c3c *src/rowRanksWithTies_lowlevel.h 5e957bb4e69558bd8e6dfb5e5480c384 *src/rowRanksWithTies_lowlevel_template.h 41e154fc10b685177a8e4236529f9bac *src/rowSums2.c f1e706f693c4c0d1ddd610816c97e00b *src/rowSums2_lowlevel.h fd62aeac98f77d9032387f9d82b0ef84 *src/rowSums2_lowlevel_template.h fc5deb05c09e386b28895ce28ee42257 *src/rowVars.c 7151af7f39cda3d564e578b7f47b52e2 *src/rowVars_lowlevel.h e65baec883f6e898f0fd157ad6c5039b *src/rowVars_lowlevel_template.h 2f8d156e3f352b59db5d7c00fc2a6ea0 *src/signTabulate.c da58ad2d03e917231e5060319c0b392c *src/signTabulate_lowlevel.h 4845618a2ddf46bf74fe066c6a475339 *src/signTabulate_lowlevel_template.h a1853d8e70839e621f2e4f60dfd8756d *src/sum2.c 5deaa6c94bce18eddbcd336abc5e8d5e *src/sum2_lowlevel.h 8805f536183ae344eb05f0286631f531 *src/sum2_lowlevel_template.h 06c93480c72b701559f8621771a257a6 *src/validateIndices.c be32addec5f914e6e88fdb01414b9659 *src/validateIndices_lowlevel.h 48d14b9aea19af04b23b9a436bc2194a *src/validateIndices_lowlevel_template.h cbe2b9a78938122de265e6fa8b898d47 *src/weightedMean.c 550459d01e65ca17691fc9f9a45ccde0 *src/weightedMean_lowlevel.h a12bb18df07b05587cad3e8131a31e24 *src/weightedMean_lowlevel_template.h 05677d6b26c4de2aabd9bac2f5a2424f *src/weightedMedian.c 11e34736452f92775d24719094659ae4 *src/weightedMedian_lowlevel.h a9478242c639d869a6c98b7b03b7f3f8 *src/weightedMedian_lowlevel_template.h 536a4eddd5d389a2f37cac3702381be7 *src/x_OP_y.c 5227137bc874290ef86b5d1b7e2878c2 *src/x_OP_y_lowlevel.h ded428cafc1ea29e648f78a70297e459 *src/x_OP_y_lowlevel_template.h 8a7346f77a61c642a27791fa78ff9bb8 *tests/allocArray.R d7014909df5dcc968e46e858a8c2686b *tests/allocMatrix.R 508a5d07b8897d7c461cd73559a0c22f *tests/allocVector.R 7aed50ebd9ed57830855ac15d214512c *tests/anyMissing.R 3e3d93772c7a420c56c8691a949aab70 *tests/anyMissing_subset.R 17e88afab7d3c5e05e4f2e85843b6c76 *tests/benchmark.R ec54644a7e7e2fe10fd7f8dc6a568bc7 *tests/binCounts.R 099a8ddd1b5e46d307a624d87fc12169 *tests/binCounts_subset.R 1944914d4dbcb32fd62921f1ef51bb1c *tests/binMeans,binCounts.R e0b1c88a59eaf59571a6af74d26b55d8 *tests/binMeans,binCounts_subset.R 22d6aed9cfb2e8c2e74e069bf917e4be *tests/count.R 880706ea6c5cfc1d213df9ee5b758211 *tests/count_subset.R 5ed1b8bee9180c536393aa76f41d6914 *tests/diff2.R 1e614439e55c47e345637000600b32e3 *tests/diff2_subset.R e2bb2f4a57a2f6b5edd5c41a5a2f551b *tests/indexByRow.R 3367c853594ca5ff2cb145a7b4ba9670 *tests/logSumExp.R 4c911012825f2d15f5d8abd1abc411fb *tests/logSumExp_subset.R 3743311decafea0ccb256c55d66acb81 *tests/mean2.R 028eee10d3e9da4822795bf96e47b1f4 *tests/mean2_subset.R d5c028c3973250bbfd46fde0f6201609 *tests/product.R e0bb296810a798ae8d481f2402e70846 *tests/product_subset.R 96ddb0474c656e34b5d660cc9f025d3c *tests/psortKM.R c85a6c94c726309b6bb05df9cbd341aa *tests/rowAllAnys.R a79e642e124e6b1f642122e9ce2198ca *tests/rowAllAnys_subset.R ece3c81ea6b4262f59146da554d544eb *tests/rowAvgsPerColSet.R 0689281bc5dcadfb63cb6e4a8b9ca719 *tests/rowAvgsPerColSet_subset.R 7ede5706f1c86857a9fa3fa85b7a9638 *tests/rowCollapse.R 7696cbd80db986bc33b13934fe7fa762 *tests/rowCollapse_subset.R c021a1be78b230d191344836a684f486 *tests/rowCounts.R 12414edb01c8eca7331caeb0c7e1bd46 *tests/rowCounts_subset.R b9173494269f17408a6d6280a184cd78 *tests/rowCumMinMaxs.R e7cfa1529fc4e593551930eabcce9f65 *tests/rowCumMinMaxs_subset.R 26f67b9e9a840f3aecaad0d5bf697b9b *tests/rowCumprods.R 049c7a343051506908d8271ba7066943 *tests/rowCumprods_subset.R 0fb39f4e4992833b41537f2e3d699a89 *tests/rowCumsums.R 0382bb4b62e6d7f421f01ab612d8381b *tests/rowCumsums_subset.R 399184018247eb704a2b25194eae87b9 *tests/rowDiffs.R abe270d9cca4ef550f40e82bf59cace1 *tests/rowDiffs_subset.R ac7a5929228afa9c3d22006cd9edabd8 *tests/rowIQRs.R 2418939dea7e712abb29860786cf5da1 *tests/rowIQRs_subset.R 36abe27252ce12e2e5bee0aca02d431e *tests/rowLogSumExps.R fd9329b64b4480006ee9d262247bb033 *tests/rowLogSumExps_subset.R f13d8d5e883a5715528ec3019b6ef767 *tests/rowMads.R 64aedc9a8578a12ec479166e69cf8713 *tests/rowMads_subset.R 6509f37c0baf1017db6f12fa7a67375f *tests/rowMeans2.R 8ce437a07e970ec118e23758426ef931 *tests/rowMeans2_subset.R da49edbaef72accb684972be38f2a3c8 *tests/rowMedians.R af93b33db5ff2c77e1c120e44dd731f6 *tests/rowMedians_subset.R 3af99d8e0d9d1f24e90cfb450c2783eb *tests/rowOrderStats.R 07fae0528b14bbcea317053cf80492c7 *tests/rowOrderStats_subset.R d75581199163ee5f0b0c18a009d713a8 *tests/rowProds.R 8d7dc9890d9e77dfb14c82116a1317e0 *tests/rowProds_subset.R c9653cf5aa157e18799f75c3cb9369d4 *tests/rowQuantiles.R 798e1e55193b7baa02dcdac85a013f1f *tests/rowQuantiles_subset.R f2e323ab4e4fee3ee8c4cd3ea674f627 *tests/rowRanges.R 05fed97407706c6485cbe93ce458e485 *tests/rowRanges_subset.R 0fb525c85bc3168a35218841ed4b05b6 *tests/rowRanks.R 42393274cec695532055ec6cddbecc8d *tests/rowRanks_subset.R f6d5f820b32b93c045519b82f7e51cd5 *tests/rowSds.R ff6ebdcdec36fa888fd38969b1b12e6a *tests/rowSds_subset.R 3d62832d6739ce40f8783ff1f8810f8f *tests/rowSums2.R d2ef64bcddc34728b49ffcce0a49dc86 *tests/rowSums2_subset.R e46d65e4559915287068fd2bbd9a6fdf *tests/rowTabulates.R f30c6bcd0a60c182ab24535869bcb864 *tests/rowTabulates_subset.R ec3ddb56d14020e94c1ca39d43acdc04 *tests/rowVarDiffs.R 2165e6cca587f1458f495c6ecf389f2f *tests/rowVarDiffs_mad,iqr_subset.R 4d2081667d17bba1da3bfa61ba76c148 *tests/rowVarDiffs_var,sd_subset.R 5bd198a5e462a256ea5dbedf6416d970 *tests/rowVars.R 2d42777d3d6e1ad559d866eed00928b1 *tests/rowVars_subset.R 2bf0b4b29e61bf71643b53c8d8bfe862 *tests/rowWeightedMeans.R 1156db8e846e1866cb302bfa4a4dbb1c *tests/rowWeightedMeans_subset.R 8c0496561563b73ecaca0ac3ac47ceeb *tests/rowWeightedMedians.R 1a8289466bf44abbf5486ad2b76e3cde *tests/rowWeightedMedians_subset.R 72b0982ccdcd8b246f2178ec8df04f06 *tests/rowWeightedVars.R 24e30bcf8f6290704be5caa46a52ac7f *tests/rowWeightedVars_subset.R d81732055ba2b04e662272657df793c6 *tests/signTabulate.R fb3a48080d0a12e86997c1b96a9cf68c *tests/signTabulate_subset.R a0bff406e9438a40077d40131af15a5e *tests/sum2.R 5b542504aabd2cf782b11d5987ca6b93 *tests/sum2_subset.R e0044a74c4d6585bd2071a8097128fbe *tests/utils/validateIndicesFramework.R d4c3e13301ee1b15f03fb3104be5fc73 *tests/validateIndices.R 62dff0f6f8cd327315ab719bc2b4abdc *tests/varDiff_etal.R 776e5c2aac0f37ee8e9ee0bfd5625bf6 *tests/varDiff_etal_subset.R a0d407db3620320e8f6c22af421d387a *tests/weightedMean.R f45aabcd7da19289147c9fe12dd41566 *tests/weightedMean_subset.R 10a5c3fc69df51f5b68aba57cab8beb1 *tests/weightedMedian.R 31af6e65986eed830fa17824e002b9bc *tests/weightedMedian_subset.R 222e09b5a69d63a4718b03834228c3df *tests/weightedVar.R c6ed8716b535016b790d56d7e4f06a5d *tests/weightedVar_etal.R 115fd03bc3822bf1be54f36dc2cca212 *tests/weightedVar_etal_subset.R fd2553093363d2ed6eafa770f2d8c70d *tests/x_OP_y.R 1a35cad2d42c1dde74af1db823d4e639 *tests/x_OP_y_subset.R ae02684a77e833bf48a7a1e4b3b10dca *tests/zzz.package-unload.R d25f82a3b8a66d1f375186fdd85e4850 *vignettes/matrixStats-methods.md.rsp matrixStats/build/0000755000175100001440000000000013073627232013717 5ustar hornikusersmatrixStats/build/vignette.rds0000644000175100001440000000041513073627232016256 0ustar hornikusers‹mPËnÂ0tâR%.§ôšàŒ¸ôR•zµâˆä—l§4·~yaÓÄ –ÖÞµggÇóµ „¤„RJRŠ)]á–c.8ó¬¬-ö÷ºÏ=vã†4matrixStats/DESCRIPTION0000644000175100001440000000303213074160622014320 0ustar hornikusersPackage: matrixStats Version: 0.52.2 Depends: R (>= 2.12.0) Suggests: base64enc, ggplot2, knitr, microbenchmark, R.devices, R.rsp VignetteBuilder: R.rsp Date: 2017-04-13 Title: Functions that Apply to Rows and Columns of Matrices (and to Vectors) Authors@R: c( person("Henrik", "Bengtsson", role=c("aut", "cre", "cph"), email="henrikb@braju.com"), person("Hector", "Corrada Bravo", role="ctb"), person("Robert", "Gentleman", role="ctb"), person("Ola", "Hossjer", role="ctb"), person("Harris", "Jaffee", role="ctb"), person("Dongcan", "Jiang", role="ctb"), person("Peter", "Langfelder", role="ctb")) Author: Henrik Bengtsson [aut, cre, cph], Hector Corrada Bravo [ctb], Robert Gentleman [ctb], Ola Hossjer [ctb], Harris Jaffee [ctb], Dongcan Jiang [ctb], Peter Langfelder [ctb] Maintainer: Henrik Bengtsson Description: High-performing functions operating on rows and columns of matrices, e.g. col / rowMedians(), col / rowRanks(), and col / rowSds(). Functions optimized per data type and for subsetted calculations such that both memory usage and processing time is minimized. There are also optimized vector-based methods, e.g. binMeans(), madDiff() and weightedMedian(). License: Artistic-2.0 LazyLoad: TRUE NeedsCompilation: yes ByteCompile: TRUE URL: https://github.com/HenrikBengtsson/matrixStats BugReports: https://github.com/HenrikBengtsson/matrixStats/issues RoxygenNote: 6.0.1 Packaged: 2017-04-13 07:54:02 UTC; hb Repository: CRAN Date/Publication: 2017-04-14 14:49:54 UTC matrixStats/man/0000755000175100001440000000000013071015243013362 5ustar hornikusersmatrixStats/man/rowOrderStats.Rd0000644000175100001440000000345713070644022016506 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowOrderStats.R \name{rowOrderStats} \alias{rowOrderStats} \alias{colOrderStats} \title{Gets an order statistic for each row (column) in a matrix} \usage{ rowOrderStats(x, rows = NULL, cols = NULL, which, dim. = dim(x), ...) colOrderStats(x, rows = NULL, cols = NULL, which, dim. = dim(x), ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{which}{An \code{\link[base]{integer}} index in [1,K] ([1,N]) indicating which order statistic to be returned.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Gets an order statistic for each row (column) in a matrix. } \details{ The implementation of \code{rowOrderStats()} is optimized for both speed and memory. To avoid coercing to \code{\link[base]{double}}s (and hence memory allocation), there is a unique implementation for \code{\link[base]{integer}} matrices. } \section{Missing values}{ This method does \emph{not} handle missing values, that is, the result corresponds to having \code{na.rm = FALSE} (if such an argument would be available). } \seealso{ See \code{rowMeans()} in \code{\link[base]{colSums}}(). } \author{ The native implementation of \code{rowOrderStats()} was adopted by Henrik Bengtsson from Robert Gentleman's \code{rowQ()} in the \pkg{Biobase} package. } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/rowWeightedMedians.Rd0000644000175100001440000000453713070644022017455 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowWeightedMedians.R \name{rowWeightedMedians} \alias{rowWeightedMedians} \alias{colWeightedMedians} \title{Calculates the weighted medians for each row (column) in a matrix} \usage{ rowWeightedMedians(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) colWeightedMedians(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{w}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length K (N).} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values are excluded from the calculation, otherwise not.} \item{...}{Additional arguments passed to \code{\link{weightedMedian}}().} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Calculates the weighted medians for each row (column) in a matrix. } \details{ The implementations of these methods are optimized for both speed and memory. If no weights are given, the corresponding \code{\link{rowMedians}}()/\code{colMedians()} is used. } \examples{ x <- matrix(rnorm(20), nrow = 5, ncol = 4) print(x) # Non-weighted row averages mu_0 <- rowMedians(x) mu <- rowWeightedMedians(x) stopifnot(all.equal(mu, mu_0)) # Weighted row averages (uniform weights) w <- rep(2.5, times = ncol(x)) mu <- rowWeightedMedians(x, w = w) stopifnot(all.equal(mu, mu_0)) # Weighted row averages (excluding some columns) w <- c(1, 1, 0, 1) mu_0 <- rowMedians(x[, (w == 1), drop = FALSE]) mu <- rowWeightedMedians(x, w = w) stopifnot(all.equal(mu, mu_0)) # Weighted row averages (excluding some columns) w <- c(0, 1, 0, 0) mu_0 <- rowMedians(x[, (w == 1), drop = FALSE]) mu <- rowWeightedMedians(x, w = w) stopifnot(all.equal(mu, mu_0)) # Weighted averages by rows and columns w <- 1:4 mu_1 <- rowWeightedMedians(x, w = w) mu_2 <- colWeightedMedians(t(x), w = w) stopifnot(all.equal(mu_2, mu_1)) } \seealso{ See \code{\link{rowMedians}}() and \code{colMedians()} for non-weighted medians. Internally, \code{\link{weightedMedian}}() is used. } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/rowSums2.Rd0000644000175100001440000000240013070644022015410 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowSums2.R \name{rowSums2} \alias{rowSums2} \alias{colSums2} \title{Calculates the sum for each row (column) in a matrix} \usage{ rowSums2(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) colSums2(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s are excluded first, otherwise not.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Calculates the sum for each row (column) in a matrix. } \details{ The implementation of \code{rowSums2()} and \code{colSums2()} is optimized for both speed and memory. } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/weightedMedian.Rd0000644000175100001440000001172113070644022016573 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/weightedMedian.R \name{weightedMedian} \alias{weightedMedian} \title{Weighted Median Value} \usage{ weightedMedian(x, w = NULL, idxs = NULL, na.rm = FALSE, interpolate = is.null(ties), ties = NULL, ...) } \arguments{ \item{x}{a \code{\link[base]{numeric}} \code{\link[base]{vector}} containing the values whose weighted median is to be computed.} \item{w}{a vector of weights the same length as \code{x} giving the weights to use for each element of \code{x}. Negative weights are treated as zero weights. Default value is equal weight to all values.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{a logical value indicating whether \code{\link[base]{NA}} values in \code{x} should be stripped before the computation proceeds, or not. If \code{\link[base]{NA}}, no check at all for \code{\link[base]{NA}}s is done. Default value is \code{\link[base]{NA}} (for efficiency).} \item{interpolate}{If \code{\link[base:logical]{TRUE}}, linear interpolation is used to get a consistent estimate of the weighted median.} \item{ties}{If \code{interpolate == FALSE}, a character string specifying how to solve ties between two \code{x}'s that are satisfying the weighted median criteria. Note that at most two values can satisfy the criteria. When \code{ties} is \code{"min"}, the smaller value of the two is returned and when it is \code{"max"}, the larger value is returned. If \code{ties} is \code{"mean"}, the mean of the two values is returned. Finally, if \code{ties} is \code{"weighted"} (or \code{\link[base]{NULL}}) a weighted average of the two are returned, where the weights are weights of all values \code{x[i] <= x[k]} and \code{x[i] >= x[k]}, respectively.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} scalar. } \description{ Computes a weighted median of a numeric vector. } \details{ For the \code{n} elements \code{x = c(x[1], x[2], ..., x[n])} with positive weights \code{w = c(w[1], w[2], ..., w[n])} such that \code{sum(w) = S}, the \emph{weighted median} is defined as the element \code{x[k]} for which the total weight of all elements \code{x[i] < x[k]} is less or equal to \code{S/2} and for which the total weight of all elements \code{x[i] > x[k]} is less or equal to \code{S/2} (c.f. [1]). If \code{w} is missing then all elements of \code{x} are given the same positive weight. If all weights are zero, \code{\link[base]{NA}}_real_ is returned. If one or more weights are \code{Inf}, it is the same as these weights have the same weight and the others has zero. This makes things easier for cases where the weights are result of a division with zero. The weighted median solves the following optimization problem: \deqn{\alpha^* = \arg_\alpha \min \sum_{k = 1}{K} w_k |x_k-\alpha|} where \eqn{x = (x_1, x_2, \ldots, x_K)} are scalars and \eqn{w = (w_1, w_2, \ldots, w_K)} are the corresponding "weights" for each individual \eqn{x} value. } \examples{ x <- 1:10 n <- length(x) m1 <- median(x) # 5.5 m2 <- weightedMedian(x) # 5.5 stopifnot(identical(m1, m2)) w <- rep(1, times = n) m1 <- weightedMedian(x, w) # 5.5 (default) m2 <- weightedMedian(x, ties = "weighted") # 5.5 (default) m3 <- weightedMedian(x, ties = "min") # 5 m4 <- weightedMedian(x, ties = "max") # 6 stopifnot(identical(m1, m2)) # Pull the median towards zero w[1] <- 5 m1 <- weightedMedian(x, w) # 3.5 y <- c(rep(0, times = w[1]), x[-1]) # Only possible for integer weights m2 <- median(y) # 3.5 stopifnot(identical(m1, m2)) # Put even more weight on the zero w[1] <- 8.5 weightedMedian(x, w) # 2 # All weight on the first value w[1] <- Inf weightedMedian(x, w) # 1 # All weight on the last value w[1] <- 1 w[n] <- Inf weightedMedian(x, w) # 10 # All weights set to zero w <- rep(0, times = n) weightedMedian(x, w) # NA # Simple benchmarking bench <- function(N = 1e5, K = 10) { x <- rnorm(N) gc() t <- c() t[1] <- system.time(for (k in 1:K) median(x))[3] t[2] <- system.time(for (k in 1:K) weightedMedian(x))[3] t <- t / t[1] names(t) <- c("median", "weightedMedian") t } print(bench(N = 5, K = 100)) print(bench(N = 50, K = 100)) print(bench(N = 200, K = 100)) print(bench(N = 1000, K = 100)) print(bench(N = 10e3, K = 20)) print(bench(N = 100e3, K = 20)) } \references{ [1] T.H. Cormen, C.E. Leiserson, R.L. Rivest, Introduction to Algorithms, The MIT Press, Massachusetts Institute of Technology, 1989. } \seealso{ \code{\link[stats]{median}}, \code{\link[base]{mean}}() and \code{\link{weightedMean}}(). } \author{ Henrik Bengtsson and Ola Hossjer, Centre for Mathematical Sciences, Lund University. Thanks to Roger Koenker, Econometrics, University of Illinois, for the initial ideas. } \keyword{robust} \keyword{univar} matrixStats/man/rowCollapse.Rd0000644000175100001440000000313413070644022016146 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowCollapse.R \name{rowCollapse} \alias{rowCollapse} \alias{colCollapse} \title{Extracts one cell per row (column) from a matrix} \usage{ rowCollapse(x, idxs, rows = NULL, dim. = dim(x), ...) colCollapse(x, idxs, cols = NULL, dim. = dim(x), ...) } \arguments{ \item{x}{An NxK \code{\link[base]{matrix}}.} \item{idxs}{An index \code{\link[base]{vector}} of (maximum) length N (K) specifying the columns (rows) to be extracted.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{vector}} of length N (K). } \description{ Extracts one cell per row (column) from a matrix. The implementation is optimized for memory and speed. } \examples{ x <- matrix(1:27, ncol = 3) y <- rowCollapse(x, 1) stopifnot(identical(y, x[, 1])) y <- rowCollapse(x, 2) stopifnot(identical(y, x[, 2])) y <- rowCollapse(x, c(1, 1, 1, 1, 1, 3, 3, 3, 3)) stopifnot(identical(y, c(x[1:5, 1], x[6:9, 3]))) y <- rowCollapse(x, 1:3) print(y) y_truth <- c(x[1, 1], x[2, 2], x[3, 3], x[4, 1], x[5, 2], x[6, 3], x[7, 1], x[8, 2], x[9, 3]) stopifnot(identical(y, y_truth)) } \seealso{ \emph{Matrix indexing} to index elements in matrices and arrays, cf. \code{\link[base]{[}}(). } \author{ Henrik Bengtsson } \keyword{utilities} matrixStats/man/binCounts.Rd0000644000175100001440000000364113070644022015623 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/binCounts.R \name{binCounts} \alias{binCounts} \title{Fast element counting in non-overlapping bins} \usage{ binCounts(x, idxs = NULL, bx, right = FALSE, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of K positions for to be binned and counted.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{bx}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of B + 1 ordered positions specifying the B > 0 bins \code{[bx[1], bx[2])}, \code{[bx[2], bx[3])}, ..., \code{[bx[B], bx[B + 1])}.} \item{right}{If \code{\link[base:logical]{TRUE}}, the bins are right-closed (left open), otherwise left-closed (right open).} \item{...}{Not used.} } \value{ Returns an \code{\link[base]{integer}} \code{\link[base]{vector}} of length B with non-negative integers. } \description{ Counts the number of elements in non-overlapping bins } \details{ \code{binCounts(x, bx, right = TRUE)} gives equivalent results as \code{rev(binCounts(-x, bx = rev(-bx), right = FALSE))}, but is faster and more memory efficient. } \section{Missing and non-finite values}{ Missing values in \code{x} are ignored/dropped. Missing values in \code{bx} are not allowed and gives an error. } \seealso{ An alternative for counting occurrences within bins is \code{\link[graphics]{hist}}, e.g. \code{hist(x, breaks = bx, plot = FALSE)$counts}. That approach is ~30-60\% slower than \code{binCounts(..., right = TRUE)}. To count occurrences of indices \code{x} (positive \code{\link[base]{integer}}s) in \code{[1, B]}, use \code{tabulate(x, nbins = B)}, where \code{x} does \emph{not} have to be sorted first. For details, see \code{\link[base]{tabulate}}(). To average values within bins, see \code{\link{binMeans}}(). } \author{ Henrik Bengtsson } \keyword{univar} matrixStats/man/rowProds.Rd0000644000175100001440000000376013070644022015500 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/product.R, R/rowProds.R \name{product} \alias{product} \alias{rowProds} \alias{colProds} \title{Calculates the product for each row (column) in a matrix} \usage{ product(x, idxs = NULL, na.rm = FALSE, ...) rowProds(x, rows = NULL, cols = NULL, na.rm = FALSE, method = c("direct", "expSumLog"), ...) colProds(x, rows = NULL, cols = NULL, na.rm = FALSE, method = c("direct", "expSumLog"), ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{idxs, rows, cols}{A \code{\link[base]{vector}} indicating subset of elements (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values are ignored, otherwise not.} \item{...}{Not used.} \item{method}{A \code{\link[base]{character}} string specifying how each product is calculated.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Calculates the product for each row (column) in a matrix. } \details{ If \code{method = "expSumLog"}, then then \code{\link{product}}() function is used, which calculates the produce via the logarithmic transform (treating negative values specially). This improves the precision and lowers the risk for numeric overflow. If \code{method = "direct"}, the direct product is calculated via the \code{\link[base]{prod}}() function. } \section{Missing values}{ Note, if \code{method = "expSumLog"}, \code{na.rm = FALSE}, and \code{x} contains missing values (\code{\link[base]{NA}} or \code{\link[base:is.finite]{NaN}}), then the calculated value is also missing value. Note that it depends on platform whether \code{\link[base:is.finite]{NaN}} or \code{\link[base]{NA}} is returned when an \code{\link[base:is.finite]{NaN}} exists, cf. \code{\link[base]{is.nan}}(). } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/binMeans.Rd0000644000175100001440000000474313070644022015417 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/binMeans.R \name{binMeans} \alias{binMeans} \title{Fast mean calculations in non-overlapping bins} \usage{ binMeans(y, x, idxs = NULL, bx, na.rm = TRUE, count = TRUE, right = FALSE, ...) } \arguments{ \item{y}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of K values to calculate means on.} \item{x}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of K positions for to be binned.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{bx}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of B + 1 ordered positions specifying the B > 0 bins \code{[bx[1], bx[2])}, \code{[bx[2], bx[3])}, ..., \code{[bx[B], bx[B + 1])}.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values in \code{y} are dropped before calculating the mean, otherwise not.} \item{count}{If \code{\link[base:logical]{TRUE}}, the number of data points in each bins is returned as attribute \code{count}, which is an \code{\link[base]{integer}} \code{\link[base]{vector}} of length B.} \item{right}{If \code{\link[base:logical]{TRUE}}, the bins are right-closed (left open), otherwise left-closed (right open).} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length B. } \description{ Computes the sample means in non-overlapping bins } \details{ \code{binMeans(x, bx, right = TRUE)} gives equivalent results as \code{rev(binMeans(-x, bx = sort(-bx), right = FALSE))}, but is faster. } \section{Missing and non-finite values}{ Data points where either of \code{y} and \code{x} is missing are dropped (and therefore are also not counted). Non-finite values in \code{y} are not allowed and gives an error. Missing values in \code{bx} are not allowed and gives an error. } \examples{ x <- 1:200 mu <- double(length(x)) mu[1:50] <- 5 mu[101:150] <- -5 y <- mu + rnorm(length(x)) # Binning bx <- c(0, 50, 100, 150, 200) + 0.5 y_s <- binMeans(y, x = x, bx = bx) plot(x, y) for (kk in seq_along(y_s)) { lines(bx[c(kk, kk + 1)], y_s[c(kk, kk)], col = "blue", lwd = 2) } } \references{ [1] R-devel thread \emph{Fastest non-overlapping binning mean function out there?} on Oct 3, 2012\cr } \seealso{ \code{\link{binCounts}}(). \code{\link[stats]{aggregate}} and \code{\link[base]{mean}}(). } \author{ Henrik Bengtsson with initial code contributions by Martin Morgan [1]. } \keyword{univar} matrixStats/man/anyMissing.Rd0000644000175100001440000000336613070644022016004 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/anyMissing.R \name{anyMissing} \alias{anyMissing} \alias{colAnyMissings} \alias{rowAnyMissings} \alias{colAnyNAs} \alias{rowAnyNAs} \title{Checks if there are any missing values in an object or not} \usage{ anyMissing(x, idxs = NULL, ...) colAnyMissings(x, rows = NULL, cols = NULL, ...) rowAnyMissings(x, rows = NULL, cols = NULL, ...) colAnyNAs(x, rows = NULL, cols = NULL, ...) rowAnyNAs(x, rows = NULL, cols = NULL, ...) } \arguments{ \item{x}{A \code{\link[base]{vector}}, a \code{\link[base]{list}}, a \code{\link[base]{matrix}}, a \code{\link[base]{data.frame}}, or \code{\link[base]{NULL}}.} \item{idxs, rows, cols}{A \code{\link[base]{vector}} indicating subset of elements (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{...}{Not used.} } \value{ Returns \code{\link[base:logical]{TRUE}} if a missing value was detected, otherwise \code{\link[base:logical]{FALSE}}. } \description{ Checks if there are any missing values in an object or not. \emph{Please use \code{base::anyNA()} instead of \code{anyMissing()}, \code{colAnyNAs()} instead of \code{colAnyMissings()}, and \code{rowAnyNAs()} instead of \code{rowAnyMissings()}.} } \details{ The implementation of this method is optimized for both speed and memory. The method will return \code{\link[base:logical]{TRUE}} as soon as a missing value is detected. } \examples{ x <- rnorm(n = 1000) x[seq(300, length(x), by = 100)] <- NA stopifnot(anyMissing(x) == any(is.na(x))) } \seealso{ Starting with R v3.1.0, there is \code{anyNA()} in the \pkg{base}, which provides the same functionality as \code{anyMissing()}. } \author{ Henrik Bengtsson } \keyword{iteration} \keyword{logic} matrixStats/man/logSumExp.Rd0000644000175100001440000000624213070644022015602 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/logSumExp.R \name{logSumExp} \alias{logSumExp} \title{Accurately computes the logarithm of the sum of exponentials} \usage{ logSumExp(lx, idxs = NULL, na.rm = FALSE, ...) } \arguments{ \item{lx}{A \code{\link[base]{numeric}} \code{\link[base]{vector}}. Typically \code{lx} are \eqn{log(x)} values.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, any missing values are ignored, otherwise not.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} scalar. } \description{ Accurately computes the logarithm of the sum of exponentials, that is, \eqn{log(sum(exp(lx)))}. If \eqn{lx = log(x)}, then this is equivalently to calculating \eqn{log(sum(x))}. } \details{ This function, which avoid numerical underflow, is often used when computing the logarithm of the sum of small numbers (\eqn{|x| << 1}) such as probabilities. This is function is more accurate than \code{log(sum(exp(lx)))} when the values of \eqn{x = exp(lx)} are \eqn{|x| << 1}. The implementation of this function is based on the observation that \deqn{ log(a + b) = [ la = log(a), lb = log(b) ] = log( exp(la) + exp(lb) ) = la + log ( 1 + exp(lb - la) ) } Assuming \eqn{la > lb}, then \eqn{|lb - la| < |lb|}, and it is less likely that the computation of \eqn{1 + exp(lb - la)} will not underflow/overflow numerically. Because of this, the overall result from this function should be more accurate. Analogously to this, the implementation of this function finds the maximum value of \code{lx} and subtracts it from the remaining values in \code{lx}. } \section{Benchmarking}{ This method is optimized for correctness, that avoiding underflowing. It is implemented in native code that is optimized for speed and memory. } \examples{ ## EXAMPLE #1 lx <- c(1000.01, 1000.02) y0 <- log(sum(exp(lx))) print(y0) ## Inf y1 <- logSumExp(lx) print(y1) ## 1000.708 ## EXAMPLE #2 lx <- c(-1000.01, -1000.02) y0 <- log(sum(exp(lx))) print(y0) ## -Inf y1 <- logSumExp(lx) print(y1) ## -999.3218 ## EXAMPLE #3 ## R-help thread 'Beyond double-precision?' on May 9, 2009. set.seed(1) x <- runif(50) ## The logarithm of the harmonic mean y0 <- log(1 / mean(1 / x)) print(y0) ## -1.600885 lx <- log(x) y1 <- log(length(x)) - logSumExp(-lx) print(y1) ## [1] -1.600885 # Sanity check stopifnot(all.equal(y1, y0)) } \references{ [1] R Core Team, \emph{Writing R Extensions}, v3.0.0, April 2013. \cr [2] Laurent El Ghaoui, \emph{Hyper-Textbook: Optimization Models and Applications}, University of California at Berkeley, August 2012. (Chapter 'Log-Sum-Exp (LSE) Function and Properties') \cr [3] R-help thread \emph{logsumexp function in R}, 2011-02-17. \url{https://stat.ethz.ch/pipermail/r-help/2011-February/269205.html}\cr } \seealso{ To compute this function on rows or columns of a matrix, see \code{\link{rowLogSumExps}}(). For adding \emph{two} double values in native code, R provides the C function \code{logspace_add()} [1]. For properties of the log-sum-exponential function, see [2]. } \author{ Henrik Bengtsson } matrixStats/man/varDiff.Rd0000644000175100001440000000711413070644022015237 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/varDiff.R \name{varDiff} \alias{varDiff} \alias{sdDiff} \alias{madDiff} \alias{iqrDiff} \alias{rowVarDiffs} \alias{colVarDiffs} \alias{rowSdDiffs} \alias{colSdDiffs} \alias{rowMadDiffs} \alias{colMadDiffs} \alias{rowIQRDiffs} \alias{colIQRDiffs} \title{Estimation of scale based on sequential-order differences} \usage{ varDiff(x, idxs = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) sdDiff(x, idxs = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) madDiff(x, idxs = NULL, na.rm = FALSE, diff = 1L, trim = 0, constant = 1.4826, ...) iqrDiff(x, idxs = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) rowVarDiffs(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) colVarDiffs(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) rowSdDiffs(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) colSdDiffs(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) rowMadDiffs(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) colMadDiffs(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) rowIQRDiffs(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) colIQRDiffs(x, rows = NULL, cols = NULL, na.rm = FALSE, diff = 1L, trim = 0, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N or a \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{idxs, rows, cols}{A \code{\link[base]{vector}} indicating subset of elements (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s are excluded, otherwise not.} \item{diff}{The positional distance of elements for which the difference should be calculated.} \item{trim}{A \code{\link[base]{double}} in [0,1/2] specifying the fraction of observations to be trimmed from each end of (sorted) \code{x} before estimation.} \item{...}{Not used.} \item{constant}{A scale factor adjusting for asymptotically normal consistency.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length 1, length N, or length K. } \description{ Estimation of scale based on sequential-order differences, corresponding to the scale estimates provided by \code{\link[stats]{var}}, \code{\link[stats]{sd}}, \code{\link[stats]{mad}} and \code{\link[stats]{IQR}}. } \details{ Note that n-order difference MAD estimates, just like the ordinary MAD estimate by \code{\link[stats]{mad}}, apply a correction factor such that the estimates are consistent with the standard deviation under Gaussian distributions. The interquartile range (IQR) estimates does \emph{not} apply such a correction factor. If asymptotically normal consistency is wanted, the correction factor for IQR estimate is \code{1 / (2 * qnorm(3/4))}, which is half of that used for MAD estimates, which is \code{1 / qnorm(3/4)}. This correction factor needs to be applied manually, i.e. there is no \code{constant} argument for the IQR functions. } \references{ [1] J. von Neumann et al., \emph{The mean square successive difference}. Annals of Mathematical Statistics, 1941, 12, 153-162.\cr } \seealso{ For the corresponding non-differentiated estimates, see \code{\link[stats]{var}}, \code{\link[stats]{sd}}, \code{\link[stats]{mad}} and \code{\link[stats]{IQR}}. Internally, \code{\link{diff2}}() is used which is a faster version of \code{\link[base]{diff}}(). } \author{ Henrik Bengtsson } \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/weightedVar.Rd0000644000175100001440000000422013070644022016122 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/weightedVar.R \name{weightedVar} \alias{weightedVar} \alias{weightedSd} \alias{rowWeightedVars} \alias{colWeightedVars} \alias{rowWeightedSds} \alias{colWeightedSds} \title{Weighted variance and weighted standard deviation} \usage{ weightedVar(x, w = NULL, idxs = NULL, na.rm = FALSE, center = NULL, ...) weightedSd(...) rowWeightedVars(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) colWeightedVars(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) rowWeightedSds(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) colWeightedSds(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) } \arguments{ \item{x}{a \code{\link[base]{numeric}} \code{\link[base]{vector}} containing the values whose weighted variance is to be computed.} \item{w}{a vector of weights the same length as \code{x} giving the weights to use for each element of \code{x}. Negative weights are treated as zero weights. Default value is equal weight to all values.} \item{idxs, rows, cols}{A \code{\link[base]{vector}} indicating subset of elements (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{a logical value indicating whether \code{\link[base]{NA}} values in \code{x} should be stripped before the computation proceeds, or not. If \code{\link[base]{NA}}, no check at all for \code{\link[base]{NA}}s is done. Default value is \code{\link[base]{NA}} (for efficiency).} \item{center}{Optional \code{\link[base]{numeric}} scalar specifying the center location of the data. If \code{\link[base]{NULL}}, it is estimated from data.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} scalar. } \description{ Computes a weighted variance / standard deviation of a numeric vector or across rows or columns of a matrix. } \section{Missing values}{ Missing values are dropped at the very beginning, if argument \code{na.rm} is \code{\link[base:logical]{TRUE}}, otherwise not. } \seealso{ For the non-weighted variance, see \code{\link[stats]{var}}. } \author{ Henrik Bengtsson } \keyword{robust} \keyword{univar} matrixStats/man/rowDiffs.Rd0000644000175100001440000000260613070644022015442 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowDiffs.R \name{rowDiffs} \alias{rowDiffs} \alias{colDiffs} \title{Calculates difference for each row (column) in a matrix} \usage{ rowDiffs(x, rows = NULL, cols = NULL, lag = 1L, differences = 1L, dim. = dim(x), ...) colDiffs(x, rows = NULL, cols = NULL, lag = 1L, differences = 1L, dim. = dim(x), ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{lag}{An \code{\link[base]{integer}} specifying the lag.} \item{differences}{An \code{\link[base]{integer}} specifying the order of difference.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} Nx(K-1) or (N-1)xK \code{\link[base]{matrix}}. } \description{ Calculates difference for each row (column) in a matrix. } \examples{ x <- matrix(1:27, ncol = 3) d1 <- rowDiffs(x) print(d1) d2 <- t(colDiffs(t(x))) stopifnot(all.equal(d2, d1)) } \seealso{ See also \code{\link{diff2}}(). } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/diff2.Rd0000644000175100001440000000163213070644022014647 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/diff2.R \name{diff2} \alias{diff2} \title{Fast lagged differences} \usage{ diff2(x, idxs = NULL, lag = 1L, differences = 1L, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{lag}{An \code{\link[base]{integer}} specifying the lag.} \item{differences}{An \code{\link[base]{integer}} specifying the order of difference.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N - \code{differences}. } \description{ Computes the lagged and iterated differences. } \examples{ diff2(1:10) } \seealso{ \code{\link[base]{diff}}(). } \author{ Henrik Bengtsson } \keyword{internal} \keyword{univar} matrixStats/man/validateIndices.Rd0000644000175100001440000000144213073232747016756 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/validateIndices.R \name{validateIndices} \alias{validateIndices} \title{Validate indices} \usage{ validateIndices(idxs = NULL, maxIdx, allowOutOfBound = TRUE) } \arguments{ \item{idxs}{A \code{\link[base]{integer}} \code{\link[base]{vector}}. If \code{\link[base]{NULL}}, all indices are considered.} \item{maxIdx}{The possible max index.} \item{allowOutOfBound}{Allow positive out of bound to indicate \code{\link[base]{NA}}.} } \value{ Returns a validated integers list indicating the indices. } \description{ Computes validated positive indices from given indices. } \examples{ idxs <- validateIndices(c(-4, 0, -3, -1), 5) # [2, 5] idxs <- validateIndices(c(4, 4, 8, 2, 3), 8) # [4, 4, 8, 2, 3] } \keyword{internal} matrixStats/man/rowMedians.Rd0000644000175100001440000000356513070644022015774 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowMedians.R \name{rowMedians} \alias{rowMedians} \alias{colMedians} \title{Calculates the median for each row (column) in a matrix} \usage{ rowMedians(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) colMedians(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s are excluded first, otherwise not.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Calculates the median for each row (column) in a matrix. } \details{ The implementation of \code{rowMedians()} and \code{colMedians()} is optimized for both speed and memory. To avoid coercing to \code{\link[base]{double}}s (and hence memory allocation), there is a special implementation for \code{\link[base]{integer}} matrices. That is, if \code{x} is an \code{\link[base]{integer}} \code{\link[base]{matrix}}, then \code{rowMedians(as.double(x))} (\code{rowMedians(as.double(x))}) would require three times the memory of \code{rowMedians(x)} (\code{colMedians(x)}), but all this is avoided. } \seealso{ See \code{\link{rowMedians}}() and \code{colMedians()} for weighted medians. For mean estimates, see \code{rowMeans()} in \code{\link[base]{colSums}}(). } \author{ Henrik Bengtsson, Harris Jaffee } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/weightedMean.Rd0000644000175100001440000000567413070644022016270 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/weightedMean.R \name{weightedMean} \alias{weightedMean} \title{Weighted Arithmetic Mean} \usage{ weightedMean(x, w = NULL, idxs = NULL, na.rm = FALSE, refine = FALSE, ...) } \arguments{ \item{x}{a \code{\link[base]{numeric}} \code{\link[base]{vector}} containing the values whose weighted mean is to be computed.} \item{w}{a vector of weights the same length as \code{x} giving the weights to use for each element of \code{x}. Negative weights are treated as zero weights. Default value is equal weight to all values.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{a logical value indicating whether \code{\link[base]{NA}} values in \code{x} should be stripped before the computation proceeds, or not. If \code{\link[base]{NA}}, no check at all for \code{\link[base]{NA}}s is done. Default value is \code{\link[base]{NA}} (for efficiency).} \item{refine}{If \code{\link[base:logical]{TRUE}} and \code{x} is \code{\link[base]{numeric}}, then extra effort is used to calculate the average with greater numerical precision, otherwise not.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} scalar. If \code{x} is of zero length, then \code{NaN} is returned, which is consistent with \code{\link[base]{mean}}(). } \description{ Computes the weighted sample mean of a numeric vector. } \section{Missing values}{ This function handles missing values consistently \code{\link[stats]{weighted.mean}}. More precisely, if \code{na.rm = FALSE}, then any missing values in either \code{x} or \code{w} will give result \code{NA_real_}. If \code{na.rm = TRUE}, then all \code{(x, w)} data points for which \code{x} is missing are skipped. Note that if both \code{x} and \code{w} are missing for a data points, then it is also skipped (by the same rule). However, if only \code{w} is missing, then the final results will always be \code{NA_real_} regardless of \code{na.rm}. } \examples{ x <- 1:10 n <- length(x) w <- rep(1, times = n) m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) stopifnot(identical(m1, m0)) # Pull the mean towards zero w[1] <- 5 m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) stopifnot(identical(m1, m0)) # Put even more weight on the zero w[1] <- 8.5 m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) stopifnot(identical(m1, m0)) # All weight on the first value w[1] <- Inf m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) stopifnot(identical(m1, m0)) # All weight on the last value w[1] <- 1 w[n] <- Inf m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) stopifnot(identical(m1, m0)) # All weights set to zero w <- rep(0, times = n) m0 <- weighted.mean(x, w) m1 <- weightedMean(x, w) stopifnot(identical(m1, m0)) } \seealso{ \code{\link[base]{mean}}() and \code{\link[stats]{weighted.mean}}. } \author{ Henrik Bengtsson } \keyword{robust} \keyword{univar} matrixStats/man/rowQuantiles.Rd0000644000175100001440000000400113070644022016343 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowQuantiles.R \name{rowQuantiles} \alias{rowQuantiles} \alias{colQuantiles} \title{Estimates quantiles for each row (column) in a matrix} \usage{ rowQuantiles(x, rows = NULL, cols = NULL, probs = seq(from = 0, to = 1, by = 0.25), na.rm = FALSE, type = 7L, ..., drop = TRUE) colQuantiles(x, rows = NULL, cols = NULL, probs = seq(from = 0, to = 1, by = 0.25), na.rm = FALSE, type = 7L, ..., drop = TRUE) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}} with N >= 0.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{probs}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of J probabilities in [0, 1].} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s are excluded first, otherwise not.} \item{type}{An \code{\link[base]{integer}} specify the type of estimator. See \code{\link[stats]{quantile}} for more details.} \item{...}{Additional arguments passed to \code{\link[stats]{quantile}}.} \item{drop}{If TRUE, singleton dimensions in the result are dropped, otherwise not.} } \value{ Returns a \code{\link[base]{numeric}} NxJ (KxJ) \code{\link[base]{matrix}}, where N (K) is the number of rows (columns) for which the J quantiles are calculated. } \description{ Estimates quantiles for each row (column) in a matrix. } \examples{ set.seed(1) x <- matrix(rnorm(50 * 40), nrow = 50, ncol = 40) str(x) probs <- c(0.25, 0.5, 0.75) # Row quantiles q <- rowQuantiles(x, probs = probs) print(q) q_0 <- apply(x, MARGIN = 1, FUN = quantile, probs = probs) stopifnot(all.equal(q_0, t(q))) # Column IQRs q <- colQuantiles(x, probs = probs) print(q) q_0 <- apply(x, MARGIN = 2, FUN = quantile, probs = probs) stopifnot(all.equal(q_0, t(q))) } \seealso{ \code{\link[stats]{quantile}}. } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/allocMatrix.Rd0000644000175100001440000000210313070644022016126 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allocMatrix.R \name{allocMatrix} \alias{allocMatrix} \alias{allocVector} \alias{allocArray} \title{Allocates an empty vector, matrix or array} \usage{ allocMatrix(nrow, ncol, value = 0, ...) allocVector(length, value = 0, ...) allocArray(dim, value = 0, ...) } \arguments{ \item{value}{A \code{\link[base]{numeric}} scalar that all elements will have as value.} \item{...}{Not used.} \item{length, nrow, ncol, dim}{\code{\link[base]{numeric}}s specifying the dimension of the created \code{\link[base]{vector}}, \code{\link[base]{matrix}} or \code{\link[base]{array}}.} } \value{ Returns a \code{\link[base]{vector}}, \code{\link[base]{matrix}} and \code{\link[base]{array}} respectively of the same data type as \code{value}. } \description{ Allocates an empty vector, matrix or array faster than the corresponding function in R. } \seealso{ See also \code{\link[base]{vector}}, \code{\link[base]{matrix}} and \code{\link[base]{array}}. } \author{ Henrik Bengtsson } \keyword{internal} \keyword{programming} matrixStats/man/rowTabulates.Rd0000644000175100001440000000245513070644022016335 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowTabulates.R \name{rowTabulates} \alias{rowTabulates} \alias{colTabulates} \title{Tabulates the values in a matrix by row (column)} \usage{ rowTabulates(x, rows = NULL, cols = NULL, values = NULL, ...) colTabulates(x, rows = NULL, cols = NULL, values = NULL, ...) } \arguments{ \item{x}{An \code{\link[base]{integer}} or \code{\link[base]{raw}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{values}{An \code{\link[base]{vector}} of J values of count. If \code{\link[base]{NULL}}, all (unique) values are counted.} \item{...}{Not used.} } \value{ Returns a NxJ (KxJ) \code{\link[base]{matrix}} where N (K) is the number of row (column) \code{\link[base]{vector}}s tabulated and J is the number of values counted. } \description{ Tabulates the values in a matrix by row (column). } \examples{ x <- matrix(1:5, nrow = 10, ncol = 5) print(x) print(rowTabulates(x)) print(colTabulates(x)) # Count only certain values print(rowTabulates(x, values = 1:3)) y <- as.raw(x) dim(y) <- dim(x) print(y) print(rowTabulates(y)) print(colTabulates(y)) } \author{ Henrik Bengtsson } \keyword{utilities} matrixStats/man/rowVars.Rd0000644000175100001440000000447313070644022015326 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowVars.R \name{rowVars} \alias{rowVars} \alias{colVars} \title{Variance estimates for each row (column) in a matrix} \usage{ rowVars(x, rows = NULL, cols = NULL, na.rm = FALSE, center = NULL, dim. = dim(x), ...) colVars(x, rows = NULL, cols = NULL, na.rm = FALSE, center = NULL, dim. = dim(x), ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s are excluded first, otherwise not.} \item{center}{(optional) The center, defaults to the row means.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Additional arguments passed to \code{rowMeans()} and \code{rowSums()}.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Variance estimates for each row (column) in a matrix. } \examples{ set.seed(1) x <- matrix(rnorm(20), nrow = 5, ncol = 4) print(x) # Row averages print(rowMeans(x)) print(rowMedians(x)) # Column averages print(colMeans(x)) print(colMedians(x)) # Row variabilities print(rowVars(x)) print(rowSds(x)) print(rowMads(x)) print(rowIQRs(x)) # Column variabilities print(rowVars(x)) print(colSds(x)) print(colMads(x)) print(colIQRs(x)) # Row ranges print(rowRanges(x)) print(cbind(rowMins(x), rowMaxs(x))) print(cbind(rowOrderStats(x, which = 1), rowOrderStats(x, which = ncol(x)))) # Column ranges print(colRanges(x)) print(cbind(colMins(x), colMaxs(x))) print(cbind(colOrderStats(x, which = 1), colOrderStats(x, which = nrow(x)))) x <- matrix(rnorm(2400), nrow = 50, ncol = 40) # Row standard deviations d <- rowDiffs(x) s1 <- rowSds(d) / sqrt(2) s2 <- rowSds(x) print(summary(s1 - s2)) # Column standard deviations d <- colDiffs(x) s1 <- colSds(d) / sqrt(2) s2 <- colSds(x) print(summary(s1 - s2)) } \seealso{ See \code{rowMeans()} and \code{rowSums()} in \code{\link[base]{colSums}}(). } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/rowWeightedMeans.Rd0000644000175100001440000000441213070644022017130 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowWeightedMeans.R \name{rowWeightedMeans} \alias{rowWeightedMeans} \alias{colWeightedMeans} \title{Calculates the weighted means for each row (column) in a matrix} \usage{ rowWeightedMeans(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) colWeightedMeans(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{w}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length K (N).} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values are excluded from the calculation, otherwise not.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Calculates the weighted means for each row (column) in a matrix. } \details{ The implementations of these methods are optimized for both speed and memory. If no weights are given, the corresponding \code{rowMeans()}/\code{colMeans()} is used. } \examples{ x <- matrix(rnorm(20), nrow = 5, ncol = 4) print(x) # Non-weighted row averages mu_0 <- rowMeans(x) mu <- rowWeightedMeans(x) stopifnot(all.equal(mu, mu_0)) # Weighted row averages (uniform weights) w <- rep(2.5, times = ncol(x)) mu <- rowWeightedMeans(x, w = w) stopifnot(all.equal(mu, mu_0)) # Weighted row averages (excluding some columns) w <- c(1, 1, 0, 1) mu_0 <- rowMeans(x[, (w == 1), drop = FALSE]) mu <- rowWeightedMeans(x, w = w) stopifnot(all.equal(mu, mu_0)) # Weighted row averages (excluding some columns) w <- c(0, 1, 0, 0) mu_0 <- rowMeans(x[, (w == 1), drop = FALSE]) mu <- rowWeightedMeans(x, w = w) stopifnot(all.equal(mu, mu_0)) # Weighted averages by rows and columns w <- 1:4 mu_1 <- rowWeightedMeans(x, w = w) mu_2 <- colWeightedMeans(t(x), w = w) stopifnot(all.equal(mu_2, mu_1)) } \seealso{ See \code{rowMeans()} and \code{colMeans()} in \code{\link[base]{colSums}}() for non-weighted means. See also \code{\link[stats]{weighted.mean}}. } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/signTabulate.Rd0000644000175100001440000000164013070644022016276 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/signTabulate.R \name{signTabulate} \alias{signTabulate} \title{Calculates the number of negative, zero, positive and missing values} \usage{ signTabulate(x, idxs = NULL, ...) } \arguments{ \item{x}{a \code{\link[base]{numeric}} \code{\link[base]{vector}}.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{name}}d \code{\link[base]{numeric}} \code{\link[base]{vector}}. } \description{ Calculates the number of negative, zero, positive and missing values in a \code{\link[base]{numeric}} vector. For \code{\link[base]{double}} vectors, the number of negative and positive infinite values are also counted. } \seealso{ \code{\link[base]{sign}}(). } \author{ Henrik Bengtsson } \keyword{internal} matrixStats/man/rowMeans2.Rd0000644000175100001440000000241613070644022015533 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowMeans2.R \name{rowMeans2} \alias{rowMeans2} \alias{colMeans2} \title{Calculates the mean for each row (column) in a matrix} \usage{ rowMeans2(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) colMeans2(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s are excluded first, otherwise not.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Calculates the mean for each row (column) in a matrix. } \details{ The implementation of \code{rowMeans2()} and \code{colMeans2()} is optimized for both speed and memory. } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/mean2.Rd0000644000175100001440000000434013070644022014656 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mean2.R \name{mean2} \alias{mean2} \alias{meanOver} \title{Fast averaging over subset of vector elements} \usage{ mean2(x, idxs = NULL, na.rm = FALSE, refine = TRUE, ...) meanOver(...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values are skipped, otherwise not.} \item{refine}{If \code{\link[base:logical]{TRUE}} and \code{x} is \code{\link[base]{numeric}}, then extra effort is used to calculate the average with greater numerical precision, otherwise not.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} scalar. } \description{ Computes the sample mean of all or a subset of values. } \details{ \code{mean2(x, idxs)} gives equivalent results as \code{mean(x[idxs])}, but is faster and more memory efficient since it avoids the actual subsetting which requires copying of elements and garbage collection thereof. If \code{x} is \code{\link[base]{numeric}} and \code{refine = TRUE}, then a two-pass scan is used to calculate the average. The first scan calculates the total sum and divides by the number of (non-missing) values. In the second scan, this average is refined by adding the residuals towards the first average. The \code{\link[base]{mean}}() uses this approach. \code{mean2(..., refine = FALSE)} is almost twice as fast as \code{mean2(..., refine = TRUE)}. } \examples{ x <- 1:10 n <- length(x) idxs <- seq(from = 1, to = n, by = 2) s1 <- mean(x[idxs]) # 25 s2 <- mean2(x, idxs = idxs) # 25 stopifnot(identical(s1, s2)) idxs <- seq(from = n, to = 1, by = -2) s1 <- mean(x[idxs]) # 25 s2 <- mean2(x, idxs = idxs) # 25 stopifnot(identical(s1, s2)) s1 <- mean(x) # 55 s2 <- mean2(x) # 55 stopifnot(identical(s1, s2)) } \seealso{ \code{\link[base]{mean}}(). To efficiently sum over a subset, see \code{\link{sum2}}(). } \author{ Henrik Bengtsson } \keyword{internal} \keyword{univar} matrixStats/man/x_OP_y.Rd0000644000175100001440000000432113070644022015050 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/x_OP_y.R \name{x_OP_y} \alias{x_OP_y} \alias{t_tx_OP_y} \title{Fast calculation of 'z <- x OP y' and 'z <- t(t(x) OP y)'} \usage{ x_OP_y(x, y, OP, xrows = NULL, xcols = NULL, yidxs = NULL, commute = FALSE, na.rm = FALSE) t_tx_OP_y(x, y, OP, xrows = NULL, xcols = NULL, yidxs = NULL, commute = FALSE, na.rm = FALSE) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{y}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length L.} \item{OP}{A \code{\link[base]{character}} specifying which operator to use.} \item{xrows, xcols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over 'x'. If \code{\link[base]{NULL}}, no subsetting is done.} \item{commute}{If \code{\link[base:logical]{TRUE}}, 'y OP x' ('t(y OP t(x))') is calculated, otherwise 'x OP y' ('t(t(x) OP y)').} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values are ignored, otherwise not.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over 'y'. If \code{\link[base]{NULL}}, no subsetting is done.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. } \description{ Fast calculation of 'z <- x OP y' and 'z <- t(t(x) OP y)', where OP can be +, -, *, and /. For + and *, na.rm = TRUE will drop missing values first. } \section{Missing values}{ If \code{na.rm = TRUE}, then missing values are "dropped" before applying the operator to each pair of values. For instance, if \code{x[1, 1]} is a missing value, then the result of \code{x[1, 1] + y[1]} equals \code{y[1]}. If also \code{y[1]} is a missing value, then the result is a missing value. This only applies to additions and multiplications. For subtractions and divisions, argument \code{na.rm} is ignored. } \examples{ x <- matrix(c(1, 2, 3, NA, 5, 6), nrow = 3, ncol = 2) # Add 'y' to each column y <- 1:2 z0 <- x + y z1 <- x_OP_y(x, y, OP = "+") print(z1) stopifnot(all.equal(z1, z0)) # Add 'y' to each row y <- 1:3 z0 <- t(t(x) + y) z1 <- t_tx_OP_y(x, y, OP = "+") print(z1) stopifnot(all.equal(z1, z0)) } \author{ Henrik Bengtsson } \keyword{internal} matrixStats/man/rowSds.Rd0000644000175100001440000000360713070644022015142 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowMads.R, R/rowSds.R \name{rowMads} \alias{rowMads} \alias{colMads} \alias{rowSds} \alias{colSds} \title{Standard deviation estimates for each row (column) in a matrix} \usage{ rowMads(x, rows = NULL, cols = NULL, center = NULL, constant = 1.4826, na.rm = FALSE, dim. = dim(x), centers = NULL, ...) colMads(x, rows = NULL, cols = NULL, center = NULL, constant = 1.4826, na.rm = FALSE, dim. = dim(x), centers = NULL, ...) rowSds(x, rows = NULL, cols = NULL, ...) colSds(x, rows = NULL, cols = NULL, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{center}{A optional \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K) with centers. By default, they are calculated using \code{\link{rowMedians}}().} \item{constant}{A scale factor. See \code{\link[stats]{mad}} for details.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values are removed first, otherwise not.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{centers}{(deprectated) use \code{center} instead.} \item{...}{Additional arguments passed to \code{\link{rowVars}}() and \code{\link{rowMedians}}(), respectively.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Standard deviation estimates for each row (column) in a matrix. } \seealso{ \code{\link[stats]{sd}}, \code{\link[stats]{mad}} and \code{\link[stats:cor]{var}}. \code{\link{rowIQRs}}(). } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/rowAvgsPerColSet.Rd0000644000175100001440000000770313070644022017073 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowAvgsPerColSet.R \name{rowAvgsPerColSet} \alias{rowAvgsPerColSet} \alias{colAvgsPerRowSet} \title{Applies a row-by-row (column-by-column) averaging function to equally-sized subsets of matrix columns (rows)} \usage{ rowAvgsPerColSet(X, W = NULL, rows = NULL, S, FUN = rowMeans, ..., tFUN = FALSE) colAvgsPerRowSet(X, W = NULL, cols = NULL, S, FUN = colMeans, tFUN = FALSE, ...) } \arguments{ \item{X}{A \code{\link[base]{numeric}} NxM \code{\link[base]{matrix}}.} \item{W}{An optional \code{\link[base]{numeric}} NxM \code{\link[base]{matrix}} of weights.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{S}{An \code{\link[base]{integer}} KxJ \code{\link[base]{matrix}} specifying the J subsets. Each column holds K column (row) indices for the corresponding subset.} \item{FUN}{The row-by-row (column-by-column) \code{\link[base]{function}} used to average over each subset of \code{X}. This function must accept a \code{\link[base]{numeric}} NxK (KxM) \code{\link[base]{matrix}} and the \code{\link[base]{logical}} argument \code{na.rm} (which is automatically set), and return a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (M).} \item{...}{Additional arguments passed to then \code{FUN} \code{\link[base]{function}}.} \item{tFUN}{If \code{\link[base:logical]{TRUE}}, the NxK (KxM) \code{\link[base]{matrix}} passed to \code{FUN()} is transposed first.} } \value{ Returns a \code{\link[base]{numeric}} JxN (MxJ) \code{\link[base]{matrix}}, where row names equal \code{rownames(X)} (\code{colnames(S)}) and column names \code{colnames(S)} (\code{colnames(X)}). } \description{ Applies a row-by-row (column-by-column) averaging function to equally-sized subsets of matrix columns (rows). Each subset is averaged independently of the others. } \details{ If argument \code{S} is a single column vector with indices \code{1:N}, then \code{rowAvgsPerColSet(X, S = S, FUN = rowMeans)} gives the same result as \code{rowMeans(X)}. Analogously, for \code{rowAvgsPerColSet()}. } \examples{ X <- matrix(rnorm(20 * 6), nrow = 20, ncol = 6) rownames(X) <- LETTERS[1:nrow(X)] colnames(X) <- letters[1:ncol(X)] print(X) # - - - - - - - - - - - - - - - - - - - - - - - - - - # Apply rowMeans() for 3 sets of 2 columns # - - - - - - - - - - - - - - - - - - - - - - - - - - nbr_of_sets <- 3 S <- matrix(1:ncol(X), ncol = nbr_of_sets) colnames(S) <- sprintf("s\%d", 1:nbr_of_sets) print(S) Z <- rowAvgsPerColSet(X, S = S) print(Z) # Validation Z0 <- cbind(s1 = rowMeans(X[, 1:2]), s2 = rowMeans(X[, 3:4]), s3 = rowMeans(X[, 5:6])) stopifnot(identical(drop(Z), Z0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - # Apply colMeans() for 5 sets of 4 rows # - - - - - - - - - - - - - - - - - - - - - - - - - - nbr_of_sets <- 5 S <- matrix(1:nrow(X), ncol = nbr_of_sets) colnames(S) <- sprintf("s\%d", 1:nbr_of_sets) print(S) Z <- colAvgsPerRowSet(X, S = S) print(Z) # Validation Z0 <- rbind(s1 = colMeans(X[ 1:4, ]), s2 = colMeans(X[ 5:8, ]), s3 = colMeans(X[ 9:12, ]), s4 = colMeans(X[13:16, ]), s5 = colMeans(X[17:20, ])) stopifnot(identical(drop(Z), Z0)) # - - - - - - - - - - - - - - - - - - - - - - - - - - # When there is only one "complete" set # - - - - - - - - - - - - - - - - - - - - - - - - - - nbr_of_sets <- 1 S <- matrix(1:ncol(X), ncol = nbr_of_sets) colnames(S) <- sprintf("s\%d", 1:nbr_of_sets) print(S) Z <- rowAvgsPerColSet(X, S = S, FUN = rowMeans) print(Z) Z0 <- rowMeans(X) stopifnot(identical(drop(Z), Z0)) nbr_of_sets <- 1 S <- matrix(1:nrow(X), ncol = nbr_of_sets) colnames(S) <- sprintf("s\%d", 1:nbr_of_sets) print(S) Z <- colAvgsPerRowSet(X, S = S, FUN = colMeans) print(Z) Z0 <- colMeans(X) stopifnot(identical(drop(Z), Z0)) } \author{ Henrik Bengtsson } \keyword{internal} \keyword{utilities} matrixStats/man/rowCumsums.Rd0000644000175100001440000000376413070644022016051 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowCumsums.R \name{rowCumsums} \alias{rowCumsums} \alias{colCumsums} \alias{rowCumprods} \alias{colCumprods} \alias{rowCummins} \alias{colCummins} \alias{rowCummaxs} \alias{colCummaxs} \title{Cumulative sums, products, minima and maxima for each row (column) in a matrix} \usage{ rowCumsums(x, rows = NULL, cols = NULL, dim. = dim(x), ...) colCumsums(x, rows = NULL, cols = NULL, dim. = dim(x), ...) rowCumprods(x, rows = NULL, cols = NULL, dim. = dim(x), ...) colCumprods(x, rows = NULL, cols = NULL, dim. = dim(x), ...) rowCummins(x, rows = NULL, cols = NULL, dim. = dim(x), ...) colCummins(x, rows = NULL, cols = NULL, dim. = dim(x), ...) rowCummaxs(x, rows = NULL, cols = NULL, dim. = dim(x), ...) colCummaxs(x, rows = NULL, cols = NULL, dim. = dim(x), ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of elements (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}} of the same mode as \code{x}. } \description{ Cumulative sums, products, minima and maxima for each row (column) in a matrix. } \examples{ x <- matrix(1:12, nrow = 4, ncol = 3) print(x) yr <- rowCumsums(x) print(yr) yc <- colCumsums(x) print(yc) yr <- rowCumprods(x) print(yr) yc <- colCumprods(x) print(yc) yr <- rowCummaxs(x) print(yr) yc <- colCummaxs(x) print(yc) yr <- rowCummins(x) print(yr) yc <- colCummins(x) print(yc) } \seealso{ See \code{\link[base]{cumsum}}(), \code{\link[base]{cumprod}}(), \code{\link[base]{cummin}}(), and \code{\link[base]{cummax}}(). } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{univar} matrixStats/man/rowRanges.Rd0000644000175100001440000000352213070644022015624 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowRanges.R \name{rowRanges} \alias{rowRanges} \alias{rowMins} \alias{rowMaxs} \alias{colRanges} \alias{colMins} \alias{colMaxs} \title{Gets the range of values in each row (column) of a matrix} \usage{ rowRanges(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) rowMins(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) rowMaxs(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) colRanges(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) colMins(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) colMaxs(x, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(x), ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s are excluded first, otherwise not.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} } \value{ \code{rowRanges()} (\code{colRanges()}) returns a \code{\link[base]{numeric}} Nx2 (Kx2) \code{\link[base]{matrix}}, where N (K) is the number of rows (columns) for which the ranges are calculated. \code{rowMins()/rowMaxs()} (\code{colMins()/colMaxs()}) returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Gets the range of values in each row (column) of a matrix. } \seealso{ \code{\link{rowOrderStats}}() and \code{\link[base]{pmin.int}}(). } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/indexByRow.Rd0000644000175100001440000000173413070644022015752 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/indexByRow.R \name{indexByRow} \alias{indexByRow} \title{Translates matrix indices by rows into indices by columns} \usage{ indexByRow(dim, idxs = NULL, ...) } \arguments{ \item{dim}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length two specifying the length of the "template" matrix.} \item{idxs}{A \code{\link[base]{vector}} of indices. If \code{\link[base]{NULL}}, all indices are returned.} \item{...}{Not use.} } \value{ Returns an \code{\link[base]{integer}} \code{\link[base]{vector}} of indices. } \description{ Translates matrix indices by rows into indices by columns. } \examples{ dim <- c(5, 4) X <- matrix(NA_integer_, nrow = dim[1], ncol = dim[2]) Y <- t(X) idxs <- seq_along(X) # Assign by columns X[idxs] <- idxs print(X) # Assign by rows Y[indexByRow(dim(Y), idxs)] <- idxs print(Y) stopifnot(X == t(Y)) } \author{ Henrik Bengtsson } \keyword{iteration} \keyword{logic} matrixStats/man/rowCounts.Rd0000644000175100001440000000471713070644022015667 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowCounts.R \name{rowCounts} \alias{rowCounts} \alias{colCounts} \alias{count} \title{Counts the number of TRUE values in each row (column) of a matrix} \usage{ rowCounts(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) colCounts(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) count(x, idxs = NULL, value = TRUE, na.rm = FALSE, ...) } \arguments{ \item{x}{An NxK \code{\link[base]{matrix}} or an N * K \code{\link[base]{vector}}.} \item{value}{A value to search for.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s are excluded first, otherwise not.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} \item{idxs, rows, cols}{A \code{\link[base]{vector}} indicating subset of elements (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} } \value{ \code{rowCounts()} (\code{colCounts()}) returns an \code{\link[base]{integer}} \code{\link[base]{vector}} of length N (K). } \description{ Counts the number of TRUE values in each row (column) of a matrix. } \details{ These functions takes either a matrix or a vector as input. If a vector, then argument \code{dim.} must be specified and fulfill \code{prod(dim.) == length(x)}. The result will be identical to the results obtained when passing \code{matrix(x, nrow = dim.[1L], ncol = dim.[2L])}, but avoids having to temporarily create/allocate a matrix, if only such is needed only for these calculations. } \examples{ x <- matrix(0:11, nrow = 4, ncol = 3) x[2:3, 2:3] <- 2:5 x[3, 3] <- NA_integer_ print(x) print(rowCounts(x, value = 2)) ## [1] 0 1 NA 0 print(colCounts(x, value = 2)) ## [1] 1 1 NA print(colCounts(x, value = NA_integer_)) ## [1] 0 0 1 print(rowCounts(x, value = 2, na.rm = TRUE)) ## [1] 0 1 1 0 print(colCounts(x, value = 2, na.rm = TRUE)) ## [1] 1 1 0 print(rowAnys(x, value = 2)) ## [1] FALSE TRUE TRUE FALSE print(rowAnys(x, value = NA_integer_)) ## [1] FALSE FALSE TRUE FALSE print(colAnys(x, value = 2)) ## [1] TRUE TRUE NA print(colAnys(x, value = 2, na.rm = TRUE)) ## [1] TRUE TRUE FALSE print(colAlls(x, value = 2)) ## [1] FALSE FALSE FALSE } \seealso{ rowAlls } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{logic} \keyword{univar} matrixStats/man/matrixStats-package.Rd0000644000175100001440000000167313073627126017607 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/999.package.R \docType{package} \name{matrixStats-package} \alias{matrixStats-package} \alias{matrixStats} \title{Package matrixStats} \description{ High-performing functions operating on rows and columns of matrices, e.g. col / rowMedians(), col / rowRanks(), and col / rowSds(). Functions optimized per data type and for subsetted calculations such that both memory usage and processing time is minimized. There are also optimized vector-based methods, e.g. binMeans(), madDiff() and weightedMedian(). } \section{How to cite this package}{ Henrik Bengtsson (2017). matrixStats: Functions that Apply to Rows and Columns of Matrices (and to Vectors). R package version 0.52.2. https://github.com/HenrikBengtsson/matrixStats } \author{ Henrik Bengtsson, Hector Corrada Bravo, Robert Gentleman, Ola Hossjer, Harris Jaffee, Dongcan Jiang, Peter Langfelder } \keyword{package} matrixStats/man/sum2.Rd0000644000175100001440000000567613070644022014557 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sum2.R \name{sum2} \alias{sum2} \alias{sumOver} \title{Fast sum over subset of vector elements} \usage{ sum2(x, idxs = NULL, na.rm = FALSE, mode = typeof(x), ...) sumOver(...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N.} \item{idxs}{A \code{\link[base]{vector}} indicating subset of elements to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values are skipped, otherwise not.} \item{mode}{A \code{\link[base]{character}} string specifying the data type of the return value. Default is to use the same mode as argument \code{x}.} \item{...}{Not used.} } \value{ Returns a scalar of the data type specified by argument \code{mode}. If \code{mode = "integer"}, then integer overflow occurs if the \emph{sum} is outside the range of defined integer values. Note that the intermediate sum (\code{sum(x[1:n])}) is internally represented as a floating point value and will therefor never be outside of the range. } \description{ Computes the sum of all or a subset of values. } \details{ \code{sum2(x, idxs)} gives equivalent results as \code{sum(x[idxs])}, but is faster and more memory efficient since it avoids the actual subsetting which requires copying of elements and garbage collection thereof. Furthermore, \code{sum2(x, mode = "double")} is equivalent to \code{sum(as.numeric(x))} and may therefore be used to avoid integer overflow, but at the same time is much more memory efficient that the regular \code{sum()} function when \code{x} is an \code{\link[base]{integer}} vector. } \examples{ x <- 1:10 n <- length(x) idxs <- seq(from = 1, to = n, by = 2) s1 <- sum(x[idxs]) # 25 s2 <- sum2(x, idxs = idxs) # 25 stopifnot(identical(s1, s2)) idxs <- seq(from = n, to = 1, by = -2) s1 <- sum(x[idxs]) # 25 s2 <- sum2(x, idxs = idxs) # 25 stopifnot(identical(s1, s2)) s1 <- sum(x) # 55 s2 <- sum2(x) # 55 stopifnot(identical(s1, s2)) # Total gives integer overflow x <- c(.Machine$integer.max, 1L, -.Machine$integer.max) s1 <- sum(x[1:2]) # NA_integer_ s2 <- sum2(x[1:2]) # NA_integer_ stopifnot(identical(s1, s2)) # Total gives integer overflow (coerce to numeric) s1 <- sum(as.numeric(x[1:2])) # 2147483648 s2 <- sum2(as.numeric(x[1:2])) # 2147483648 s3 <- sum2(x[1:2], mode = "double") # 2147483648 stopifnot(identical(s1, s2)) stopifnot(identical(s1, s3)) # Cumulative sum would give integer overflow but not the total s1 <- sum(x) # 1L s2 <- sum2(x) # 1L stopifnot(identical(s1, s2)) } \seealso{ \code{\link[base]{sum}}(). To efficiently average over a subset, see \code{\link{mean2}}(). } \author{ Henrik Bengtsson } \keyword{internal} \keyword{univar} matrixStats/man/weightedMad.Rd0000644000175100001440000000507513073232747016116 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/weightedMad.R \name{weightedMad} \alias{weightedMad} \alias{rowWeightedMads} \alias{colWeightedMads} \title{Weighted Median Absolute Deviation (MAD)} \usage{ weightedMad(x, w = NULL, idxs = NULL, na.rm = FALSE, constant = 1.4826, center = NULL, ...) rowWeightedMads(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, constant = 1.4826, center = NULL, ...) colWeightedMads(x, w = NULL, rows = NULL, cols = NULL, na.rm = FALSE, constant = 1.4826, center = NULL, ...) } \arguments{ \item{x}{a \code{\link[base]{numeric}} \code{\link[base]{vector}} containing the values whose weighted MAD is to be computed.} \item{w}{a vector of weights the same length as \code{x} giving the weights to use for each element of \code{x}. Negative weights are treated as zero weights. Default value is equal weight to all values.} \item{idxs, rows, cols}{A \code{\link[base]{vector}} indicating subset of elements (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{a logical value indicating whether \code{\link[base]{NA}} values in \code{x} should be stripped before the computation proceeds, or not. If \code{\link[base]{NA}}, no check at all for \code{\link[base]{NA}}s is done. Default value is \code{\link[base]{NA}} (for efficiency).} \item{constant}{A \code{\link[base]{numeric}} scale factor, cf. \code{\link[stats]{mad}}.} \item{center}{Optional \code{\link[base]{numeric}} scalar specifying the center location of the data. If \code{\link[base]{NULL}}, it is estimated from data.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} scalar. } \description{ Computes a weighted MAD of a numeric vector. } \section{Missing values}{ Missing values are dropped at the very beginning, if argument \code{na.rm} is \code{\link[base:logical]{TRUE}}, otherwise not. } \examples{ x <- 1:10 n <- length(x) m1 <- mad(x) m2 <- weightedMad(x) stopifnot(identical(m1, m2)) w <- rep(1, times = n) m1 <- weightedMad(x, w) stopifnot(identical(m1, m2)) # All weight on the first value w[1] <- Inf m <- weightedMad(x, w) stopifnot(m == 0) # All weight on the first two values w[1:2] <- Inf m1 <- mad(x[1:2]) m2 <- weightedMad(x, w) stopifnot(identical(m1, m2)) # All weights set to zero w <- rep(0, times = n) m <- weightedMad(x, w) stopifnot(is.na(m)) } \seealso{ For the non-weighted MAD, see \code{\link[stats]{mad}}. Internally \code{\link{weightedMedian}}() is used to calculate the weighted median. } \author{ Henrik Bengtsson } \keyword{robust} \keyword{univar} matrixStats/man/rowAlls.Rd0000644000175100001440000000542613070644022015305 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowAlls.R \name{rowAlls} \alias{rowAlls} \alias{colAlls} \alias{allValue} \alias{rowAnys} \alias{colAnys} \alias{anyValue} \title{Checks if a value exists / does not exist in each row (column) of a matrix} \usage{ rowAlls(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) colAlls(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) allValue(x, idxs = NULL, value = TRUE, na.rm = FALSE, ...) rowAnys(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) colAnys(x, rows = NULL, cols = NULL, value = TRUE, na.rm = FALSE, dim. = dim(x), ...) anyValue(x, idxs = NULL, value = TRUE, na.rm = FALSE, ...) } \arguments{ \item{x}{An NxK \code{\link[base]{matrix}} or an N * K \code{\link[base]{vector}}.} \item{value}{A value to search for.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, \code{\link[base]{NA}}s are excluded first, otherwise not.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} \item{idxs, rows, cols}{A \code{\link[base]{vector}} indicating subset of elements (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} } \value{ \code{rowAlls()} (\code{colAlls()}) returns an \code{\link[base]{logical}} \code{\link[base]{vector}} of length N (K). Analogously for \code{rowAnys()} (\code{rowAlls()}). } \description{ Checks if a value exists / does not exist in each row (column) of a matrix. } \details{ These functions takes either a matrix or a vector as input. If a vector, then argument \code{dim.} must be specified and fulfill \code{prod(dim.) == length(x)}. The result will be identical to the results obtained when passing \code{matrix(x, nrow = dim.[1L], ncol = dim.[2L])}, but avoids having to temporarily create/allocate a matrix, if only such is needed only for these calculations. } \section{Logical \code{value}}{ When \code{value} is logical, the result is as if the function is applied on \code{as.logical(x)}. More specifically, if \code{x} is numeric, then all zeros are treates as \code{FALSE}, non-zero values as \code{TRUE}, and all missing values as \code{NA}. } \examples{ x <- matrix(FALSE, nrow = 10, ncol = 5) x[3:7, c(2, 4)] <- TRUE x[2:4, ] <- TRUE x[, 1] <- TRUE x[5, ] <- FALSE x[, 5] <- FALSE print(x) print(rowCounts(x)) # 1 4 4 4 0 3 3 1 1 1 print(colCounts(x)) # 9 5 3 5 0 print(rowAnys(x)) print(which(rowAnys(x))) # 1 2 3 4 6 7 8 9 10 print(colAnys(x)) print(which(colAnys(x))) # 1 2 3 4 } \seealso{ rowCounts } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{logic} \keyword{univar} matrixStats/man/rowRanks.Rd0000644000175100001440000000603313070644022015463 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowRanks.R \name{rowRanks} \alias{rowRanks} \alias{colRanks} \title{Gets the rank of each row (column) of a matrix} \usage{ rowRanks(x, rows = NULL, cols = NULL, ties.method = c("max", "average", "min"), dim. = dim(x), ...) colRanks(x, rows = NULL, cols = NULL, ties.method = c("max", "average", "min"), dim. = dim(x), preserveShape = FALSE, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} or \code{\link[base]{integer}} NxK \code{\link[base]{matrix}}.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{ties.method}{A \code{\link[base]{character}} string specifying how ties are treated. For details, see below.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} \item{preserveShape}{A \code{\link[base]{logical}} specifying whether the \code{\link[base]{matrix}} returned should preserve the input shape of \code{x}, or not.} } \value{ An \code{\link[base]{integer}} \code{\link[base]{matrix}} is returned. The \code{rowRanks()} function always returns an NxK \code{\link[base]{matrix}}, where N (K) is the number of rows (columns) whose ranks are calculated. The \code{colRanks()} function returns an NxK \code{\link[base]{matrix}}, if \code{preserveShape = TRUE}, otherwise a KxN \code{\link[base]{matrix}}. %% The mode of the returned matrix is \code{\link[base]{integer}}, except for %% \code{ties.method == "average"} when it is \code{\link[base]{double}}. } \description{ Gets the rank of each row (column) of a matrix. } \details{ The row ranks of \code{x} are collected as \emph{rows} of the result matrix. The column ranks of \code{x} are collected as \emph{rows} if \code{preserveShape = FALSE}, otherwise as \emph{columns}. The implementation is optimized for both speed and memory. To avoid coercing to \code{\link[base]{double}}s (and hence memory allocation), there is a unique implementation for \code{\link[base]{integer}} matrices. It is more memory efficient to do \code{colRanks(x, preserveShape = TRUE)} than \code{t(colRanks(x, preserveShape = FALSE))}. Any \code{\link[base]{names}} of \code{x} are ignored and absent in the result. } \section{Missing and non- values}{ These are ranked as \code{NA}, as with \code{na.last = "keep"} in the \code{\link[base]{rank}}() function. } \seealso{ \code{\link[base]{rank}}(). For developers, see also Section 'Utility functions' in 'Writing R Extensions manual', particularly the native functions \code{R_qsort_I()} and \code{R_qsort_int_I()}. } \author{ Hector Corrada Bravo and Harris Jaffee. Peter Langfelder for adding 'ties.method' support. Henrik Bengtsson adapted the original native implementation of \code{rowRanks()} from Robert Gentleman's \code{rowQ()} in the \pkg{Biobase} package. } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/rowIQRs.Rd0000644000175100001440000000332213070644022015221 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowIQRs.R \name{rowIQRs} \alias{rowIQRs} \alias{colIQRs} \alias{iqr} \title{Estimates of the interquartile range for each row (column) in a matrix} \usage{ rowIQRs(x, rows = NULL, cols = NULL, na.rm = FALSE, ...) colIQRs(x, rows = NULL, cols = NULL, na.rm = FALSE, ...) iqr(x, idxs = NULL, na.rm = FALSE, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values are dropped first, otherwise not.} \item{...}{Additional arguments passed to \code{\link{rowQuantiles}}() (\code{colQuantiles()}).} \item{idxs, rows, cols}{A \code{\link[base]{vector}} indicating subset of elements (or rows and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Estimates of the interquartile range for each row (column) in a matrix. } \section{Missing values}{ Contrary to \code{\link[stats]{IQR}}, which gives an error if there are missing values and \code{na.rm = FALSE}, \code{iqr()} and its corresponding row and column-specific functions return \code{\link[base]{NA}}_real_. } \examples{ set.seed(1) x <- matrix(rnorm(50 * 40), nrow = 50, ncol = 40) str(x) # Row IQRs q <- rowIQRs(x) print(q) q0 <- apply(x, MARGIN = 1, FUN = IQR) stopifnot(all.equal(q0, q)) # Column IQRs q <- colIQRs(x) print(q) q0 <- apply(x, MARGIN = 2, FUN = IQR) stopifnot(all.equal(q0, q)) } \seealso{ See \code{\link[stats]{IQR}}. See \code{\link{rowSds}}(). } \author{ Henrik Bengtsson } \keyword{array} \keyword{iteration} \keyword{robust} \keyword{univar} matrixStats/man/rowLogSumExps.Rd0000644000175100001440000000273213070644022016455 0ustar hornikusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rowLogSumExps.R \name{rowLogSumExps} \alias{rowLogSumExps} \alias{colLogSumExps} \title{Accurately computes the logarithm of the sum of exponentials across rows or columns} \usage{ rowLogSumExps(lx, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(lx), ...) colLogSumExps(lx, rows = NULL, cols = NULL, na.rm = FALSE, dim. = dim(lx), ...) } \arguments{ \item{lx}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. Typically \code{lx} are \eqn{log(x)} values.} \item{rows, cols}{A \code{\link[base]{vector}} indicating subset of rows (and/or columns) to operate over. If \code{\link[base]{NULL}}, no subsetting is done.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, any missing values are ignored, otherwise not.} \item{dim.}{An \code{\link[base]{integer}} \code{\link[base]{vector}} of length two specifying the dimension of \code{x}, also when not a \code{\link[base]{matrix}}.} \item{...}{Not used.} } \value{ A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N (K). } \description{ Accurately computes the logarithm of the sum of exponentials across rows or columns. } \section{Benchmarking}{ These methods are implemented in native code and have been optimized for speed and memory. } \seealso{ To calculate the same on vectors, \code{\link{logSumExp}}(). } \author{ Native implementation by Henrik Bengtsson. Original R code by Nakayama ??? (Japan). } \keyword{array}