我正在尝试计算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)
如何组合这些循环,以使我只有一个?
答案 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)
之类的值,也可以根据结果对结果进行访问。