【问题标题】:Apply column vector to each row of each matrix in array in R将列向量应用于R中数组中每个矩阵的每一行
【发布时间】:2015-07-30 19:10:28
【问题描述】:

如果我有数组

> (arr = array(c(1,1,2,2), c(2,2,2)))

, , 1

     [,1] [,2]

[1,]    1    2

[2,]    1    2

, , 2

     [,1] [,2]

[1,]    1    2

[2,]    1    2

那么我如何将列向量(例如 c(3,3))应用于每个矩阵的每一行并将它们相加?所以本质上,我需要做 4 * c(1,2) %*% c(3,3)。这里可以使用apply函数吗?

【问题讨论】:

  • 你需要一个数组还是也可以使用一个列表?
  • 当然,我也可以使用列表。
  • @nongkrong 嗯,我不认为这总是有效的。
  • @nongkrong 我可以,它会产生一个 2x1 向量,然后我可以对结果向量的元素求和以获得我想要的。但是我会得到两个 2x1 向量,我需要对所有向量的分量求和才能得到答案。这有意义吗?
  • a1 <- apply(arr, c(1,3), sum);sum(mapply('%*%', arr, a1))这个工作

标签: arrays r matrix


【解决方案1】:

感谢大家的帮助!我相信正确的方法是

sum(apply(arr, c(1,3), function(x) x %*% c(1,2,3)))

这里我们将向量 [1,2,3] 点到我们称为 arr 的数组中每个矩阵的每一行并将它们相加。请注意,这里我将数组更改为

arr = array(c(1,2,3,4,5,6,7,8,9,10,11,12), c(2,3,2))

arr

, , 1

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

[1,]    1    3    5

[2,]    2    4    6

, , 2

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

[1,]    7    9   11

[2,]    8   10   12

现在我们用来点缀行的向量是 c(1,2,3) 而不是原始帖子中的 c(3,3)。

【讨论】:

  • 你确定它有效吗?我用你的例子得到错误Error in x %*% c(1, 2, 3) : non-conformable arguments
  • 我正在使用新数组来测试我们的两种方法。我应该在上面指定它,我现在会修复它。
  • 你对原始arr的修改是什么
  • @akrun 您只需将向量 c(1,2,3) 更改为您希望添加的任何内容。原来的 arr 里面有 2x2 矩阵,所以你需要一个 2x1 向量而不是我上面使用的 3x1 向量。
  • 好的。在这种情况下,您可能还需要证明这一点,以避免让阅读您的答案的人感到困惑。
【解决方案2】:

已编辑

这应该会给你答案:

l <- list(matrix(c(1,1,2,2), ncol = 2),
      matrix(c(1,1,2,2), ncol = 2))
l
#[[1]]
# [,1] [,2]
# [1,]    1    2
# [2,]    1    2
# 
# [[2]]
# [,1] [,2]
# [1,]    1    2
# [2,]    1    2


ivector <- c(3, 3) # a vector that is multiplied with the rows of each listelement
# apply over all listelements
res <- lapply(l, function(x, ivector){

    #apply to all rows of the matrizes
    apply(x, 1, function(rowel, ivector){
       return(sum(rowel %*% ivector))
    }, ivector = ivector)

}, ivector = ivector)

res
#[[1]]
#[1] 9 9
#
#[[2]] 
#[1] 9 9

# And finally sum up the results:
sum(Reduce("+", res))
#[1] 36

这有帮助吗?

【讨论】:

  • 不完全是。我想要,c(1,2) %*% c(3,3) + c(1,2) %*% c(3,3) + c(1,2) %*% c(3,3) + c(1,2) %*% c(3,3),其中前两个加法来自第一个矩阵,后两个加法来自第二个矩阵。我会尝试在这里修改你的 lapply 函数。
  • 我想我现在明白了,是不是更好?
  • 在 R 中,这就是创建向量的方式?我很抱歉,但我不确定如何解释它。我有一个矩阵,但我只想对每一行应用一个向量,然后总结结果。
  • @nongkrong 我在这里所说的“应用”的意思是用指定的列向量来点每个矩阵的行。抱歉措辞不佳。
  • 如果你总结这些条目,即 9 + 9 + 9 + 9,它似乎可以工作。虽然我没有尝试过其他示例,但就像我使用我的方法所做的那样。
猜你喜欢
  • 1970-01-01
  • 2021-07-22
  • 2021-08-13
  • 2014-08-22
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多