首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:优化穗修剪功能

R:优化穗修剪功能
EN

Stack Overflow用户
提问于 2015-07-15 12:08:32
回答 2查看 116关注 0票数 2

由于我没有找到一个用于分析电生理数据的R软件包,所以我使用了一种从我的小组中修剪穗的功能:

代码语言:javascript
复制
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)
}

该函数接受由0和1值组成的尖峰向量或矩阵,如果它发生在最小间隔内,则删除任何1。因为有两个嵌套循环,所以需要很长时间才能运行。为了优化它,我提出了这个解决方案(删除一个循环):

代码语言:javascript
复制
prune.cols <- function(spikes, min.isi) {
    prunedspikes <- apply(spikes, 2, FUN = prune.rows, min.isi = min.isi)
    return(prunedspikes)
}

prune.rows <- function(spikes, min.isi) {
    prunedspikes <- spikes
    last <- -Inf
    for (i in 1:length(spikes)) {
        if (spikes[i] == 1) {
            if (i - last < min.isi) {
                prunedspikes[i] <- 0;  # remove the spike
            }
            else {
                last <- i
            }
        }
    }
    return(prunedspikes)
}

与原始版本(大约60次)相比,在大型数据集中调用prune.cols要快得多。不过,还有一个循环。到目前为止,我还没有想出一个好的、简单的解决方案。怎样才能进一步改善功能呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-21 13:45:04

就像@Khashaa提议的那样,我在Rcpp的帮助下实现了这个函数:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2015-07-15 12:39:17

如果速度差异还不是一个问题,它可能更好地保持循环,而不是使用Rcpp。

根据Hadley的文章应该按原样留下的循环,拥有这个循环并不是个坏主意,因为它可以被归类为递归关系案例。

一旦速度成为瓶颈,那么诉诸Rcpp或此页 (本文也建议)可能是解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31430005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档