我有一个包含非常大的矩阵和向量的数据集。我想将矩阵乘以一个向量,该向量具有一个“ 1”元素,其余为零。我想循环此计算,以使向量中每个可能的1和0组合都与矩阵相乘,并将结果存储在向量中。
我举一个我想做的事的例子。
我有两个矩阵a
和b
:
a <- matrix(1:16, nrow = 4, byrow = TRUE)
b <- matrix(17:32, nrow = 4, byrow = TRUE)
以及带有1和0的向量。因为我还不知道如何循环好,所以我写下每种组合的代码:
c1 <- rep(0, times = 4)
c1[1] <- 1
c2 <- rep(0, times = 4)
c2[2] <- 1
c3 <- rep(0, times = 4)
c3[3] <- 1
c4 <- rep(0, times = 4)
c4[4] <- 1
我将a
与每个向量组合c
相乘,将其对角线化,再与b
相乘,然后对每一行和每一列求和。然后将结果存储在向量results
中:
d1 <- sum(colSums(b %*% diag(as.vector(a %*% c1), nrow = 4)))
d2 <- sum(colSums(b %*% diag(as.vector(a %*% c2), nrow = 4)))
d3 <- sum(colSums(b %*% diag(as.vector(a %*% c3), nrow = 4)))
d4 <- sum(colSums(b %*% diag(as.vector(a %*% c4), nrow = 4)))
results <- cbind(d1, d2, d3, d4)
给出:
d1 d2 d3 d4
[1,] 2824 3216 3608 4000
有没有比我在这里更有效的代码行?
答案 0 :(得分:1)
由于计算的特殊结构,您可以将其缩短为
a <- matrix(1:16, nrow = 4, byrow = TRUE)
b <- matrix(17:32, nrow = 4, byrow = TRUE)
results <- apply(a, 2, function(ai) sum(b %*% ai))
# [1] 2824 3216 3608 4000
或更短
colSums(b %*% a)
# [1] 2824 3216 3608 4000