R/tLUdct.R

tLUdct <- function (tnsr)
{
  if (tnsr@num_modes != 3)
    stop("T-SVD only implemented for 3d so far")
  modes <- tnsr@modes
  n1 <- modes[1]
  n2 <- modes[2]
  n3 <- modes[3]
  if (n1 !=n2)
    stop("LU decomposition only works on tensors with square lateral faces")
  dctz <- aperm(apply(tnsr@data, MARGIN = 1:2, dct), c(2,3,1))
  L_arr <- array(0, dim = c(n1, n2, n3))
  U_arr <- array(0, dim = c(n1, n2, n3))
  for (j in 1:n3) {
    decomp <- lu.decomposition(dctz[, , j])
    L_arr[, , j] <- decomp$L
    U_arr[, , j] <- decomp$U
  }
  L <- as.tensor(aperm(apply(L_arr, MARGIN = 1:2, idct), c(2,3,1)))
  U <- as.tensor(aperm(apply(U_arr, MARGIN = 1:2, idct), c(2,3,1)))
  invisible(list(L = L, U = U))
}

Try the rTensor2 package in your browser

Any scripts or data that you put into this service are public.

rTensor2 documentation built on Aug. 14, 2022, 9:05 a.m.