2013-08-16 19 views
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編程,所以我很抱歉,如果在這篇文章中有任何令人髮指的失禮。這就是說,我在駕馭這個複雜結構方面遇到很多困難。謝謝!

+1

在這段代碼中有*路*太多'new'。 – WhozCraig

回答

0

如果*train中的任何向量爲空,則spikeIt中的相應迭代器將永遠不會初始化 - 但是您無論如何都會對其進行解引用並將其遞增。這表現出未定義的行爲。

此外,沒有試圖阻止迭代器增加超過其向量的末尾。