1. SVDsums <- function(a) { svdout <- svd(a) u <- svdout$u d <- svdout$d v <- svdout$v outlist <- list() matsum <- 0 * a for (i in 1:min(dim(a))) { term <- d[i] * u[,i] %*% t(v[,i]) matsum <- matsum + term outlist[[i]] <- matsum } outlist } set.seed(9999) m <- matrix(sample(1:25,12),nrow=3) SVDsums(m)[[2]] 2. The rank of a matrix product is less than or equal to the minimum of the ranks of the factors. Here the two factors are each of rank 1. (It is conceivable that the product is the 0 matrix, though, with rank 0.) 3. set.seed(9999) m <- matrix(sample(1:25,12),nrow=3) m1 <- m m1[3,1] <- NA siout <- softImpute(m1) aApprox <- siout$u %*% diag(siout$d) %*% t(siout$v) err <- m - aApprox print(sqrt(sum(err^2)))