我目前正在编写一个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编程,所以如果这篇文章中有任何令人发指的失礼,我会道歉。话虽如此,我在浏览这个复杂的结构时遇到了很大的困难。谢谢!
答案 0 :(得分:0)
如果*train
中的任何向量为空,则spikeIt
中的相应迭代器永远不会被初始化 - 但无论如何都要取消引用并递增它。这表现出不确定的行为。
此外,没有尝试阻止迭代器超过其向量的末尾。