📄 ann1dn.cpp
字号:
N--;
else if (I == -1)
I = i;
}
float tmp, min, max;
vector<float> vmean, vdisp, vmin, vmax;
//////////get mean, max,min of every feature////////////
for (int x = 0; x < vector_length; x++) {
float *ivec = rec->entries[I]->vec;
tmp = 0.0f;
min = ivec[x];
max = ivec[x];
for (int y = 0; y < (int)rec->entries.size(); y++) {
if (rec->entries[y] == 0) continue;
ivec = rec->entries[y]->vec;
tmp += ivec[x];
if (ivec[x] > max) max = ivec[x];
if (ivec[x] < min) min = ivec[x];
}
vmean.push_back(tmp / float(N));
vmax.push_back(max);
vmin.push_back(min);
}
///////get std of every feature////////////////////////
for (int x = 0; x < vector_length; x++) {
float *ivec;
tmp = 0.0f;
for (int y = 0; y < (int)rec->entries.size(); y++) {
if (rec->entries[y] == 0) continue;
ivec = rec->entries[y]->vec;
tmp += (ivec[x] - vmean[x]) * (ivec[x] - vmean[x]);
}
tmp = sqrt(tmp / float(N - 1));
vdisp.push_back(tmp);
}
///////write normalization coeffs to input layer///////
for (int n = 0; n < pann->get_layer(0)->get_neurons_number(); n++) {
pann->get_layer(0)->get_neuron(n)->get_input_link(0)->set_add_term(-vmin[n]);
switch (normalization) {
case MINMAX:
pann->get_layer(0)->get_neuron(n)->set_function(ANeuron::LINEAR);
if (fabs(float(vmax[n] - vmin[n])) != 0.0f)
pann->get_layer(0)->get_neuron(n)->get_input_link(0)->set_weight(1.0f / (vmax[n] - vmin[n]));
break;
default:
case ZSCORE: //zscore
pann->get_layer(0)->get_neuron(n)->set_function(ANeuron::LINEAR);
if (vdisp[n] != 0.0f)
pann->get_layer(0)->get_neuron(n)->get_input_link(0)->set_weight(1.0f / vdisp[n]);
break;
case SIGMOIDAL: //sigmoidal
pann->get_layer(0)->get_neuron(n)->set_function(ANeuron::SIGMOID);
if (vdisp[n] != 0.0f)
pann->get_layer(0)->get_neuron(n)->get_input_link(0)->set_weight(1.0f / vdisp[n]);
break;
}
}
///////write normalization coeffs to input layer///////
}
///////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////data loading routines/////////////////////////////////////////////////////////
int read_line(FILE *f, wchar_t *buff, int *c)
{
wint_t res = 0;
wchar_t *pbuff = buff;
while ((short)res != EOF) {
res = fgetwc(f);
if (res == 0xD || res == 0xA) {
if (pbuff == buff) continue;
*pbuff = 0;
if (!c) {
return 1;
} else {
int ptr = (int)wcslen(buff) - 1;
while (ptr > 0) { //skip thru 'spaces' dir/asds.f ___1__ \n
if (buff[ptr] != 0x20) break;
else ptr--;
}
while (ptr > 0) { //skip thru 'clas type'
if (buff[ptr] == 0x20) break;
else ptr--;
}
if (ptr) {
*c = _wtoi(&buff[ptr+1]);
while (buff[ptr] == 0x20) //remove blanks from end of string
buff[ptr--] = 0;
} else
*c = 0;
return 1;
}
}
if ((short)res != EOF) {
*pbuff++ = (char)res;
}
}
return (short)res;
}
/*
format 1 //data stored in separate files: ECG,FOUR
file1 [class]
file2 [class]
...
format 2 //data stored in this file
file1 [class]
vec1 ...
file2 [class]
vec1 ...
...
*/
/*
read class data to PTSTREC struct
*/
void read_class(FILE *fp, PREC rec, int c)
{
wchar_t ustr[_MAX_PATH], *pstr;
int res = 1, cls;
int entrsize = (int)rec->entries.size(); //size from previous read iteration
while (res > 0) {
res = read_line(fp, ustr, &cls);
if (res > 0) {
if (c && !cls) //put default if (c=1,2 and cls=0)
cls = c;
CSignal *sig = new CSignal(ustr);
if (sig->N && sig->M) { //read file FORMAT 1.*
if (!vector_length)
vector_length = sig->M;
else {
if (vector_length != sig->M) {
wprintf(L"fmt1.*: vector %s (lenght %d) is not equal to vlen: %d", ustr, sig->M, vector_length);
exit(1);
}
}
for (int j = 0; j < sig->N; j++) {
if (normalization == 4)
sig->nenergy(sig->data[j], vector_length);
if (normalization == 5)
sig->nminmax(sig->data[j], vector_length, 0.1f, 0.9f);
PENTRY entry = new ENTRY;
entry->vec = sig->data[j];
entry->size = vector_length;
swprintf(entry->fname, L"%s_%d", ustr, j);
entry->cls = cls;
rec->entries.push_back(entry);
}
signals.push_back(sig);
}
else { //FORMAT 2
//[filename] [class]
//samples
float tmp;
vector<float> fvec;
while (fwscanf(fp, L"%f", &tmp) == 1)
fvec.push_back(tmp);
if (fvec.size() == 0) {
wprintf(L"fmt2: vector %s has zero lenght", ustr);
exit(1);
}
if (!vector_length)
vector_length = (int)fvec.size();
else {
if (vector_length != (int)fvec.size()) {
wprintf(L"fmt2: vector %s (lenght %d) is not equal to vector_length: %d", ustr, fvec.size(), vector_length);
exit(1);
}
}
pstr = new wchar_t[_MAX_PATH];
wcscpy(pstr, ustr);
if (normalization == 4)
sig->nenergy(&fvec[0], vector_length);
if (normalization == 5)
sig->nminmax(&fvec[0], vector_length, 0.1f, 0.9f);
float *fdata = new float[vector_length];
for (int i = 0; i < vector_length; i++)
fdata[i] = fvec[i];
PENTRY entry = new ENTRY;
entry->vec = fdata;
entry->size = vector_length;
wcscpy(entry->fname, pstr);
entry->cls = cls;
rec->entries.push_back(entry);
delete sig;
}
}// if(res > 0) line was read from file
}// while(res > 0) res = read_line(fp,ustr, &cls);
fclose(fp);
//arrange indices of classes
if ((int)rec->entries.size() > entrsize) {
//find new classes in entries not in rec->clsnum array
for (int i = entrsize; i < (int)rec->entries.size(); i++) {
int cls = rec->entries[i]->cls;
bool match = false;
for (int j = 0; j < (int)rec->clsnum.size(); j++) {
if (cls == rec->clsnum[j]) {
match = true;
break;
}
}
if (!match) //no match
rec->clsnum.push_back(cls);
}
//clsnum = [cls 1][cls 2] ... [cls N] N entries
//clsnum = [1][2][3] or [3][1][2] or ... may be not sorted
if (rec->clsnum.size() > rec->indices.size()) {
vector<int> indices;
int s = (int)(rec->clsnum.size() - rec->indices.size());
for (int i = 0; i < s; i++)
rec->indices.push_back(indices);
}
//arrange indices
for (int i = 0; i < (int)rec->clsnum.size(); i++) {
//fill positions of clsnum[i] class to indices vector
for (int j = entrsize; j < (int)rec->entries.size(); j++) {
if (rec->clsnum[i] == rec->entries[j]->cls)
rec->indices[i].push_back(j);
}
}
}
}
//////////////////data loading routines/////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
void get_file_name(wchar_t *path, wchar_t *name)
{
int sl = 0, dot = (int)wcslen(path);
int i;
for (i = 0; i < (int)wcslen(path); i++) {
if (path[i] == '.') break;
if (path[i] == '\\') break;
}
if (i >= (int)wcslen(path)) {
wcscpy(name, path);
return;
}
for (i = (int)wcslen(path) - 1; i >= 0; i--) {
if (path[i] == '.')
dot = i;
if (path[i] == '\\') {
sl = i + 1;
break;
}
}
memcpy(name, &path[sl], (dot - sl)*2);
name[dot-sl] = 0;
}
int parse_path(wchar_t *path, wchar_t *dir, wchar_t *name) //true if dirs equal
{
int res;
int i;
for (i = (int)wcslen(path) - 1; i > 0; i--) {
if (path[i] == '\\')
break;
}
if (i) { //path + name
wcscpy(name, &path[i+1]);
path[i] = 0;
res = wcscmp(dir, path);
wcscpy(dir, path);
} else { //no path
res = wcscmp(dir, L"");
wcscpy(dir, L"");
wcscpy(name, path);
}
return res; //res=0 if dir and path\filename are equal
}
//////////////////////////////////////////////////////////////////////////////////////////
void msec_to_time(int msec, int& h, int& m, int& s, int& ms)
{
ms = msec % 1000;
msec /= 1000;
if (msec < 60) {
h = 0;
m = 0;
s = msec; //sec to final
} else {
float tmp;
tmp = (float)(msec % 60) / 60;
tmp *= 60;
s = int(tmp);
msec /= 60;
if (msec < 60) {
h = 0;
m = msec;
} else {
h = msec / 60;
tmp = (float)(msec % 60) / 60;
tmp *= 60;
m = int(tmp);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -