5

これは非常に基本的な質問であることは承知しています、申し訳ありません。

行列の各行にベクトルを掛けたい。ので、私は持っています:

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
}

「適用」で答えを見つけたと思ったのですが、同じように機能させることができませんでした。

4

4 に答える 4

12

これがあなたが探しているものだと思います...

t( t(mat) * vec )
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4

*R の他のほとんどの演算子と同様に、ベクトル化されます。tR は列ごとにリサイクルされるため、これが必要です。apply解決策は次のとおりです。

t( apply( mat , 1 , `*` , vec ) )
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
于 2013-07-18T15:35:42.013 に答える
4

使用してapply

> t(apply(mat,1 , function(x) x*vec))
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
于 2013-07-18T15:37:58.827 に答える
2

私は を好みsweepますが、わずかに遅いと思います:

sweep(mat,MARGIN=2,vec,"*")

MARGIN=2(マージン 2) に の対応する要素を乗算する必要があることを指定しますvec

于 2013-07-18T16:16:18.647 に答える
2

これを行うための最もエレガントな方法は次のとおりです。

mat=matrix(1,2,4)
vec=1:4
new.mat=t(vec*t(mat))
于 2013-07-18T15:38:34.573 に答える