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