将矩阵与矢量行相乘

时间:2015-08-03 13:26:02

标签: r matrix

我有一个逻辑矩阵,我需要使用apply将每列乘以此列的总和。 例如:

> a
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    0    0    0    0
[3,]    1    1    0    1
[4,]    1    0    0    1
> b <- colSums(a)
> b
[1] 3 2 1 3

我想得到以下矩阵:

 > a
     [,1] [,2] [,3] [,4]
[1,]    3    2    1    3
[2,]    0    0    0    0
[3,]    3    2    0    3
[4,]    3    0    0    3

我是这样做的,但是因为我需要将我的函数应用于一个庞大的数据集,我需要使用apply进行编码。谢谢。

2 个答案:

答案 0 :(得分:3)

你可以取矩阵'a'的转置(t),然后乘以向量('b'),取输出的转置(t)得到想要的结果。

 t(t(a)*b)

或者我们可以通过复制'b'的元素来使'a'和'b'的长度相同。通过执行b[col(a)],我们可以通过col提供的索引复制'b'的每个元素。

 a*b[col(a)]

为了更好地理解

  col(a)
  #     [,1] [,2] [,3] [,4]
  #[1,]    1    2    3    4
  #[2,]    1    2    3    4
  #[3,]    1    2    3    4
  #[4,]    1    2    3    4

 b[col(a)] #is a vector
 #[1] 3 3 3 3 2 2 2 2 1 1 1 1 3 3 3 3

 a*b[col(a)]
 #     [,1] [,2] [,3] [,4]
 #[1,]    3    2    1    3
 #[2,]    0    0    0    0
 #[3,]    3    2    0    3
 #[4,]    3    0    0    3

答案 1 :(得分:1)

除了@ akrun的回答,如果你真的想使用apply

apply(a,2,function(x)x*sum(x))
#     [,1] [,2] [,3] [,4]
#[1,]    3    2    1    3
#[2,]    0    0    0    0
#[3,]    3    2    0    3
#[4,]    3    0    0    3

2表示您处理列(即第二维)。因此,每个操作都在对应于列的向量上完成,因此使用sum(适用于向量)而不是colSums(适用于矩阵)。