将R中的两组向量相乘

将R中的两组向量相乘,r,matrix,R,Matrix,假设我有两个矩阵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

假设我有两个矩阵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

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

首先让我们制作一些实际数据,我们可以实际使用:

> 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-我们可以从
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和B来匹配您的V编号的,这样您就可以看到,在您有V6*V8的地方,我有6*8]

您可以使用
应用

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
  • 在A和B中生成列名向量

    Acol <- grep("A", names(data.frame(A)), value = T) 
    Bcol <- grep("B", names(data.frame(B)), value = T) 
    

    Acol
    A给你一个2x2矩阵!多谢你指出。现在就喝早茶。
    cbind(A[,1]*B,A[,2]*B)
    ?您认为您需要多大程度的咖啡?不止一个矩阵?每个矩阵的列数不同?这是一个普遍现象,它适用于任意列数的两个矩阵。斯文的解决方案对我来说似乎是正确的。
    R <- as.data.frame(R)
    
    Acol <- grep("A", names(data.frame(A)), value = T) 
    Bcol <- grep("B", names(data.frame(B)), value = T) 
    
    colnames(R) <- outer(Acol, Bcol, paste, sep = ".")
    
    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