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

问题描述 投票:0回答:1

我有一个很长的时间范围,我想在这段时间内存储每次神经元“激发”的时间。由于“开火”是一个离散事件,因此可以通过简单地将每个事件的时间记录到 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++ iterator sparse-matrix
1个回答
0
投票

如果

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

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

© www.soinside.com 2019 - 2024. All rights reserved.