2013-08-16 1 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

В этом коде есть * путь * слишком много 'нового'. – WhozCraig

ответ

0

Если какой-либо вектор в *train пуст, соответствующий итератор в spikeIt никогда не инициализируется, но вы разыскиваете его и увеличиваете его. Это демонстрирует неопределенное поведение.

Кроме того, нет попытки предотвратить итераторы от возрастания конца их векторов.