【问题标题】:How to multiply another group of elements within a vector with a matrix, setting all other elements to zero如何将向量中的另一组元素与矩阵相乘,将所有其他元素设置为零
【发布时间】:2018-07-08 07:49:04
【问题描述】:

这个问题与我问过previously 的问题类似,但我在这里对组的定义略有不同。

我试图将向量中的某些元素与矩阵相乘,同时将向量中的所有其他元素设置为零,然后对下一组重复该过程。我要使用的元素相隔n个元素。

我的数据集又非常大,所以为了便于说明,让我们:

a <- c(2:7)
b <- matrix(1:36, byrow = TRUE, nrow = 6)
description <- c("AA1", "AA2", "AA3", "BB1", "BB2", "BB3")
names(a) <- description

给予:

a

AA1 AA2 AA3 BB1 BB2 BB3 
  2   3   4   5   6   7 

b
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    7    8    9   10   11   12
[3,]   13   14   15   16   17   18
[4,]   19   20   21   22   23   24
[5,]   25   26   27   28   29   30
[6,]   31   32   33   34   35   36

将 a 定义为具有三个组:

  • 第 1 组的元素 1 和 4
  • 第 2 组的元素 2 和 5
  • 第 3 组的元素 3 和 6

所以在这个例子中,我想将向量中的每个元素与相同的数字相匹配,然后将其与矩阵相乘。所以对于第 1 组,向量将是 (2, 0, 0, 5, 0, 0) 第 2 组 (0, 3, 0, 0, 6, 0) 和第 3 组 (0, 0, 4, 0, 0, 7)

第 1 组的向量矩阵乘法 (a %*% b) 会给出结果:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   97  104  111  118  125  132

所以我在考虑使用 grepl 代码匹配向量内的数字,或者以某种方式告诉 r 将组之间的两个元素设置为零,然后为下一组重复该过程。

最好的代码是什么?

【问题讨论】:

    标签: r matrix vector


    【解决方案1】:

    g是分组向量c(1, 2, 3, 1, 2, 3)使得分组向量的相同值对应的所有元素都属于同一个组。 现在outer(...) 给出了一个三列矩阵Ind,其每一列都是一组的指示变量。对于Ind 的每一列,执行sapply 中指定的计算:

    g <- as.numeric(gsub("\\D", "", names(a)))
    Ind <- outer(g, unique(g), `==`)
    sapply(1:ncol(Ind), function(i) a %*% (b * Ind[, i]))
    

    给予:

         [,1] [,2] [,3]
    [1,]   97  171  269
    [2,]  104  180  280
    [3,]  111  189  291
    [4,]  118  198  302
    [5,]  125  207  313
    [6,]  132  216  324
    

    最后一行代码也可以写成:

    sapply(split(Ind, col(Ind)), function(ind) a[ind] %*% b[ind, ])
    

    sapply(1:ncol(Ind), function(i) a %*% diag(Ind[, i]) %*% b)
    

    更新:已根据问题的澄清进行了修订。

    【讨论】:

    • 再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多