У меня есть набор данных с очень большими матрицами и векторами. Я хотел бы умножить матрицу на вектор, который имеет один элемент «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
Есть ли хорошая строка кода, которая делает это более эффективно, чем то, что я сделал здесь?