其实,我们完全不必要理会他的源代码,可以通过vc调用dos中的exe程序来实现调用他所提供的windows下的几个程序,他所提供的Windows下的工具的源代码包含在所提供的源代码中.
比如在vc下调用svm-scale.exe程序,该程序的参数是-s savefilename inputfilename>outfilename
其中>是重定向符,意思是dos命令行执行该命令的时候,将屏幕输出重新定向到outfilename中.
因为在vc中使用的时候,我们需要这些屏幕输出,因此有两种方法
1)采用vc中的管道等方式来截获命令行程序输出,重定向到我们的保存文件
2)修改svm-scale.exe源代码,使他能够在没有重定向的情况下可以自己重定向或者输出到指定文件
管道的方式,有点复杂,初学vc并不是很明白,现在说下第二种方法.
查看svm-scale源代码,可以找到输出部分为下图所示部分:
void output(int index, double value) { /* skip single-valued attribute */ if(feature_max[index] == feature_min[index]) return;
if(value<=feature_min[index]) value = lower; else if(value>=feature_max[index]) value = upper; else value = lower + (upper-lower) * (value-feature_min[index])/ (feature_max[index]-feature_min[index]);
if(value != 0) { printf("%d:%g ",index, value); fprintf(f_out,"%d:%g ",index,value); new_num_nonzeros++; }
}
|
代码中红色加粗的部分就是添加的输出到文件的命令.另外还有label值的输出,换行符的输出,均采取相同的方式,在其向屏幕输出的同时向文件输出,或者干脆不让他向屏幕输出直接写文件就可以了.
这样就可以解决获得命令行输出的问题了.
现在是vc中使用ShellExecute函数来调用外部exe程序了.格式为:
::ShellExecute(NULL,"open","svm-train.exe",s_train_in,".\\svm\\",SW_HIDE);
|
其中,svm-train.exe为运行程序,s_train_in为传输给该程序的参数字符串,".\\svm\\"为程序存在的默认目录,SW_HIDE表示不显示该命令解释窗口,否则为SW_SHOW显示的时候会看到dos窗口闪一下就没有了.
ShellExecute函数的参数说明可以随意查到,不在详述.
这样我们就可以实现在vc下的libsvm的调用,并且又不需要对该算法有详细的了解.需要做的就是知道这些程序需要哪些参数.
获得参数列表可以不带参数在dos行下执行这些命令,或者查看源代码就会知道.
阅读(3991) | 评论(0) | 转发(0) |