R语言如何匹配sig向量峰谷与mov向量值为1的对应位置
R 匹配峰谷位置与mov向量取值的实现方案
核心逻辑
- 第一步:对输入的sig向量做峰、谷位置识别,合并所有峰谷位置得到待匹配集合
- 第二步:校验sig与mov向量长度一致性,避免索引错位
- 第三步:筛选待匹配集合中对应mov向量取值为1的位置
- 第四步:若筛选结果非空则返回该位置向量,否则返回0
完整代码
假设你使用的是适配后的findpeaks函数,若使用pracma包原生findpeaks可直接运行以下代码,自行修改的findpeaks只需调整返回位置的提取逻辑即可:
# 加载依赖(如使用pracma包的findpeaks) library(pracma) find_matched_peak_valley <- function(sig, mov, ...) { # 校验向量长度一致性 if (length(sig) != length(mov)) { stop("sig向量与mov向量长度必须一致") } # 识别峰位置:findpeaks返回矩阵第二列为峰的索引位置 peak_res <- tryCatch(findpeaks(sig, ...), error = function(e) NULL) peak_pos <- if (!is.null(peak_res)) peak_res[,2] else integer(0) # 识别谷位置:对sig取反后找峰即为原序列谷位置 valley_res <- tryCatch(findpeaks(-sig, ...), error = function(e) NULL) valley_pos <- if (!is.null(valley_res)) valley_res[,2] else integer(0) # 合并去重所有峰谷位置 all_pv_pos <- unique(c(peak_pos, valley_pos)) if (length(all_pv_pos) == 0) { return(0) } # 匹配mov取值为1的位置 matched_pos <- all_pv_pos[mov[all_pv_pos] == 1] return(if(length(matched_pos) > 0) matched_pos else 0) }
测试示例
# 第一组测试数据 sig1 <- c(322, 398, 401, 345, 368, 361, 476, 551, 742, 601, 354, 355, 321, 376, 388, 394, 325, 355, 375, 325) mov1 <- c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) find_matched_peak_valley(sig1, mov1) # 返回结果:9,符合预期 # 第二组测试数据 sig2 <- c(341, 378, 309, 345, 386, 341, 366, 301, 342, 311, 374, 345, 332, 393, 378, 394, 345, 361, 305, 335) mov2 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) find_matched_peak_valley(sig2, mov2) # 返回结果:0,符合预期
内容的提问来源于stack exchange,提问作者ramen
相关产品推荐
相关产品推荐

