Функция умножить каждую матрицу на каждый вектор? - PullRequest
0 голосов
/ 25 апреля 2018

Я реализую методику, согласно которой я беру две матрицы (M1 и M2) и умножаю их каждую на один и тот же вектор «шампуров» (B), получая векторы результатов R1 и R2, а затем беру корреляцию этих векторов, как:

P1 <- data.frame(split(rnorm(5*16, 1, 1), 1:16))
M1 <- matrix(unlist(P1[1,]), nrow = 4)
M1[upper.tri(M1)] <- t(M1)[upper.tri(M1)]

P2 <- data.frame(split(rnorm(5*16, 1, 1), 1:16))
M2 <- matrix(unlist(P2[1,]), nrow = 4)
M2[upper.tri(M2)] <- t(M2)[upper.tri(M2)]

B <- rnorm(4, 0, 1)

R1 <- M1 %*% B
R2 <- M2 %*% B
cor(R1, R2)

Однако мне нужно расширить это двумя способами: i ) Мне нужно сделать это для n (4000, но здесь показано для 2) векторов B, которых я достиг, используя функцию, как показано ниже, и ii ) , выполняя это для каждой итерации апостериорного распределения матриц (1000, используя 5 здесь впример), которого я добился с помощью цикла for внутри функции.Это возвращает фрейм данных с одной строкой на итерацию и 1 столбцом на вертел, а каждая ячейка дает корреляцию векторов ответа.Хотя это работает, цикл for работает медленно -

com_rsk_p2 <- function(m1, m2, n = 2){
  nitt <- length(m1[,1])
  k <- sqrt(length(m1))
  B <- split(rnorm(n*k, 0, 1), 1:n)

  rv_cor <- split(rep(NA, times = n*nitt), 1:nitt)

  for(i in 1:nitt){
    R1 <- sapply(B, function(x) x %*% matrix(unlist(m1[i,]), ncol = k))
    R2 <- sapply(B, function(x) x %*% matrix(unlist(m2[i,]), ncol = k))

    rv_cor[[i]] <- diag(matrix(mapply(cor, list(R1), list(R2)), ncol = n))
  }

  return(t(data.frame(rv_cor)))
}

Я работал над этим в течение нескольких дней, но вкратце - возможно ли использовать не-цикл /применить подход, чтобы каждая итерация M1 и M2 умножалась на каждый вертел, сохраняя результирующие векторные корреляции для каждого случая? Я уверен, что должен быть какой-то трюк, который мне не хватает!

> out <- com_rsk_p2(P1, P2) 
> out
         [,1]       [,2]
X1  0.7622732  0.8156658
X2  0.4414054  0.4266134
X3  0.4388098 -0.1248999
X4  0.5438046  0.7723585
X5 -0.5833943 -0.5294521

В идеале я бы хотел, чтобы объекты R1 и R2 оставались внутри функции, потому что я буду использовать их для некоторых других вещей позже, когда добавлю к этой функции (вычисление углов между векторами и т. Д.).


Обновлено 26/04/2018 Я создал список матриц и матрицы векторов B, и я могу умножить одну матрицу на каждый вектор B, как показано ниже -ключ, который я ищу, - это расширить его до эффективного подхода, который умножает каждую матрицу в списке на каждый вектор B:

P1 <- data.frame(split(round(rnorm(5*16, 1, 1),2), 1:16))
P2 <- data.frame(split(round(rnorm(5*16, 1, 1),2), 1:16))

nitt <- length(P1[,1])
k <- sqrt(length(P1))

M1L <- list(rep(NA, times = nitt))
M2L <- list(rep(NA, times = nitt))

for(i in 1:nitt){
    M <- matrix(P1[i,], byrow = T, ncol = k)
    M[lower.tri(M)] <- t(M)[lower.tri(M)]
    M1L[[i]] <- M
    M <- matrix(P2[i,], byrow = T, ncol = k)
    M[lower.tri(M)] <- t(M)[lower.tri(M)]
    M2L[[i]] <- M
}

B <- matrix(round(rnorm(2*4, 0, 1),2), ncol = 2)
matrix(unlist(M2L[[1]]), ncol = 4) %*% B

> matrix(unlist(M2L[[1]]), ncol = 4) %*% B
        [,1]    [,2]
[1,]  0.1620 -0.3203
[2,]  0.6027  0.8148
[3,]  0.9763 -1.3177
[4,] -0.5369  0.5605
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...