如何将五个for循环简化为嵌套的for循环?

时间:2019-09-12 18:01:50

标签: r for-loop nested-loops

我正在尝试计算1000个矩阵的L2条件数。但是,我这样做是针对不同维度的矩阵。例如,我正在计算1000个5x5矩阵的L2条件编号,然后再次执行相同的操作,但对于10x10矩阵,依此类推。

我已经解决了问题,但是这里的问题是我有5个for循环执行相同的功能。我知道我可以通过嵌套的for循环简化代码,但是我不确定该怎么做。我在下面附加了我的代码。

请注意,数字是根据矩阵的尺寸随机生成的。

#Set up for loops
set.seed(2019) 
CN5 <- NULL
CN10 <- NULL

# First for loop for n = 5
## n = 5
for(i in 1:1000){
  CN5[i] <- kappa(matrix(rnorm(25), nrow = 5))
}

mean(CN5)
sd(CN5)
median(CN5)

#Second for loop with n = 10
## n = 10
for(i in 1:1000){
  CN10[i] <- kappa(matrix(rnorm(100), nrow = 10))  
}

mean(CN10)
sd(CN10)
median(CN10)

如何组合这些循环,以使我只有一个?

2 个答案:

答案 0 :(得分:1)

您似乎可以将它们放在同一循环中

for(i in 1:1000){
  CN5[i] <- kappa(matrix(rnorm(25), nrow = 5))
  CN10[i] <- kappa(matrix(rnorm(100), nrow = 10))  
}

根据评论,您可以考虑使用以下功能:

get_kappa <- function(n = 25, nrow = 5) {
  return(kappa(matrix(rnorm(n), nrow = nrow)))
}

for(i in 1:1000){
  CN5[i] <- get_kappa(n = 25, nrow = 5)
  CN10[i] <- get_kappa(n = 100, nrow = 10)
}

答案 1 :(得分:1)

注释中建议的一般过程是编写一个带有参数的函数,该参数要考虑不同迭代之间(或可能)有所不同。

在您的代码中,唯一变化的是平方矩阵PROC sql; CREATE TABLE want as SELECT *, mean(gain) as average_gain FROM have GROUP BY id, date ORDER BY id, date ; QUIT; 的尺寸。

n x n

然后,如果您有 p.e。 1000个矩阵5x5和1000个矩阵10x10,则可以将结果存储在另一个列表set.seed(2019) cn_function <- function(n) { for(i in 1:1000) { CN_n[i] <- kappa(matrix(rnorm(n^2), nrow = n)) } # Return a list with the desired results list(n = n, # Store n for good measure cn_n = CN_n, mean = mean(CN_n), median = median(CN_n), sd = sd(CN_n)) } 中。

results

或者使用超棒的matrices_n <- c(5, 10) # or any number of `n` results <- list() for(i in seq_along(matrices_n)) { results[[i]] <- cn_function(n = matrices_n[i]) } 包而不是purrr循环:

for

然后,您可以从列表中访问诸如cn_function <- function(n) { CN_n <- purrr::map_dbl(1:1000, ~kappa(matrix(rnorm(5^2), nrow = 5))) # Return a list with the desired results list(n = n, # Store n for good measure cn_n = CN_n, mean = mean(CN_n), median = median(CN_n), sd = sd(CN_n)) } matrices_n <- c(5, 10) results <- purrr::map(matrices_n, cn_function) 之类的值,也可以根据结果对结果进行访问。