我知道这是一个非常基本的问题,对不起。
我想用矩阵乘以矩阵的每一行。所以我有:
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
}
我以为我找到了'应用'的答案,但我无法以同样的方式工作。
答案 0 :(得分: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
答案 1 :(得分:3)
使用apply
> t(apply(mat,1 , function(x) x*vec))
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 1 2 3 4
答案 2 :(得分:2)
我不得不说最优雅的方式是:
mat=matrix(1,2,4)
vec=1:4
new.mat=t(vec*t(mat))
答案 3 :(得分:2)
我更喜欢sweep
,虽然我认为它稍微慢一些:
sweep(mat,MARGIN=2,vec,"*")
MARGIN=2
指定每个列(边距2)应乘以vec
的相应元素。