在 R 中向量化双重求和

Job*_*obs 2 for-loop r sum vectorization

在此输入图像描述

如果我有像这样的双重求和,我如何完全矢量化它?(无循环)

一个好的起点是获取向量 i 和 j。例如,如果 n = 2:

i = 0:2
j = c(0,0,1,0,1,2)
Run Code Online (Sandbox Code Playgroud)

那么接下来我们应该如何应对呢?

李哲源*_*李哲源 7

  1. i = 0并且j = 0什么也不贡献,所以求和可以从1开始,而不是0;

  2. outer可用于计算j * i * (i + 1)所有i = 1, 2, ..., nj = 1, 2, ..., n,给出一个n× 方n矩阵;

  3. 求和结束j <= i,只涉及该矩阵下三角部分的元素。

n <- 2
i <- 1:n
j <- 1:n
x <- outer(i, j, function (i, j) j * i * (i + 1))
sum(x[lower.tri(x, diag = TRUE)])
#[1] 20
Run Code Online (Sandbox Code Playgroud)

(i, j)一种不太直观但更有效的方法是直接为所有下三角元素生成索引。

n <- 2
i <- sequence(n:1, 1:n)
j <- rep(1:n, n:1)
sum(j * i * (i + 1))
#[1] 20
Run Code Online (Sandbox Code Playgroud)

实际上,经过一些简单的数学计算,我意识到这可以简化为一个求和:

n <- 2
i <- 1:n
0.5 * c(crossprod(i * (i + 1)))
#[1] 20
Run Code Online (Sandbox Code Playgroud)