2

我有一个给定矩阵的列之间所有可能组合的列表。我想计算每个组合的 cov,最后计算每个协方差矩阵的行列式。

问题是我需要在计算行列式之前计算一个平方矩阵,我尝试将 do.call 与 cbind 和 sapply 一起使用,但不起作用:

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)
4

1 回答 1

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

它们都应该给出相同的结果,但顶部的结果会明显更快,打字更少。

于 2013-02-02T11:41:10.737 回答