2011-11-08 228 views
18

我具有以下問題:R:矩陣通過矢量乘法

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和建設新的載體中,使得

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

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

對不起,這是簡單的問題,我不知道......

編輯:錯字糾正

回答

33

%*%運營商中的R做矩陣乘法:

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

如果你想要一個向量的結果,而不是一個矩陣結果作爲輸出,你也可以使用..

apply(mymat*myvec,1,sum) 

更迂迴的解決方案的位比歐文的,但它的作品。

+1

或'c(mymat%*%myvec)'會產生一個向量 – Owen

+1

不,它不起作用,矩陣以列的主要順序存儲,所以你需要轉置它們,然後才能應用行操作(so你實際上在你的矩陣上應用了列操作)。那將是'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的矩陣內的唯一途徑。