標籤:c++ libsvm string 類 文本輸入輸出
在使用svm的時候,libsvm無疑是一大利器,有了它,svm的應用簡直是手到擒來啊!
那麼問題來了,產生libsvm資料格式檔案哪家強?
當然使用FormatDatalibsvm.xls這個是so easy了,however在一個程式中如何?自己調用FormatDatalibsvm.xls來組建檔案,我不會啊!
為了把在一個系統中通過特徵提取得到目標的特徵向量轉化成libsvm能使用的格式,就自己動手豐衣足食吧!
下面是這個簡單的小程式:
#include <iostream>#include <string>#include <vector>#include <fstream>#include <sstream> //使用istringstream時需要包含該檔案using namespace std;using std::vector;int main(){struct featureVector{string label;vector<string> values;};string line, word , buff; //分別儲存來自檔案的一行和一個單詞string inAdress, outAdress;cout << "input the infile address"<< endl;cin >> inAdress;cout << "input the outfile address" << endl;cin >> outAdress;ifstream infile(inAdress);//格式如"D://t.txt"ofstream outfile(outAdress);//格式如"D://tt.txt"vector<featureVector> objectPic; //儲存來自檔案的所有記錄while (getline(infile, line)){int i = 0;featureVector info; //建立一個儲存記錄資料的對象 istringstream record(line); //將記錄綁定在剛剛讀入的行record >> info.label; //讀取labelwhile (record >> word) //讀取特徵向量資料{if (i != 0) //每行的第一個為標籤,不用序號{buff = i + '0'; //values是一個string型的vector,所以要將i轉換一下類型info.values.push_back(buff);info.values.push_back(":");info.values.push_back(word); //保持它們}i++;}objectPic.push_back(info); //將此記錄追加到objectPic的末尾}for (const auto &entry : objectPic){ //對objectPic中的每一項int j = 0;outfile << entry.label;for (const auto &nums : entry.values) {if (j%3 == 0) //在每一個向量的值後面才需要加上空格outfile << " ";outfile << nums;j++;}outfile << "\n"; //一條記錄輸出完後換行}getchar();return 0;}
原始目標提取的資料如:
1 23 44 56 89 330 34 55 98 12 781 19 40 60 93 35
則得到的資料如:
1 1:44 2:56 3:89 4:330 1:55 2:98 3:12 4:781 1:40 2:60 3:93 4:35
C++產生libsvm訓練使用資料檔案格式