2011-11-08 11 views
18

ベクトル乗算の行列は:R:私は問題以下している

sum(6*1, 16*2, 26*3) 
sum(7*1, 17*2, 27*3) 

.................... 
sum(15*1, 25*2, 35*3) 

申し訳ありませんが、これは簡単な質問を

myvec <- c(1:3) 

mymat <- as.matrix(cbind(a = 6:15, b = 16:25, c= 26:35)) 
mymat 
     a b c 
[1,] 6 16 26 
[2,] 7 17 27 
[3,] 8 18 28 
[4,] 9 19 29 
[5,] 10 20 30 
[6,] 11 21 31 
[7,] 12 22 32 
[8,] 13 23 33 
[9,] 14 24 34 
[10,] 15 25 35 

私はmyvecとmymatを乗算して、新しいベクターを構築したいとなるように、そのI知らない...

編集:タイプミスを修正

答えて

33

Rで演算子は、行列の乗算を行います。

> mymat %*% myvec 
     [,1] 
[1,] 116 
[2,] 122 
... 
[10,] 170 
1

あなたが出力として代わりに行列結果のベクトルの結果をしたい場合は、ロータリー・ソリューションの

apply(mymat*myvec,1,sum) 

少し詳細..使用することができますオーウェンよりも、それは機能します。

+1

'c(mymat%*%myvec)'はベクトルを生成しません – Owen

+1

それは動作しません。行列は列のメジャー順に格納されるので、行単位の操作を適用する前にトランスポーズする必要があります実際にあなたのマトリックスに列方向操作を適用します)。それは 'apply(t(mymat)* myvec、1、sum) 'となるでしょう。 – Calimo

0

行列は、列の主要な順序でベクトルです:

colSums( t(mymat) * myvec) 

(。うまくいけば、正しくこの時間を質問を読んだ後編集)

+0

なぜ、式全体のc()は? – thelatemail

+0

必要ないかもしれませんか?アイデアはベクタとして終わるようになっていました。しかし、その考えは過度に慎重に思えます。私はそれを落とすでしょう。 –

+0

行列が列の大きな順序で格納されている場合は、行ごとの乗算を適用する前に行列を転置する必要があります。 'colSums(t(mymat)* myvec)' – Calimo

0

オーウェンは完全に右です。問題は、dot(scalar)とクロスプロダクトを区別していませんでした。スカラー積*ためと外積のため%*%は、オペレータ

0

代替であるが、より長い道は、このいずれかになります。

rowSums(t(apply(mymat, 1, function(x) myvec*x)),na.rm=T) 

は、私はそれがマトリックス内のNAのを無視することができた唯一の方法です。

関連する問題