循环矩阵-向量乘法,其元素随每个循环而变化

时间:2018-09-05 12:45:02

标签: r

我有一个包含非常大的矩阵和向量的数据集。我想将矩阵乘以一个向量,该向量具有一个“ 1”元素,其余为零。我想循环此计算,以使向量中每个可能的1和0组合都与矩阵相乘,并将结果存储在向量中。

我举一个我想做的事的例子。

我有两个矩阵ab

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

有没有比我在这里更有效的代码行?

1 个答案:

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