Q:

The smartest way to convert a half vectorization to full matrix back

I've a question regarding to the question mentioned above. I've a large data set. Each row corresponds to one day and the matrix is recorded in a vech form, i.e., by vectorizing the unique upper triangle of the matrix and transposing it into a row vector.
I want to transform the whole data set back into the full matrices of each day (observation). A short reproducible example is below:
structure(list(X01 = c(5.89378246085557, 5.75461814891448, 8.01511372310818
), X02 = c(2.04749233527123, 1.79201580489132, 4.13243690125304
), X03 = c(6.84437620663595, 7.76572007184568, 9.21387189085179
), X04 = c(1.48894672990183, 1.412996838366, 2.60650888282447
), X05 = c(0.951513482112949, 1.37836898031636, 2.74942660284063
), X06 = c(2.68732004256996, 2.70518391829012, 4.74436162847904
), X07 = c(2.15270455626705, 2.47115157067303, 3.92259973345368
), X08 = c(2.12319802206402, 3.08674733009856, 3.91968874234002
), X09 = c(1.92541015217767, 2.62688861593519, 2.84482322630633
), X10 = c(10.2251876218029, 9.5296229460776, 8.46917045978735
), X11 = c(1.23017267644711, 1.1675692778204, 1.93502656632884
), X12 = c(1.24956978625185, 1.78431799528065, 2.81675019026563
), X13 = c(1.07497786235713, 0.422607699395901, 1.51342480871545
), X14 = c(1.36996532434845, 1.85499779637815, 1.49126581139642
), X15 = c(6.33847251476969, 4.54434019245843, 7.27901008329251
), X16 = c(2.08364028735932, 1.74263661965122, 2.25975717022752
), X17 = c(1.24649025820314, 1.95698292727337, 3.12139710484827
), X18 = c(0.647824716200822, 0.805958808007548, 2.33918923838555
), X19 = c(2.05060707165895, 2.06986549088027, 1.99435629106657
), X20 = c(0.655024785094781, 1.22421902352593, 0.811896637188255
), X21 = c(4.20465438339735, 3.4827652599631, 7.63429180588341
)), row.names = c(NA, 3L), class = "data.frame")

the example contains the first the rows, so three Matrices should be the expected output

A:

I would create sparse matrices, but they are easy to coerce to dense matrices using as.matrix. Of course, it would be rather trivial to directly create dense matrices instead.
library(Matrix)

fun <- function(x) {
  n <- 0.5 + sqrt(0.25 + 2 * length(x)) #calculate dimension
  i <- sequence(seq_len(n - 1)) #row indices
  j <- rep(seq_len(n - 1), seq_len(n - 1)) + 1 # column indices
  sparseMatrix(i = i, j = j, x = x, triangular = TRUE, dims = c(n, n))
}

matlist <- apply(DF, 1, fun)

#check result
m <- as.matrix(matlist[[1]])
#     [,1]     [,2]     [,3]      [,4]      [,5]     [,6]      [,7]
#[1,]    0 5.893782 2.047492 1.4889467  2.152705 1.230173 2.0836403
#[2,]    0 0.000000 6.844376 0.9515135  2.123198 1.249570 1.2464903
#[3,]    0 0.000000 0.000000 2.6873200  1.925410 1.074978 0.6478247
#[4,]    0 0.000000 0.000000 0.0000000 10.225188 1.369965 2.0506071
#[5,]    0 0.000000 0.000000 0.0000000  0.000000 6.338473 0.6550248
#[6,]    0 0.000000 0.000000 0.0000000  0.000000 0.000000 4.2046544
#[7,]    0 0.000000 0.000000 0.0000000  0.000000 0.000000 0.0000000
all(m[upper.tri(m)] == unlist(DF[1,]))
#[1] TRUE

