使用迭代器数组读取稀疏信息



我目前正在编写一个c++代码,用于处理理论神经科学中的一个问题的尖峰训练。然而,实际的神经科学与我的问题完全无关。基本上,我有一个很长的时间框架,我想存储这段时间内神经元"激发"的每一次。由于"激发"是一个离散事件,因此可以通过简单地将每个事件的时间记录到c++向量中来实现,从而创建一个稀疏得多的表示,然后存储关于每个时间点的信息。让这件事变得困难的是,我想同时处理几个神经元。我对这个问题的解决方案是创建一个类,该类包括从每个神经元的标识符(整数)到该神经元的向量的映射:

using namespace std;
typedef pair<int,vector<int> > Pair;
typedef map<int,vector<int> > Map; 
class SpikeTrain{
public:
    Map * train;//Spike train
    double * dt;//timestep
    int * t_now;//curent timestep (index)
    vector<int>::iterator * spikeIt;//Array of iterators for traversal.
//Methods, etc;
};

这里面的地图部分很好用。当我试图问:在任何给定的时间步长发生了多少事件时,问题就来了。这是一个先问后答的问题,因为如果你还记得的话,只存储每个神经元上发生事件的时间。因此,我转向使用迭代器初始化迭代器数组的策略:

void SpikeTrain::beginIterator(){
     spikeIt= new vector<int>::iterator[N()];
     t_now = new int(0);
     int n=N();
     for(int i  = 0;i<n;i++){
        if((*train)[i].size()>0){
            spikeIt[i] = (*train)[i].begin();
         }
     }
}

每个事件的第一个时间由对应于单个神经元的迭代器指向[N()只是神经元的数量,即我正在计数的向量],也就是说,它的尖峰向量中的第一个条目。然后,我试图遍历我的稀疏sudo矩阵,方法是查看每一次,计数当时出现尖峰的神经元数量,如果神经元出现尖峰,则将数组中相应的迭代器移动到其向量中的下一个条目:

bool* SpikeTrain::spikingNow(){
    bool * spikingNeurons = new bool[N()];
    int n = N();
    for (int i = 0;i<n;i++){
        if(*(spikeIt[i]) ==(*t_now)){
            spikingNeurons[i] =true;
            spikeIt[i]++;
        }
    }
    (*t_now)++;
    return spikingNeurons;
}

那么,我的问题就来了,试图访问数组中的每个迭代器以与当前时间进行比较。我有

EXC_BAD_ACCESS(代码=1,地址=0x0)

在:

if(*(spikeIt[i]) ==(*t_now))

我对c++和非matlab编程都是新手,所以如果这篇文章中有任何令人发指的错误,我深表歉意。话虽如此,我在驾驭这个复杂的结构时遇到了很大的困难。谢谢

如果*train中的任何向量为空,则spikeIt中相应的迭代器永远不会初始化,但您无论如何都在取消引用并递增它。这表现出未定义的行为。

此外,并没有试图阻止迭代器在其向量结束时递增。

最新更新