2011-11-08 22 views
18

Vektör çoğalmasının matris:R: Sorun var

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

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

Maalesef bu basit soruyu

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 

Ben myvec ile mymat çoğaltarak yeni vektörü oluşturmak istiyorum olacak şekilde ben bilmiyorum ...

Düzenleme: yazım hatası düzeltilmiş

cevap

33

bunun yerine çıktı olarak bir matris sonucu bir vektör sonucunu istiyorsanız

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

, ayrıca kullanabilirsiniz ..

apply(mymat*myvec,1,sum) 

dolambaçlı çözümün Biraz daha: Roperatör matris çarpım yapar Owen'ın değil, ama işe yarıyor.

+1

Veya "c (mymat% *% myvec)" bir vektör üretecektir – Owen

+1

Hayır, çalışmıyor, matrisler sütun ana düzeninde depolanır, böylece satır-temelli işlemleri uygulayabilmeniz için bunları dönüştürmeniz gerekir. Aslında matrisinize sütunlarla ilgili işlemler uygularsınız). Bu geçerlidir (t (mymat) * myvec, 1, toplam) ' – Calimo

0

Matrisler sütun ana sırayla vektörler şunlardır:

colSums( t(mymat) * myvec) 

(umarım doğru bu kez soruyu okuduktan sonra Düzenlendi.)

+0

Neden tüm ifade etrafında c()? – thelatemail

+0

Belki gerekli değil? Fikir bu şekilde bir vektör olarak ortaya çıktı. Fakat bu fikir aşırı derecede temkinli görünüyor. Onu düşüreceğim. –

+0

Matris, sütun ana düzeninde depolanırsa, satır aralığı çarpımı uygulanmadan önce önce onu aktarmanız gerekir. colSums (t (mymat) * myvec) – Calimo

0

Owen haklıdır. Sorun, dot(scalar) ve çapraz ürünleri ayırt etmiyordu. skaler ürün * için ve çapraz ürün için %*% operatörleri

0

bir alternatif, ancak daha uzun bir yol bu biri olabilir:

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

O matrisin içine NA adlı göz ardı edebilirsiniz bulunan tek yolu var.