我列出了给定矩阵的列之间所有可能的组合。我想计算每个组合的cov,最后计算每个协方差矩阵的行列式。
问题是我需要在计算行列式之前计算平方矩阵,我试图将c.cind和sapply一起使用do.call但不起作用:
matrices.sq=do.call("cbind",lapply(list.of.matrices,get))
代码如下:
myarray=matrix(rexp(200),50,5)
list.of.matrices <- apply(expand.grid(rep(list(c(FALSE, TRUE)), ncol(myarray))),
1, function(j)myarray[, j, drop = FALSE])
list.of.cov.matrices=sapply(list.of.matrices, cov)
list.of.cov.matrices.2=list.of.cov.matrices[-(1:ncol(myarray))] #so get those with more than one column
list.of.det<- sapply(list.of.cov.matrices.2, det)
答案 0 :(得分:1)
我认为你不需要存储所有这些矩阵。首先,计算您的协方差矩阵,然后使用相同的apply
调用来创建子矩阵,而不是存储它们只计算它们的行列式:
cov.mat <- cov(myarray)
# is a 5-by-5 matrix
dets <- apply(expand.grid(rep(list(c(FALSE, TRUE)), ncol(cov.mat))),
1, function(j) det(cov.mat[j, j, drop = FALSE]))
# is a vector of length 32
但如果你真的必须这么做:
list.of.cov.mat <- apply(expand.grid(rep(list(c(FALSE, TRUE)), ncol(cov.mat))),
1, function(j) cov.mat[j, j, drop = FALSE])
# is a list of 32 covariance matrices
dets <- sapply(list.of.cov.mat, det)
# is a vector of length 32
或超长路:
list.of.mat <- apply(expand.grid(rep(list(c(FALSE, TRUE)), ncol(cov.mat))),
1, function(j) myarray[, j, drop = FALSE])
# is a list of 32 matrices
list.of.cov.mat <- lapply(list.of.mat, cov)
# is a list of 32 covariance matrices
dets <- sapply(list.of.cov.mat, det)
# is a vector of length 32
他们都应该给出相同的结果,但顶部的那个会明显更快,更少打字。