>>>>> 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@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
> }
> ______________________________________________
> [email protected] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel