循环数据优化算法
optimization algorithm for circular data
背景: 我对从一套录音机中定位声源很感兴趣。每个音频阵列由 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)
}
这个当前函数可以作为我的任务的一个不错的解决方法,但它并不理想。非常感谢任何改进我的代码功能的建议或提示。
我会计算 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
背景: 我对从一套录音机中定位声源很感兴趣。每个音频阵列由 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)
}
这个当前函数可以作为我的任务的一个不错的解决方法,但它并不理想。非常感谢任何改进我的代码功能的建议或提示。
我会计算 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