【问题标题】:optimization algorithm for circular data循环数据的优化算法
【发布时间】:2015-06-22 04:04:05
【问题描述】:

背景:我有兴趣从一套录音机中本地化一个声源。每个音频阵列由 6 个定向麦克风组成,每 60 度(0、60、120、180、240、300 度)均匀分布。我有兴趣找到具有最大信号强度的相邻麦克风对。数据由时间戳、天线编号和方位以及信号强度组成。下面我附上了一个简化的数据集。

    df <- data.frame(ant.bearing = seq(0,300, by=60), sig = c(98, 60, 44, 67, 58, 91), ts=1)

目标: 从这个数据集中,我想使用一个函数来提取具有最大信号强度集的两个相邻天线(即上述示例代码中方位角为 0 度和 300 度的天线),而考虑到该数据本质上是圆形的,并且天线 0 和 300 是相邻的。输出将是满足上述任务的两行数据,例如上述情况下的第 1 行和第 6 行。

我的尝试:

direction.finder <- function(dat){
    # finding bearing with max signal strength
    max <- dat[dat$sig == max(dat$sig),][1,]

    # finding signal strengths of neighbor antennas and pulling out which has highest

    left  = dat[dat$ant.bearing==max$ant.bearing-60,]
    right = dat[dat$ant.bearing==max$ant.bearing+60,]

    if(max$ant.bearing==0)
        left = dat[dat$ant.bearing==300,]
    if(max$ant.bearing==300)
        right = dat[dat$ant.bearing==0,]

    sub = right

    if(left$sig > right$sig)
        sub = left

    dat <- rbind(max, sub)
} 

这个当前函数可以作为我的任务的一个好的解决方法,但它并不理想。任何改进我的代码功能的建议或技巧将不胜感激。

【问题讨论】:

    标签: r optimization maximization


    【解决方案1】:

    我会计算df 中的所有行对:

    (pairs <- cbind(1:nrow(df), c(2:nrow(df), 1)))
    #      [,1] [,2]
    # [1,]    1    2
    # [2,]    2    3
    # [3,]    3    4
    # [4,]    4    5
    # [5,]    5    6
    # [6,]    6    1
    

    您可以找到与which.max 的最佳配对:

    (best.row <- which.max(df$sig[pairs[,1]] + df$sig[pairs[,2]]))
    # [1] 6
    

    最后可以查一下对应的天线方位:

    df$ant.bearing[pairs[best.row,]]
    # [1] 300   0
    

    如果您有缺失值,您可以通过为缺失条目创建 NA 值来稍微调整代码:

    # Data
    df <- data.frame(ant.bearing = seq(0,180, by=60), sig = c(44, 67,88, 52), ts=2)
    #   ant.bearing sig ts
    # 1           0  44  2
    # 2          60  67  2
    # 3         120  88  2
    # 4         180  52  2
    
    (pairs <- cbind(1:6, c(2:6, 1)))
    #      [,1] [,2]
    # [1,]    1    2
    # [2,]    2    3
    # [3,]    3    4
    # [4,]    4    5
    # [5,]    5    6
    # [6,]    6    1
    
    sig <- rep(NA, 6)
    sig[1+df$ant.bearing/60] <- df$sig
    sig
    # [1] 44 67 88 52 NA NA
    

    现在剩下的流程类似:

    (best.row <- which.max(sig[pairs[,1]] + sig[pairs[,2]]))
    # [1] 2
    60*(pairs[best.row,]-1)
    # [1]  60 120
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 2021-04-16
      • 1970-01-01
      相关资源
      最近更新 更多