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-matrix を毎回確認し、その時点でスパイクしたニューロンの数をカウントし、ニューロンがスパイクした場合は、配列内の対応するイテレータをそのベクトル内の次のエントリに移動することで、スパース sudo-matrix をトラバースしようとします。

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 プログラミング全般に慣れていないため、この投稿に凶悪な間違いがあった場合はお詫び申し上げます。そうは言っても、この複雑な構造をナビゲートするのは非常に困難です。ありがとう!

4

1 に答える 1