Циклическая матрица - векторное умножение, элементы которого меняются с каждым циклом - PullRequest
0 голосов
/ 05 сентября 2018

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

Есть ли хорошая строка кода, которая делает это более эффективно, чем то, что я сделал здесь?

1 Ответ

0 голосов
/ 05 сентября 2018

Из-за особой структуры вашего расчета вы можете сократить его до

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...