5

我知道这是一个非常基本的问题,抱歉。

我想将矩阵的每一行乘以一个向量。所以我有:

mat=matrix(1,2,4)
vec=c(1,2,3,4)

#works but ugly:
new.mat=mat
for(i in 1:nrow(mat)){
  new.mat[i,]=mat[i,]*vec
}

我以为我已经通过“应用”找到了答案,但我无法让它以同样的方式工作。

4

4 回答 4

12

我想这就是你要找的...

t( t(mat) * vec )
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4

*像 R 中的大多数其他运算符一样,它是矢量化的。这t是必要的,因为 R 将按列循环。apply解决方案是:

t( apply( mat , 1 , `*` , vec ) )
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
于 2013-07-18T15:35:42.013 回答
4

使用apply

> t(apply(mat,1 , function(x) x*vec))
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
于 2013-07-18T15:37:58.827 回答
2

我不得不说最优雅的方法是:

mat=matrix(1,2,4)
vec=1:4
new.mat=t(vec*t(mat))
于 2013-07-18T15:38:34.573 回答
2

我更喜欢sweep,虽然我认为它有点慢:

sweep(mat,MARGIN=2,vec,"*")

MARGIN=2指定每(边距 2)应乘以 的对应元素vec

于 2013-07-18T16:16:18.647 回答