2013-08-16 1 views
1

이론적 신경 과학 문제에 대해 스파이크 열차를 사용하기 위해 현재 C++ 코드를 작성하고 있습니다. 그러나 실제 신경 과학은 제 질문과는 무관합니다. 기본적으로, 나는 긴 시간이있어,이 시간 동안 뉴런이 "발사"할 때마다 나는 저장하고 싶다. "firing"은 이산 이벤트이므로 각 이벤트의 시간을 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; 

}; 

이의지도 부분은 잘 작동합니다. 문제는 내가 주어진 시간 단계에서 얼마나 많은 사건이 발생 하는지를 묻는 것이다. 당신이 기억한다면, 각 뉴런에서 사건이 발생하는 시간 만 저장되기 때문에 이것은 대답하기 쉽지 않은 질문입니다. I 그러므로 반복기 배열 초기화 반복자 이용하는 전략 회전 각 이벤트의 처음과 개별 뉴런에 대응하는 반복자 가리키는

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()는 뉴런 단순히 숫자 , ie, 벡터, 나는 세고있다], 즉 스파이크 벡터의 첫 번째 엔트리. 그때마다 스파이크 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; 
} 

내 문제는 배열의 각 반복기에 액세스하여 현재 시간과 비교하려고 시도하는 것입니다. 그래서,

if(*(spikeIt[i]) ==(*t_now)) 

내가 ++, 일반 비 MATLAB 프로그래밍에 C에 새로운 오전 : 나는

EXC_BAD_ACCESS (코드 = 1, 주소 = 0x0으로)

에서 얻을 이 게시물에 가증스러운 가짜가 있으면 사과드립니다. 이것은 말하기를, 나는이 복잡한 구조를 탐색하는 데 많은 어려움을 겪고있다. 감사!

+1

이 코드에는 * 길 * 너무 많은'new'이 있습니다. – WhozCraig

답변

0

*train의 벡터가 비어있는 경우 spikeIt의 해당 반복자는 초기화되지 않지만 어쨌든 역 참조하고 증가시킵니다. 이것은 정의되지 않은 동작을 나타냅니다.

또한 이터레이터가 벡터의 끝을 지나서 증가하지 않도록하려는 시도는 없습니다.