R 我如何在没有循环的情况下乘向量?

R 我如何在没有循环的情况下乘向量?,r,R,我有两个向量: 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 矢量化操作符很整洁 ?mapply也是一个方便的功能,在执行这些任务时要记住: 例如: …将执行x[1]*y[1],x[2]*y[2

我有两个向量:

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
矢量化操作符很整洁

?mapply
也是一个方便的功能,在执行这些任务时要记住: 例如:

…将执行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
这是我要用的

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

除了Josh和LateMail的优秀想法之外,还有三个其他想法:

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%*%t(y)
得到一个矩阵,该矩阵包含我们想要的乘积,然后只需使用
sum
将矩阵中的所有内容相加即可

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

还有一个更有效的版本(多亏了加文)


很多方法!到目前为止你试过什么?你发现了吗?总和?那是作弊+1对于过于简单的方法。逻辑胜过编程技巧。因此,我被标记为迁移到math.stackexchange.com?并且作为第二个
和(外部(x,y,“*”)的更显式变体,
+1
tcrossprod(x,y)
应该是
x%*%t(y)
的更有效版本。
sum(x %*% t(y))
#[1] 66
sum(tcrossprod(x, y))
#[1] 66