如何找出使R函数所有输出低于阈值的s1与s2组合?
解决思路与实现代码
核心条件推导
你的函数输出是 s1[j]*s2[j] + z1[i],要让所有输出都小于阈值(比如20),本质只需要满足**s1*s2 + max(z1) < 阈值**。因为z1的最大值是8,代入阈值20的话,就是s1*s2 < 12——只要这个条件成立,所有z1对应的输出都会小于20(其他z1元素更小,加起来的结果肯定也更小)。反过来,如果这个条件不满足,那至少有一个输出(z1取最大值时)会超过阈值。
这个推导能大幅减少计算量,不用生成整个矩阵再逐一判断。
具体实现步骤
- 生成所有(s1, s2)组合:用
expand.grid()生成s1和s2的全部配对 - 筛选符合条件的组合:用推导的条件直接过滤
- 可选:优化原函数:用向量化操作替代嵌套循环,提升运行效率
代码示例
基础筛选代码
# 定义变量 z1 <- c(2, 4, 6, 8) s1 <- seq(-13, 14, by = 0.1) s2 <- seq(-13, 14, by = 0.1) threshold <- 20 # 生成所有s1和s2的组合 all_pairs <- expand.grid(s1 = s1, s2 = s2) # 计算判断条件,筛选有效组合 max_z <- max(z1) valid_pairs <- all_pairs[all_pairs$s1 * all_pairs$s2 < (threshold - max_z), ]
valid_pairs就是所有符合要求的(s1, s2)组合,你可以直接查看或后续使用。
优化原函数(可选)
原函数的嵌套循环可以用向量化的outer()函数替代,效率更高:
Function <- function(s1, s2) { outer(s1 * s2, z1, `+`) }
若需基于函数输出判断(复杂场景)
如果z1的情况更复杂,无法通过最大值简化条件,可以用以下方式基于函数输出筛选:
# 先获取所有组合的s1、s2向量 s1_vec <- all_pairs$s1 s2_vec <- all_pairs$s2 # 调用函数生成输出矩阵 Y <- Function(s1_vec, s2_vec) # 判断每一行的所有元素是否都小于阈值 valid_indices <- apply(Y, 1, function(row) all(row < threshold)) # 筛选有效组合 final_valid_pairs <- all_pairs[valid_indices, ]
这种方法效率较低,仅推荐在无法简化条件时使用。
内容的提问来源于stack exchange,提问作者Blue999
相关产品推荐
相关产品推荐

