2012-10-16 100 views
6

我有两个向量:如何在没有循环的情况下乘以向量?

x = c(1,2,3) 
y = c(4,5,2) 

,我要乘的x每个元素在y每个元素,然后总括起来。所以我想要做的事情是沿线的:

1*(4 + 5 + 2) + 2*(4 + 5 + 2) + 3*(4 + 5 + 2) = 11 + 22 + 33 = 66 

有没有办法做到没有循环?在此先感谢

+1

很多方法!你试过什么了?你有没有找到'?sum'? – Justin

回答

12

这是我想要的使用!

除了乔什
sum(x) * sum(y) 
# [1] 66 
+6

不公平!你用_math_! – joran

+0

这就是作弊!!!!!!! :)为简单化的方法+1。逻辑击败编程技巧。 –

+0

那么我被标记为迁移到math.stackexchange.com? –

5

尝试:

sum(x*sum(y)) 
[1] 66 

矢量化运营整洁!

?mapply也是一个方便的功能,记住做这些类型任务时: 如:

mapply("*",x,y) 

...会做X [1] * Y [1],X [2] * Y [2]等...以产生

mapply("*",x,y) 
[1] 4 10 6 

概要的功能类似于sum也可以在一侧上使用,如:

mapply("*",x,sum(y)) 
[1] 11 22 33 

这意味着做你的计算也将是一个长期的手道:

sum(mapply("*",x,sum(y))) 
[1] 66 
5

三个其他的想法和thelatemail的优秀想法:

sum(do.call("*", expand.grid(x, y))) 
sum(outer(x, y)) ## or equivalently: sum(x %o% y) 
sum(sapply(split(x, x), function(z) z * y)) 
+0

并且作为第二个“总和”(外(x,y,“*”))的更明确的变体' – Henry

4

我们可以使用x %*% t(y)得到有我们想要的,然后只用sum在基质中添加一切融合在一起的产品矩阵。

sum(x %*% t(y)) 
#[1] 66 

而这同样的想法的一个稍微更高效的版本(感谢加文)

sum(tcrossprod(x, y)) 
#[1] 66 
+1

另一个数学作弊者:P + 1 –

+0

+1'tcrossprod(x,y)'应该是轻微的更高效的'x%*%t(y)'版本。 –

相关问题