Использование массива итераторов для чтения разреженной информации

В настоящее время я пишу код на 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)

at:

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

Я новичок в C ++ и в программировании без использования Matlab в целом, поэтому прошу прощения, если в этом посте есть какие-то отвратительные ошибки. При этом мне очень трудно ориентироваться в этой сложной структуре. Спасибо!


person Yoni Browning    schedule 16.08.2013    source источник
comment
В этом коде способа слишком много new.   -  person WhozCraig    schedule 17.08.2013


Ответы (1)


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

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

person Igor Tandetnik    schedule 17.08.2013