Mam taki kod:
// (...)
struct i_BMU {
int x,y, x2,y2; // współrzędne pierwszego i drugiego BMU
};
typedef list<double> vec;
list<char> Decision; // decyzja kojarzona z każdym neuronem
list<vec> xx; // lista wektorow wejsciowych (probki uczace)
string getClusterNo(int x, int y) {
string out;
char txt[5];
if (clusters[x][y] > 0) {
sprintf(txt, "%d", clusters[x][y]);
out.assign(txt);
}
else
out.assign("?");
return out;
}
i_BMU Run(vec x) {
// "uruchamia" sieć i zwraca nr zwycięzcy
double min = 1e10, cur_d;
int win_x=-1,win_y=-1; // neuron zwyciezca (BMU = Best Matching Unit)
int win2_x=-1,win2_y=-1; // neuron, ktory jest kolejnym BMU
for (int xp=0; xp<mapsize_x; xp++) {
for (int yp=0; yp<mapsize_y; yp++) {
cur_d = neurony[xp][yp].d(x); // oblicz odleglosc wektora x od wektora W neuronu
if (min > cur_d) {
min = cur_d;
win_x = xp; win_y = yp;
}
}
}
// szukanie 2nd BMU wśród sąsiadów BMU
min = 1e10;
for (int xp=-1; xp<=1; xp++)
for (int yp=-1; yp<=1; yp++) {
if ((xp==0 && yp==0) || win_x+xp < 0 || win_x+xp >= mapsize_x || win_y+yp < 0 || win_y+yp >= mapsize_y)
continue;
cur_d = neurony[win_x+xp][win_y+yp].d(x); // oblicz odleglosc wektora x od wektora W neuronu
if (min > cur_d) {
min = cur_d;
win2_x = win_x+xp; win2_y = win_y+yp;
}
}
return (i_BMU){win_x,win_y, win2_x,win2_y};
}
// (...)
int main(...) {
// (....)
else if (backtest) {
LoadNet();
GetInputDataTeach();
cout << endl << rpad("Generating backtest..."," ",40) << flush;
plik_out.assign("backtest/");;
plik_out.append("file.btst");
FILE *fo = fopen(plik_out.c_str(), "wb");
sprintf(c_txt,"%d %d ",mainTF, time1st);
fputs(c_txt, fo);
//--- zapisz odpowiedzi sieci na poszczególne dane wejściowe
list<vec>::iterator xit=xx.begin();
char decision[2];
list<char>::iterator Dit;
con_STO(); // zapamiętanie stanu konsoli używając kodów konsoli
for (no=0; xit!=xx.end(); ++xit, no++) { // **************************
if (no % 9 == 0) {
con_RCL(); // odtworzenie stanu konsoli
sprintf(c_txt, "%.2f%% ", (double)no/P*100);
cout << progress_signs[no % 4] << " " << c_txt << flush; // pokaż, że pracuje
}
i_BMU winner = Run(*xit); // przetworzenie wektora
sprintf(c_txt, "%s", getClusterNo(winner.x,winner.y).c_str());
fputs(c_txt, fo);
Dit = Decision.begin();
advance(Dit, mapsize_x*winner.y + winner.x);
sprintf(decision, "%c", *Dit);
fputs(decision, fo);
fputs("\n", fo);
}
fclose(fo);
cout << "OK" << endl;
}
} // main
i nie wiem, dlaczego pętla oznaczona gwiazdkami (********) szybko zaczyna zwalniać, aż w końcu wlecze się okropnie.
Lista xx zawiera od 2000 do 4000 elementów. Proszę o jakąś radę.