在C中做c.cind和sapply

时间:2013-02-02 11:12:32

标签: r

我列出了给定矩阵的列之间所有可能的组合。我想计算每个组合的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)

1 个答案:

答案 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

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