В настоящее время я пишу код на 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 в целом, поэтому прошу прощения, если в этом посте есть какие-то отвратительные ошибки. При этом мне очень трудно ориентироваться в этой сложной структуре. Спасибо!
new
. - person WhozCraig   schedule 17.08.2013