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,“*”)的更显式变体,
+1tcrossprod(x,y)
应该是x%*%t(y)
的更有效版本。
sum(x %*% t(y))
#[1] 66
sum(tcrossprod(x, y))
#[1] 66