void CalcMatrix(const vector<CompositeData> data, VVI & RM, VVI & DM, VS & deci_val) { if (data.size() == 0 ) { cerr << "Input data is empty!" << endl; exit(-1); } unsigned int i, j; //Calc Relation Matrix RM.clear(); VI vbTmp(data.size(), 0); RM.insert(RM.begin(), data.size(), vbTmp); for (i = 0; i < data.size(); ++i) { for (j = 0; j < data.size(); ++j) { if (data[i] == data[j]) RM[i][j] = 1; } RM[i][i] = 1; } //Calc Relation Matrix STR2VI_MAP DMap; STR2VI_MAP::iterator it; for (i = 0; i < data.size(); ++i) { it = DMap.find(data[i].d); if (it == DMap.end()) { VI tmp; tmp.push_back(i); DMap.insert(STR2VI_MAP::value_type(data[i].d, tmp)); } else { ((*it).second).push_back(i); } } //DM: n * d //DMap.size() = d DM.clear(); VI viTmp(DMap.size(), 0); DM.insert(DM.begin(), data.size(), viTmp); // cout << DM.size() << "\t" << DM[0].size() << endl; for (i = 0, it = DMap.begin(); it != DMap.end(); ++it, ++i) { deci_val.push_back((*it).first); for (j = 0; j < (*it).second.size(); ++j) { DM[(*it).second[j]][i] = 1; } } DMap.clear(); }
void CalcOmegaMatrix(const VVI & RM, const VVI & DM, VVI & OmegaM) { if (RM.size() == 0 || DM.size() == 0) { cerr << "Size of relation matrix and decison matrix is 0 !" << endl; exit(-1); } //OmegaM: n * d OmegaM.clear(); VI viTmp(DM[0].size(), 0); OmegaM.insert(OmegaM.begin(), RM.size(), viTmp); // cout << OmegaM.size() << "\t" << OmegaM[0].size() <<endl; unsigned int i, j, k; STR2VI_MAP::iterator it; int sum = 0; for (i = 0; i < RM.size(); ++i) { for (j = 0; j < DM[0].size(); ++j) { sum = 0; for (k = 0; k < DM.size(); ++k) { sum += RM[i][k] * DM[k][j]; } OmegaM[i][j] = sum; } } }