1

我目前正在编写一个 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 编程的新手,所以如果这篇文章中有任何令人发指的失礼,我深表歉意。话虽如此,我在导航这个复杂的结构时遇到了很大的困难。谢谢!

4

1 回答 1

0

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

此外,没有尝试阻止迭代器递增超过其向量的末尾。

于 2013-08-17T00:56:43.983 回答