これは非常に基本的な質問であることは承知しています、申し訳ありません。
行列の各行にベクトルを掛けたい。ので、私は持っています:
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
私は を好みsweep
ますが、わずかに遅いと思います:
sweep(mat,MARGIN=2,vec,"*")
MARGIN=2
各列(マージン 2) に の対応する要素を乗算する必要があることを指定しますvec
。
これを行うための最もエレガントな方法は次のとおりです。
mat=matrix(1,2,4)
vec=1:4
new.mat=t(vec*t(mat))