2011-11-08 178 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的矩阵内的唯一途径。