R:优化穗修剪功能

R:优化穗修剪功能,r,vectorization,R,Vectorization,由于我没有找到用于分析电生理数据的R软件包,因此我使用了我所在小组的一个尖峰修剪功能: prune.spikes <- function(spikes, min.isi) { # copy spike matrix prunedspikes <- spikes # initialise index of last spike: infinitely before the first one. for (i in 1:ncol(spikes)) {

由于我没有找到用于分析电生理数据的R软件包,因此我使用了我所在小组的一个尖峰修剪功能:

prune.spikes <- function(spikes, min.isi) {
    # copy spike matrix
    prunedspikes <- spikes

    # initialise index of last spike: infinitely before the first one.
    for (i in 1:ncol(spikes)) {
        last <- -Inf
        for (j in 1:nrow(spikes)) {
            if (spikes[j, i] == 1) {
                if (j - last < min.isi) {
                    prunedspikes[j, i] <- 0;  # remove the spike
                }
                else {
                    last <- j
                }
            }
        }   
    }
    return(prunedspikes)
}

prune.spikes如果速度差还不是问题,最好保持循环,而不是使用Rcpp

根据Hadley Wickham的文章,拥有这个循环并不是一个坏主意,因为它可以归类为递归关系


一旦速度成为瓶颈,那么求助于Rcpp或(文章也建议)可能是解决方案。

像@Khashaa建议的那样,我在Rcpp的帮助下实现了该功能:

NumericMatrix prunespikes(NumericMatrix spikes, double minisi) {
  NumericMatrix prunedspikes = spikes;
  int ncol = spikes.ncol();
  int nrow = spikes.nrow();
  for (int i = 0; i < ncol; i++) {
    int last = 0;
    while (spikes(last, i) == 0) {
      last++;
    }
    for (int j = last + 1; j < nrow; j++) {
      if (spikes(j, i) == 1) {
        if (j - last < minisi) {
          prunedspikes(j, i) = 0;
        } else {
          last = j;
        }
      }
    }
  }
  return prunedspikes;
}
numerimatrix prunespikes(numerimatrix尖峰,双迷你){
NumericMatrix prunedspikes=尖峰;
int-ncol=spikes.ncol();
int nrow=尖峰.nrow();
对于(int i=0;i
尝试
编译器
或在
Rcpp
NumericMatrix prunespikes(NumericMatrix spikes, double minisi) {
  NumericMatrix prunedspikes = spikes;
  int ncol = spikes.ncol();
  int nrow = spikes.nrow();
  for (int i = 0; i < ncol; i++) {
    int last = 0;
    while (spikes(last, i) == 0) {
      last++;
    }
    for (int j = last + 1; j < nrow; j++) {
      if (spikes(j, i) == 1) {
        if (j - last < minisi) {
          prunedspikes(j, i) = 0;
        } else {
          last = j;
        }
      }
    }
  }
  return prunedspikes;
}