[Rd] Subsetting "dspMatrix" without coercion to "matrix"

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Sun Nov 21 22:43:02 CET 2021


>>>>> Mikael Jagan 
>>>>>     on Wed, 17 Nov 2021 17:01:00 -0500 writes:

    >> This seems entirely avoidable, given that there is a relatively simple 
    >> formula for converting 2-ary indices [i,j] of S to 1-ary indices k of 
    >> S[lower.tri(S, TRUE)]:
    >> 
    >> k <- i + round(0.5 * (2L * n - j) * (j - 1L)) # for i >= j

    > I ought to be slightly more precise here: _coercion_ is avoidable, 
    > because we can always map [i,j] to [k], but memory limits are not. 
    > Certainly S using x[k] cannot be arbitrarily long...

    > At the very least, it would be convenient if the subset were performed 
    > efficiently whenever dimensions would be dropped anyway:

    > * S[i, ] and S[, j] where i and j are vectors indexing exactly zero or 
    > one rows/columns
    > * S[i] where i is a matrix of the form cbind(i, j)


I agree that this could be improved in the Matrix package;
One reason this never happened is probably that we (the Matrix
package authors) never had a relevant use case for speeding
these up.

Would you be interested in collaboration to improve the Matrix
package to achieve this?

Best regards,
Martin

    > This would support, e.g., a memory-efficient 'apply' analogue without 
    > any need for MARGIN...

    > applySymmetric <- function(X, FUN, ..., simplify = TRUE, check = TRUE) {
    >   if (check && !isSymmetric(X)) {
    >     stop("'X' is not a symmetric matrix.")
    >   }
    >   ## preprocessing
    >   ans <- vector("list", n)
    >   for (i in seq_len(n)) {
    >     ans[[i]] <- forceAndCall(1L, FUN, S[i, ], ...)
    >   }
    >   ## postprocessing
    >   ans
    > }

    > ______________________________________________
    > R-devel using r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list