我有两个向量:如何在没有循环的情况下乘以向量?
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
有没有办法做到没有循环?在此先感谢
我有两个向量:如何在没有循环的情况下乘以向量?
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
有没有办法做到没有循环?在此先感谢
这是我想要的使用!
除了乔什sum(x) * sum(y)
# [1] 66
不公平!你用_math_! – joran
这就是作弊!!!!!!! :)为简单化的方法+1。逻辑击败编程技巧。 –
那么我被标记为迁移到math.stackexchange.com? –
尝试:
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
三个其他的想法和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))
并且作为第二个“总和”(外(x,y,“*”))的更明确的变体' – Henry
我们可以使用x %*% t(y)
得到有我们想要的,然后只用sum
在基质中添加一切融合在一起的产品矩阵。
sum(x %*% t(y))
#[1] 66
而这同样的想法的一个稍微更高效的版本(感谢加文)
sum(tcrossprod(x, y))
#[1] 66
另一个数学作弊者:P + 1 –
+1'tcrossprod(x,y)'应该是轻微的更高效的'x%*%t(y)'版本。 –
很多方法!你试过什么了?你有没有找到'?sum'? – Justin