我有以下两次加法:∑10,i = 1 ∑i,j = 1(i ^ 5 /(10 + j ^ i))
我对本练习非常迷惑,我尝试了以下代码,但我返回了一个错误,尽管给了我一个数字-可以肯定这是不正确的。任何帮助都非常宝贵!
i <- seq(1, 10, 1)
j <- seq(1, i, 1)
denominators <- 10+j^i
fractions <- (i^5)/denominators
sum(fractions)
或
i = rep(1:10, each=5)
j = rep(i, 10)
sum(i^5/(10+j^i))
答案 0 :(得分:3)
对内和求和:
f <- Vectorize(function(i) {
j <- 1:i
sum(i^5 / (10 + j^i))
})
通过向量化它,您可以将其应用于数组,在数组中将逐个分量地进行操作:这就是 i 上的外部总和所要做的。因此,值是
sum(f(1:10))
另一种解决方案是浪费RAM且速度稍慢,它利用外部乘积在一个矩阵中计算双重和的所有项。您必须提取j
不超过i
的字词:
n <- 10
x <- outer(1:n, 1:n, function(i,j) i^5 / (10 + j^i))
sum(x[!upper.tri(x)])
但是,由于它的紧凑性和简单性,这是一个很好的了解技术。
答案 1 :(得分:3)
您可以展开所有可能的i / j组合,然后对所有项求和
i <- 1:10
ii <- rep(i, i)
jj <- unlist(sapply(i, function(x) seq(1,x)))
sum(ii^5/(10+jj^ii))
# [1] 20835.22
答案 2 :(得分:1)
r中的所有向量都被向量化:
i <- seq(10)
j <- sequence(i)
i_use <- rep(i,i)
sum(i_use^5/(10 + j^i_use))
[1] 20835.22
答案 3 :(得分:1)
到目前为止,这已经得到了相当彻底的回答,但是我会再抛出一个
Map()
/ Reduce()
使用另一种技术混合解决方案:
i <- seq_len(10)
j <- lapply(i, seq_len)
Reduce("sum", Map(function(i, j) i^5 / (10 + j^i), i, j))
#> [1] 20835.22
出于好奇,目前发布答案的基准。定义:
sum_vectorize <- function(n) {
f <- Vectorize(function(i) {
j <- 1:i
sum(i^5 / (10 + j^i))
})
sum(f(1:n))
}
sum_outer <- function(n) {
x <- outer(1:n, 1:n, function(i,j) i^5 / (10 + j^i))
sum(x[!upper.tri(x)])
}
sum_sapply <- function(n) {
i <- 1:n
ii <- rep(i, i)
jj <- unlist(sapply(i, function(x) seq(1,x)))
sum(ii^5/(10+jj^ii))
}
sum_sequence <- function(n) {
i <- seq(n)
j <- sequence(i)
i_use <- rep(i,i)
sum(i_use^5/(10 + j^i_use))
}
sum_reduce <- function(n) {
i <- seq_len(n)
j <- lapply(i, seq_len)
Reduce("sum", Map(function(i, j) i^5 / (10 + j^i), i, j))
}
结果:
bench::press(
n = c(10, 1000),
{
bench::mark(
sum_vectorize(n),
sum_outer(n),
sum_sapply(n),
sum_sequence(n),
sum_reduce(n)
)
}
)
#> Running with:
#> n
#> 1 10
#> 2 1000
#> Warning: Some expressions had a GC in every iteration; so filtering is disabled.
#> # A tibble: 10 x 7
#> expression n min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <dbl> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 sum_vectorize(n) 10 59.1us 69.4us 10307. 39.07KB 14.8
#> 2 sum_outer(n) 10 18.1us 21.4us 35014. 49.8KB 7.00
#> 3 sum_sapply(n) 10 69.5us 88.8us 9044. 1.48KB 14.7
#> 4 sum_sequence(n) 10 14.2us 16.3us 45303. 6.89KB 4.53
#> 5 sum_reduce(n) 10 32.6us 38.1us 20404. 0B 19.1
#> 6 sum_vectorize(n) 1000 105ms 118.1ms 8.60 5.85MB 0
#> 7 sum_outer(n) 1000 303.3ms 319.3ms 3.13 47.7MB 4.70
#> 8 sum_sapply(n) 1000 148.6ms 154.6ms 6.49 13.44MB 4.87
#> 9 sum_sequence(n) 1000 131.5ms 142.1ms 7.01 11.46MB 1.75
#> 10 sum_reduce(n) 1000 107.5ms 115ms 8.32 5.85MB 1.66