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

时间:2013-08-16 19:25:10

标签: c++ iterator sparse-matrix neuroscience

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

1 个答案:

答案 0 :(得分:0)

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

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