我知道這是一個非常基本的問題,抱歉。不錯的方法,用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歡迎您! :-) –