将一个矩阵的特定列与另一个矩阵的特定列相乘以用于许多索引

时间:2017-09-28 12:33:39

标签: r matrix

我有两个大矩阵P和Q(两者都是10k x 50k dim,但为了自己测试一个随机的10x10矩阵,P和Q就足够了)。我有一个索引列表,例如

i    j
1    4
1    625
1    9207
2    827
...  ...

等。这意味着我需要找到Q中P列和第4列的第1列的点积,然后是P中的第1列和Q中的第6列,依此类推。我可以通过for循环轻松解决这个问题,但我知道他们在R中效率不高。任何想法都有吗?

编辑:要求提供可重复的示例

P <- matrix(c(1,0,1,0,0,1,0,1,0), nrow = 3, ncol = 3) 
Q <- matrix(c(0,0,1,0,1,0,1,0,1), nrow = 3, ncol = 3) 
i <- c(1,1,2) 
j <- c(2,1,3)

给出输出(如果是点积形式)

1: 0
2: 1
3: 1

2 个答案:

答案 0 :(得分:3)

P <- matrix(1:50, nrow = 5,ncol = 10) 
Q <- matrix(1:50, nrow = 5, ncol = 10) 
i <- c(1,2,4,7) 
j <- c(5,3,7,2)
P
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    6   11   16   21   26   31   36   41    46
# [2,]    2    7   12   17   22   27   32   37   42    47
# [3,]    3    8   13   18   23   28   33   38   43    48
# [4,]    4    9   14   19   24   29   34   39   44    49
# [5,]    5   10   15   20   25   30   35   40   45    50
Q
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    6   11   16   21   26   31   36   41    46
# [2,]    2    7   12   17   22   27   32   37   42    47
# [3,]    3    8   13   18   23   28   33   38   43    48
# [4,]    4    9   14   19   24   29   34   39   44    49
# [5,]    5   10   15   20   25   30   35   40   45    50
P[,i] * Q[, j]
#      [,1] [,2] [,3] [,4]
# [1,]   21   66  496  186
# [2,]   44   84  544  224
# [3,]   69  104  594  264
# [4,]   96  126  646  306
# [5,]  125  150  700  350

答案 1 :(得分:2)

使用矩阵乘法,你可以做

diag(t(P[, i]) %*% Q[, j])
[1] 0 1 1

以下是apply的第二个解决方案。

apply(cbind(i, j), 1, function(x) t(P[, x[1]]) %*% Q[, x[2]])
[1] 0 1 1

在第二个例子中验证这些是否同意:

set.seed(1234)
A <- matrix(sample(0:10, 100, replace=TRUE), 10, 10)
B <- matrix(sample(0:10, 100, replace=TRUE), 10, 10)

inds <- matrix(sample(10, 10, replace=TRUE), 5)

矩阵乘法

diag(t(A[, inds[,1]]) %*% B[, inds[,2]])
[1] 215 260 306 237 317

apply

apply(inds, 1, function(x) t(A[, x[1]]) %*% B[, x[2]])
[1] 215 260 306 237 317