每个向量对多个矩阵的函数?

时间:2018-04-25 18:03:38

标签: r function loops apply

我正在实施一种技术,我将两个矩阵(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循环实现了这一点。这将返回一个数据帧,每次迭代一行,每个串一列,每个单元格给出响应向量的相关性。虽然这有效,但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

理想情况下,我希望对象R1R2保留在函数中,因为稍后当我添加到此函数时,我会将这些用于其他一些事情(计算向量之间的角度等) )。

更新时间26/04/2018 我已经创建了一个矩阵列表和B个向量的矩阵,我可以用B的每个向量乘以单个矩阵,如下所示 - 关键字I我正在寻找的是将其扩展为一种有效的方法,它将列表中的每个矩阵乘以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

0 个答案:

没有答案