zoukankan      html  css  js  c++  java
  • libsvm文件格式修改

    搞了一个上午啊,伤不起啊:

    还没搞完啊:

      中午有了点思路,何苦保存完数据再这么纠结地修改数据呢?直接在保存源数据的时候,适当修改程序保存成libsvm的格式不就行了吗?

    下午从寺里回来,不到10分钟就搞定的,有木有啊?

    解决方法:

    数字转string函数:

    template <class T>
    string num_to_string(T N)
    {
        strstream ss;
        string s;
        ss << N;
        ss >> s;
        return s;
    }
    

      继续各种转换,但是一个函数内实现:

    string CImageDoc::convert_libsvm_txt(int i,double data)
    {
    	return num_to_string(i)+":"+num_to_string(data)+" ";
    }
    

      ok,就这样就行了,直接调用就搞定啦:

    features_file << convert_libsvm_txt(num,d0);++num;
    					features_file << convert_libsvm_txt(num,d1);++num;
    					features_file << convert_libsvm_txt(num,d2);++num;
    					features_file << convert_libsvm_txt(num,d3);++num;
    

      结果就是libsvm要求的格式:

    16 1:569.573 2:743.441 3:5.6058 4:0.00390875 5:0.125238 6:1026.2 7:5.44271 8:0.00464965 9:0.126855 10:1775.25 11:5.49567 12:0.00434028 13:0.144323 14:734.257 15:5.55484 16:0.0039468 17:0.155071 18:1030.29 
    66 1:9641.52 2:7216.66 3:8.12506 4:0.000332562 5:0.111952 6:1339.52 7:8.1526 8:0.000319694 9:0.100144 10:1948.68 11:8.13107 12:0.000330743 13:0.113047 14:994.402 15:8.13424 16:0.000324731 17:0.11197 18:1266.74 
    0 1:4616.27 2:3289.41 3:7.81044 4:0.000432526 5:0.0986975 6:1640.14 7:7.79356 8:0.000437157 9:0.0870885 10:2161.93 11:7.78078 12:0.00044677 13:0.110117 14:1250.03 15:7.78338 16:0.000441532 17:0.098696 18:1435.79 
    1 1:25583 2:24154.1 3:7.58252 4:0.00104005 5:0.214605 6:518.209 7:7.68982 8:0.000874984 9:0.182076 10:711.462 11:7.5777 12:0.00102684 13:0.214733 14:471.483 15:7.65506 16:0.000911101 17:0.192279 18:558.787 
    

      坛子上wangjunsheng网友给出了代码,非常感谢啊,我还误会他了,纠结啊,再次道歉!

    #include <iostream>
    #include <string>
    using namespace std;
    
    string string_from_filename(const char * filename_)
    {
       if (!filename_ || filename_[0] == '\0') return "";
        FILE* fp = fopen( filename_, "rb" );
        if (!fp)
        {
            return "";
        }
        
        // Get file length
        fseek(fp, 0, SEEK_END);
        int len = ftell( fp );
        fseek(fp, 0, SEEK_SET);
        
        string s = "";
        s.resize(len);
        fread(&s[0], len, 1, fp);
        fclose(fp);
        
        return s;
    }
    
    void convert(const string& raw, string& o)
    {
        const char* s = raw.c_str();
        int cnt = 0;
        bool newline = true;
        char buf[16];
        
        for (; *s; ++s) {
            
            if (newline) {
                if (isdigit(*s)) {
                    while (isdigit(*s)) {
                        o += *s;
                        ++s;
                    }--s;
                    newline = false;    
                } else
                    o += *s;
            } else {
                if (isdigit(*s)) {
                    ++cnt;
                    sprintf(buf, "%d:", cnt);
                    o += buf;
                    while (isdigit(*s) || *s == '.') {
                        o += *s;
                        ++s;
                    }--s;   
                } else {
                    o += *s;
                    if (*s == '\r' || *s == '\n') {
                        newline = true;
                        cnt = 0;
                    }
                }
            }
        }
    }
    
    bool save_to_file(const string& filename_, const string& content)
    {
        if (filename_.empty()) return false;
        FILE* fp = fopen( filename_.c_str(), "wb+" );
        if (!fp)
        {
            return false;
        }
    
        size_t len = content.length();
    
        bool save_success = (len == fwrite(&content[0], 1, len, fp));
    //    if (!save_success) msglog("file save failed : %s", filename_.c_str());
    
        fflush(fp);
        fclose(fp);
    
        return save_success;
    }
    
    
    void main()
    {
        string raw = string_from_filename("新建 文本文档 (2).txt");
        string s;
        convert(raw.c_str(), s);
        save_to_file("new.txt", s);
    }
    

      lvjing_csdn网友提出了更简单的办法:

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <exception>
    #include <stdexcept>
    
    using namespace std;
    
    
    int main()
    {
    	ifstream infile("e:\\test.txt");
    	ofstream outfile("e:\\outfile.txt");
    	if(!infile || !outfile)
    		throw runtime_error("openfile error");
    	string line;
    	while(getline(infile,line))
    	{
    		int temp;
    		double f;
    		istringstream in_line(line);//从当前行中读取数据,亮点啊
    		in_line >> temp;
    		outfile << temp;
    		temp=1;
    		while(in_line >> f)
    			outfile << " " <<temp++ << ":" << f;
    		outfile << endl;
    	}
    	cout << "complete" << endl;
    	return 0;
    }
    

      

  • 相关阅读:
    .net core读取appsettings.config中文乱码问题
    vs2017错误:当前页面的脚本发生错误
    VS Code中无法识别npm命令
    Visual Studio报错/plugin.vs.js,行:1074,错误:缺少标识符、字符串或数字
    记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法
    Java集合框架
    java hash表
    Java Dictionary 类存储键值
    java数据结构 栈stack
    java封装
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2163545.html
Copyright © 2011-2022 走看看