From ce53f1f45d32a68656d1cab94726dbea3dfa9aa3 Mon Sep 17 00:00:00 2001 From: Waldir Leoncio Date: Fri, 23 Dec 2022 13:11:55 +0100 Subject: [PATCH] Translated ind2subv() (#3) --- R/ind2subv.R | 67 ++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/R/ind2subv.R b/R/ind2subv.R index 6fef574..92b4943 100644 --- a/R/ind2subv.R +++ b/R/ind2subv.R @@ -1,38 +1,37 @@ -ind2subv <- function(siz, ndx) stop("Needs translation") -# function sub = ind2subv(siz, ndx) -# % IND2SUBV Like the built-in ind2sub, but returns the answer as a row vector. -# % sub = ind2subv(siz, ndx) -# % -# % siz and ndx can be row or column vectors. -# % sub will be of size length(ndx) * length(siz). -# % -# % Example -# % ind2subv([2 2 2], 1:8) returns -# % [1 1 1 -# % 2 1 1 -# % ... -# % 2 2 2] -# % That is, the leftmost digit toggle fastest. -# % -# % See also SUBV2IND +ind2subv <- function(siz, ndx) { + # IND2SUBV Like the built - in ind2sub, but returns the answer as a row vector. + # sub <- ind2subv(siz, ndx) + # siz and ndx can be row or column vectors. + # sub will be of size length(ndx) * length(siz). + # Example + # ind2subv([2 2 2], 1:8) returns + # [1 1 1 + # 2 1 1 + # ... + # 2 2 2] + # That is, the leftmost digit toggle fastest. + # + # See also SUBV2IND -# n = length(siz); + n <- length(siz) -# if n==0 -# sub = ndx; -# return; -# end + if (n == 0) { + sub <- ndx + return(sub) + } -# if all(siz==2) -# sub = dec2bitv(ndx-1, n); -# sub = sub(:,n:-1:1)+1; -# return; -# end + if (all(siz == 2)) { + sub <- dec2bitv(ndx - 1, n) + sub <- sub[, seq(n, 1, - 1)] + 1 + return(sub) + } -# cp = [1 cumprod(siz(:)')]; -# ndx = ndx(:) - 1; -# sub = zeros(length(ndx), n); -# for i = n:-1:1 % i'th digit -# sub(:,i) = floor(ndx/cp(i))+1; -# ndx = rem(ndx,cp(i)); -# end + cp <- c(1, cumprod(t(siz[]))) + ndx <- ndx[] - 1 + sub <- zeros(length(ndx), n) + for (i in seq(n, 1, -1)) {# i'th digit + sub[, i] <- floor(ndx / cp[i]) + 1 + ndx <- ndx %% cp(i) + } + return(sub) +}