Turn a vector to a symmetric matrix (row-wise) vec2symmat <- function(x) { mat.dim <- (sqrt(1 + 8*length(x)) - 1)/2 if(mat.dim != round(mat.dim)) stop("The vector length does not match with a square matrix dimension.") output <- matrix(0, nrow= mat.dim, ncol=mat.dim) rownum <- colnum <- c() for(i in 1:mat.dim) { rownum <- c(rownum, rep(i, i)) colnum <- c(colnum, 1:i) } x <- data.frame(row=rownum, col=colnum, val=x) output[as.matrix(x[,c("row", "col")])] <- x$val output <- output + t(output) diag(output) <- diag(output)/2 return(output) } vec2symmat(1:6) [,1] [,2] [,3] [1,] 1 2 4 [2,] 2 3 5 [3,] 4 5 6