From f9e3d038c131a2e657aabe7f852fa2074bffa23c Mon Sep 17 00:00:00 2001 From: zzh Date: Mon, 18 Sep 2023 01:35:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=BB=99=E5=AE=9A=E7=9A=84=E6=96=87=E4=BB=B6=E5=A4=B9=E4=B8=8B?= =?UTF-8?q?=E7=9A=84=E6=89=80=E6=9C=89=E5=AD=90=E7=9B=AE=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E9=AB=98=E6=96=AF=E6=B7=B7=E5=90=88=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E6=8B=9F=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GMM/gmm_result.mat | Bin 0 -> 1656 bytes GMM/main.cpp | 88 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 GMM/gmm_result.mat diff --git a/GMM/gmm_result.mat b/GMM/gmm_result.mat new file mode 100644 index 0000000000000000000000000000000000000000..1abd344012dbd146dacc69ee0776424cd5d02576 GIT binary patch literal 1656 zcmV-;28a1gK~zjZLLfCRFd$7qR4ry{Y-KDUP;6mzW^ZzBIv`L(S4mDbG%O%Pa%Ew3 zWn>_4ZaN@MZ*Cw{WpE%dI3O@FIx#ppGdLhJFfubBARr(hARr(hARr(hARr(hARr(h zARr(hARr(hARr(hARr(hARr(B00000000000ZB~{0002v1ONbdoGpueI1>mQ$H&Yh zFVEAGs7rFLLTW{N!SDAZZMikY2xVU8ZJv{t$X%4wlp~dnhw@00t5DBUh$Y66bE_jE zqhw<9_At}5WOvzSyIp#VU`*;Ny1cd2PSbXq=%@GFI0MyN~vl&=+4r z!QC-ypQZZX*c53VdgC2<5d!ik1yZQKT5chuP5_<_h$r<(!LqET*+kI=$%@!QKZkoD z614QS`t^ZEB%`f+6CF}K0~uBpQ*gz2KK8gzpR;My^Bd+3&w;m0$I_;41U!m3BwOh? zsDF}J6(%)-m~XaWwkZP4FG(IzW@g}cHl%Lt6~jhx+oQXeS3+L+nUtLO!@x@!EMKE7 zhnq`J)ecF8;1rau+099F7JmA^XLtQumL`pooo#>O{vOgMy&3YdL2%W5F>syU0JNoI&qnniw5;AzUgGo^#wwbh zHXF;qHScn;xc>q07egsw`dvU_x~hci5s*>N`8O|E2T=`ooR=OF>zKNum)FFu5qqTq+=okI{$o%Fk9GzMjQCl7nrc7lHQUTc4YGSDKH zu2_BA7WGVx#(Z2Ik&*1{5@QgAl+;v*x_mc$QRTHhDrFx|%!>}m5~=7=$?eK>WTI}d zH2uSt7}U0jnT^=xgYSJy1KC_U(k$%46~rJcncB_X|HcyE2-o+`O>;2x{y9qO9y(rH zaYc(2bO2Sn_&rV~&Zw{xx!u{u#G&cKKgM`_<9Alu`NsY0v647ZD_&xWudZH|vtxsC z?%HbMf!bYIv;7Fal)N4JE|X##CwB~~Oms;ojzIfj&StTj5^^kj>2zAg9l{C(Br?cyC=INrN^?^~M`2~iN9TEnJ|6x|)ie&| z9Rv5)5yl}e$DNh`iw;(6-KjMjC847ckF@Z+4Cs%z`}=ClT*JYjg$;WN18 zo*&jKQh{f5f1=@+Uf7kC5pP#G3gvZ0ZS`pjz#0n3YS)p%ZARPA*@i@vsyK7@mj=Pq zd!my{nt=z^8s^zna=6dzIpq0f7X0F-N2+ehAUF5OwPcPQW6f-g0}DEy9J} z250Om<}9DF=HCJP6PgPT6hv*aZ}@)M*3^E3{hk#?6H8~Dw6_ud6Mu2eQF{P}31TCo C9~S`t literal 0 HcmV?d00001 diff --git a/GMM/main.cpp b/GMM/main.cpp index 647b5a4..ace5ff6 100644 --- a/GMM/main.cpp +++ b/GMM/main.cpp @@ -10,6 +10,8 @@ #include #include #include +#include +#include #ifdef _WIN32 #include #include @@ -22,6 +24,7 @@ using namespace std; using std::cout; using std::vector; +namespace fs = std::filesystem; /* 从mat文件中读取给定名称的矩阵数据,并获取矩阵的行列数值 */ template @@ -39,7 +42,7 @@ T* ReadMatlabMat(const string &filePath, const string &mtxName, int *pRowNum, in pMxArray = matGetVariable(pMatFile, mtxName.c_str()); //获取.mat文件里面名为matrixName的矩阵 rowNum = mxGetM(pMxArray); colNum = mxGetN(pMxArray); - cout << rowNum << " " << colNum << endl; + // cout << rowNum << " " << colNum << endl; matData = (double*)mxGetData(pMxArray); //获取指针 dst = new T[rowNum * colNum]; @@ -145,10 +148,10 @@ void GMMToFactorEY(GMM& gmm, double binWidth, vector &vYBin, vector topEle = pqTopM.top(); pqTopM.pop(); - cout << topEle.first << '\t' << topEle.second << endl; + // cout << topEle.first << '\t' << topEle.second << endl; zoomFactorSum += topEle.first / topEle.second; } - cout << endl; + // cout << endl; double zoomFactor = zoomFactorSum / topM; @@ -311,15 +314,84 @@ void processTxtData(const string& filePath) { ifs.close(); } +/* 处理一个知识颗粒 */ +struct ThreadParam { + fs::path matFilePath; + fs::path outFilePath; +}; +void ThreadProcessData(const ThreadParam& param) { + const fs::path& matFilePath = param.matFilePath; + const fs::path& outFilePath = param.outFilePath; + // cout << parrentPath.string() << '\t' << matFilePath.filename().string() << endl; + cout << outFilePath.string() << endl; + double* hs = nullptr; + int rowNum = 0; + int colNum = 0; + + hs = ReadMatlabMat(matFilePath.string(), "hs", &rowNum, &colNum); + + vectorvXBin; + vectorvYBin; + vectorvEY; + vectorvFactor; + /* 用来保存数据,存入mat文件 */ + vectorvDist(rowNum); + vectorvFactorAll; + for (int i = 0; i < rowNum; ++i) { + PutXtoBin(hs + i * colNum, colNum, 0.2, vXBin, vYBin); + + GMM gmm(1, 2); // 1维, 2个高斯模型 + gmm.Train(vXBin.data(), vXBin.size()); + + GMMToFactorEY(gmm, 0.2, vYBin, vFactor, vEY); + vDist[i] = CorrelationDistance(vYBin, vEY); + vFactorAll.insert(vFactorAll.end(), vFactor.begin(), vFactor.end()); + } + /* 写入matlab文件 */ + MATFile* pMatFile = matOpen(outFilePath.string().c_str(), "w"); + SaveMatrix(vFactorAll.data(), pMatFile, "factor", rowNum, 6); + SaveMatrix(vDist.data(), pMatFile, "correlation", rowNum, 1); + matClose(pMatFile); + + delete[] hs; +} + int main(int argc, char** argv) { - //if (argc != 2) - // cerr << "This program should take one argument(input data file)!" << endl; + if (argc != 4) { + cerr << "This program should take 3 arguments(1.parrent Dir; 2. mat file suffix; 3. out mat filename)!" << endl; + return 1; + } + string parrentDir(argv[1]); // 知识颗粒的父目录名称 + string hsMatSuffix(argv[2]); // hs矩阵对应的mat文件的后缀名(可以是全文件名,可以是文件名后缀,必须保证唯一) + fs::path outFileName(argv[3]); + vector vThread; + clock_t begin, finish; + begin = clock(); - + /* 遍历所有的知识颗粒目录,注意进行处理 */ + for (auto& childDir : fs::directory_iterator(parrentDir)) { + // cout << childDir.path().string() << endl; + fs::path outFilePath = childDir / outFileName; + for (auto& file : fs::directory_iterator(childDir)) { + // cout << file.path().filename().string() << endl; + const string& fileName = file.path().filename().string(); + auto rPos = fileName.rfind(hsMatSuffix); + if (rPos != string::npos && fileName.size() - rPos == hsMatSuffix.size()) { + ThreadParam tParam = { file, outFilePath }; + vThread.push_back(thread(ThreadProcessData, tParam)); + // ThreadProcessData(tParam); + } + } + } + for (auto& thread : vThread) { + thread.join(); + } + finish = clock(); + cout << "Total time:" << (double)(finish - begin) / CLOCKS_PER_SEC << endl; // processMatData(argv[1]); - processMatData("D:\\Twirls\\runtime\\ALS_test\\1775\\twirls_id_abs2class_hs.mat"); - processTxtData("D:\\Twirls\\backup\\xy.txt"); + // processMatData("D:\\Twirls\\runtime\\ALS_test\\1775\\twirls_id_abs2class_hs.mat"); + // processTxtData("D:\\Twirls\\backup\\xy.txt"); return 0; } \ No newline at end of file