首页 > 解决方案 > 循环矩阵 - 向量乘法,其元素随每个循环而变化

问题描述

我有一个包含非常大的矩阵和向量的数据集。我想将一个矩阵与一个向量相乘,该向量具有一个“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

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

标签: r

解决方案


由于计算的特殊结构,您可以将其缩短为

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

推荐阅读