在R中计算两组向量的乘积

3
假设我有两个矩阵A和B:
 A:      A1    A2        B:      B1   B2
   ROW1  V1    V2          ROW1  V3   V4
   ROW2  V5    V6          ROW2  V7   V8

我希望得到一个结果矩阵R,其中包含两个矩阵每一列的乘积,如下所示:
 R:      A1_B1  A1_B2  A2_B1  A2_B2
   ROW1  V1*V3  V1*V4  V2*V3  V2*V4
   ROW2  V5*V7  V5*V8  V6*V7  V6*V8

一个循环结构可以实现,但我想知道是否有更好的选项可用。

2
那会给你一个2x2的矩阵! - Spacedman
谢谢你指出来。现在是早上喝咖啡的时候了。 - Roman Luštrik
cbind(A[,1]*B, A[,2]*B)? - Nishanth
你认为你需要多么通用?需要处理多个矩阵吗?这些矩阵的列数是否不同? - Spacedman
这适用于具有任意列数的两个矩阵的一般情况。Sven的解决方案似乎对我的目的是正确的。 - Antti
3个回答

5
您可以使用apply
A <- matrix(1:4,2,2)
#     [,1] [,2]
# [1,]    1    3
# [2,]    2    4
B <- A * 10
#      [,1] [,2]
# [1,]   10   30
# [2,]   20   40

matrix(apply(A, 2, "*", B), nrow = nrow(A))
#      [,1] [,2] [,3] [,4]
# [1,]   10   30   30   90
# [2,]   40   80   80  160

Antti的补充:

这个非常好用。最终,我需要用它来操作一个data.frame。为了给那个data.frame应用有意义的列名,我做了以下操作:

  1. make that matrix a data.frame:

    R <- as.data.frame(R)
    
  2. make vectors of column names in A and B

    Acol <- grep("A", names(data.frame(A)), value = T) 
    Bcol <- grep("B", names(data.frame(B)), value = T) 
    
  3. Then rename the columns of R:

    colnames(R) <- outer(Acol, Bcol, paste, sep = ".")
    

0

首先,让我们创建一些真实的数据,以便我们可以实际操作:

> A=matrix(c(1,5,2,6),2,2)
> B=matrix(c(3,7,4,8),2,2)
> A
     [,1] [,2]
[1,]    1    2
[2,]    5    6
> B
     [,1] [,2]
[1,]    3    4
[2,]    7    8

现在的问题就是简单地将A和B的右列组合相乘。这些组合分别是A1、A1、A2、A2与B1、B2、B1、B2 - 我们可以从expand.grid中获取这些组合:
> cols = as.matrix(expand.grid(1:2,1:2))
> cols
     Var1 Var2
[1,]    1    1
[2,]    2    1
[3,]    1    2
[4,]    2    2

然后我们将其列作为A和B的列(顺序相反):

> A[,cols[,2]] * B[,cols[,1]]
     [,1] [,2] [,3] [,4]
[1,]    3    4    6    8
[2,]   35   40   42   48

证毕

[请注意我如何仔细构建A和B以匹配您的V数字,这样您就可以看到在您有V6*V8的地方,我有6*8]


0
A <- matrix(1:4,2,2)
B <- A * 10

cbind(A[,1]*B, A[,2]*B)

     [,1] [,2] [,3] [,4]
[1,]   10   30   30   90
[2,]   40   80   80  160

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接