You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:45:03