我有一个很长的时间范围,我想在这段时间内存储每次神经元“激发”的时间。由于“开火”是一个离散事件,因此可以通过简单地将每个事件的时间记录到 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))
如果
*train
中的任何向量为空,则 spikeIt
中相应的迭代器永远不会被初始化 - 但无论如何你都会取消引用并递增它。这表现出未定义的行为。
此外,没有尝试阻止迭代器递增超过其向量的末尾。