【问题标题】:Column Wise [R] Matrix MultiplicationColumn Wise [R] 矩阵乘法
【发布时间】:2015-11-11 18:57:02
【问题描述】:

注意:我指的不是here 中的矩阵乘法 - 即使是在另一篇文章中讨论的转置的扭曲。


我有这两个矩阵...

矩阵A

A <- matrix(c(1,1,1,-1,1,1,1,-1,1,-1,-1,1), ncol=4)
       [,1]    [,2]     [,3]     [,4]  
[1,]    1       -1        1        -1       
[2,]    1        1       -1        -1     
[3,]    1        1        1         1     

...和矩阵B

B <- matrix(c(1,2,3,2,1,3,2,3,1), ncol=3)
       [,1]    [,2]     [,3] 
[1,]    1        2        2 
[2,]    2        1        3 
[3,]    3        3        1 

我想得到 [R] 代码:

       [,1]    [,2]    [,3] 
[1,]    1*1     1*2     1*2 
[2,]    1*2     1*1     1*3
[3,]    1*3     1*3     1*1 

       [,1]    [,2]    [,3] 
[1,]   -1*1    -1*2    -1*2 
[2,]    1*2     1*1     1*3
[3,]    1*3     1*3     1*1 

       [,1]    [,2]    [,3] 
[1,]    1*1     1*2     1*2 
[2,]   -1*2    -1*1    -1*3
[3,]    1*3     1*3     1*1 

       [,1]    [,2]    [,3] 
[1,]   -1*1    -1*2    -1*2 
[2,]   -1*2    -1*1    -1*3
[3,]    1*3     1*3     1*1 

这不是线性代数乘法,因为在乘法的末尾没有和。它不是克罗内克产品。我曾尝试使用apply(A, 2, function(x) A * B,但它不起作用,因为虽然我可以指定我想要A 的列一次一个,但我不知道如何对B 的列执行相同操作.

我没有设置任何特定类型的对象(列表、矩阵、数组)作为输出。

问题是:如何将这两个矩阵按元素和按列相乘以得到另一个矩阵或“列表”对象或数组?

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    您可以尝试以下方法:

    > lapply(as.data.frame(A), `*`, B)
    $V1
         [,1] [,2] [,3]
    [1,]    1    2    2
    [2,]    2    1    3
    [3,]    3    3    1
    
    $V2
         [,1] [,2] [,3]
    [1,]   -1   -2   -2
    [2,]    2    1    3
    [3,]    3    3    1
    
    $V3
         [,1] [,2] [,3]
    [1,]    1    2    2
    [2,]   -2   -1   -3
    [3,]    3    3    1
    
    $V4
         [,1] [,2] [,3]
    [1,]   -1   -2   -2
    [2,]   -2   -1   -3
    [3,]    3    3    1
    

    关于您在下面的 cmets 中的后续问题,如果您的最终目标是每个子矩阵的列总和,您可以通过以下方式实现:

    > lapply(as.data.frame(A), function(x) colSums(x * B))
    $V1
    [1] 6 6 6
    
    $V2
    [1] 4 2 2
    
    $V3
    [1] 2 4 0
    
    $V4
    [1]  0  0 -4
    

    【讨论】:

    • 这是我需要的。谢谢你。我现在有没有机会打扰您在 R 中使用命令分别添加此列表的所有列 (?) 或您在答案中显示的对象?
    • @AntoniParellada,“单独添加”是什么意思?你追求的最终结果是什么?
    • 6 6 6 // 4 2 2 // 2 4 0 // 0 0 -4
    • @AntoniParellada,我已经更新了我的答案。使用 MrFlick 的方法,您可以做到apply(array(apply(A, 2, `*`, B), c(3,3,4)), 3, colSums)
    • @AntoniParellada,当您执行apply(A, 2, `*`, B) 时,您会得到一个 9x4 矩阵。 array(..., c(3, 3, 4)) 表示将该 9x4 矩阵转换为由 4 个第三维元素组成的数组,每个元素包含一个 3x3 矩阵。带有反引号的* 操作数只是乘法,但以这种方式使用时需要引用。否则,您将使用匿名函数,就像 MrFlick 在他的回答中所做的那样。
    【解决方案2】:

    不确定最后是要数组还是列表。如果是数组,您可以使用apply 进行一些整形

    array(apply(A, 2, function(x) x*B), c(3,3,4))
    # OR array(apply(A, 2, `*`, B), c(3,3,4))
    

    【讨论】:

      【解决方案3】:
      A <- matrix(c(1,1,1, -1,1,1, 1,-1,1, -1,-1,1), 3)
      B <- matrix(c(1,2,3, 2,1,3, 2,3,1), 3)
      
      C <- array(NA, c(3,3,4))
      for(i in 1:4) C[,,i] <- B*A[,i]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 2020-01-17
        • 2021-01-31
        • 2018-01-03
        相关资源
        最近更新 更多