【问题标题】:Element-wise multiplication between array and matrix数组和矩阵之间的元素乘法
【发布时间】:2017-07-08 03:31:08
【问题描述】:

在 R 中,我可以在矩阵和(共形)向量之间进行分段乘法,例如:

X <- matrix(c(1, 2, 3, 4), nrow = 2)
a <- c(0, 1)
X * a

然后将矩阵的每一行与相应的向量元素相乘。我也可以对维度大于 2 的数组执行相同操作:

XX <- array(X, dim = c(2, 2, 2))
a <- c(0, 1)
XX * a

再次将每一行与相应的向量元素相乘。我可以为 3d 数组和 2d 矩阵做类似的事情吗?我只希望数组的每个子矩阵都按元素乘以一个矩阵。

【问题讨论】:

  • 您可以使用apply 进行切片,但它会在每个切片的结果上调用as.vector,从而破坏维度。但是,它正在执行所有计算,因此您可以根据需要重新设置尺寸(非常小心!)。另一种解决方法是将列表中的每个切片都放入列表中以阻止其简化。

标签: arrays r matrix multiplication


【解决方案1】:

你不能将它与二维矩阵相乘,但你可以试试这个 XX*c(1,2,3,4)

【讨论】:

    【解决方案2】:

    通过首先从较小维矩阵构造一个适当的数组,然后执行逐元素运算,可以实现“分段”乘法(或任何算术运算,实际上)。在您的示例中:

    X <- 1:8
    XX <- array(X, dim = c(2, 2, 2))
    a <- c(0, 1)
    
    # construct array for point-wise operation
    expandeda <- array(a, dim=dim(XX))
    
    XX * expandeda
    

    结果表明,正如您所说,a 的各个元素是按行应用的(即应用于数组的第一个维度):

    , , 1
    
         [,1] [,2]
    [1,]    0    0
    [2,]    2    4
    
    , , 2
    
         [,1] [,2]
    [1,]    0    0
    [2,]    6    8
    

    使用array(a, dim=dim(XX)) 构造适当的数组不仅适用于 3d 和 2d 矩阵,还适用于任何维数组,只要length(a) == dim(XX)[1]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 2021-08-24
      • 2011-12-13
      相关资源
      最近更新 更多