R语言嵌套循环迭代求解方程 未知长度结果如何存储
匹配结果存储方案
- 首选空列表存储中间结果的方案,适配结果长度未知的场景,避免数据框逐行追加带来的性能损耗:
# 初始化空列表和计数器 res_list <- list() count <- 1 for (i in SR_value) { for (j in SA_range) { calc_res <- cot(j*(pi/180))*log(tan(j*(pi/180)) + sec(j*(pi/180))) if (near(calc_res, i, tol = 0.0002)) { res_list[[count]] <- data.frame(SR = i, SA = j) count <- count + 1 } } } # 合并所有结果为统一数据框 final_res <- do.call(rbind, res_list)
如果数据量不大,也可以直接初始化空数据框逐行追加,写法更简单。
更高效率的实现方案
原嵌套循环的性能瓶颈来自R的原生循环开销,完全可以用向量化操作替代,运行速度可以提升数十倍:
- 首先封装计算函数,方便复用:
calc_sr <- function(SA_deg) { rad <- SA_deg * pi / 180 cot(rad) * log(tan(rad) + sec(rad)) }
- 向量化批量计算+过滤,不需要写任何循环:
library(tidyverse) final_res <- crossing(SR = SR_value, SA = SA_range) |> # 生成所有SR和SA的组合 mutate(calc_val = calc_sr(SA)) |> filter(near(calc_val, SR, tol = 0.0002)) |> select(SR, SA)
- 如果是解方程场景,不需要固定步长遍历SA的话,可以使用求根函数直接求解,精度更高、速度更快:
library(pracma) # 单个SR的求根函数 solve_sa <- function(target_sr) { root_func <- function(deg) calc_sr(deg) - target_sr # 指定求解区间为0.01~89.99度 root_res <- fzero(root_func, c(0.01, 89.99)) return(root_res$x) } # 批量求解所有SR对应的SA值 solved_sa <- map_dbl(SR_value, solve_sa)
注意:求根方案默认返回区间内的一个根,如果同一个SR对应多个SA值,建议使用前面的向量化遍历方案,确保所有符合条件的结果都能被捕获。
内容的提问来源于stack exchange,提问作者Juan_814
相关产品推荐
相关产品推荐

