我知道这是一个非常基本的问题,抱歉。不错的方法,用r中的一个向量乘以一个矩阵的每一行
我想乘以一个向量矩阵的每一行。所以我有:
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
}
我以为我找到了'应用'的答案,但我不能让它以同样的方式工作。
我知道这是一个非常基本的问题,抱歉。不错的方法,用r中的一个向量乘以一个矩阵的每一行
我想乘以一个向量矩阵的每一行。所以我有:
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
指定每个列(margin 2)应该乘以vec
的对应元素。
完美,谢谢 –
@JessicaB欢迎您! :-) –