0

我必须在我的 C++ 代码中使用工具 SVM Light。我编译并将 SVM Light 链接到我的代码,如http://svmlight.joachims.org/ 但现在我该如何调用

./svm_learn -v 0 -x 1  example1/train.dat example1/model

例如从我的 C++ 代码而不是从命令行?即在原始代码中

./svm_learn -v 0 -x 1  example1/train.dat example1/model

我得到了 svm 模型。我现在如何从我的 C++ 代码中获得相同的模型?最好从我的 C++ 代码中调用一个函数,而不是从命令行调用可执行文件?(可能是我被迫使用系统或类似功能从我的 C++ 代码中调用 C 对象代码(可执行文件)......是这样的吗?)

(我在 Linux 上使用 C++11 编译器)提前致谢

4

2 回答 2

1

我从自己那里找到了一个可能的解决方案。我在这里为任何感兴趣的人发帖。我修改了 svm_learn_main.c,我在这里只留下了一个空的 main。我添加了一个新文件 svm_mylearn.c 和 svm_mylearn.h 。我在 svm_mylearn.c 中复制了原始的 svm_learn_main.c。我在 extern 声明中添加了头文件 svm_mylearn.h。我在 svm_mylearn.h 中移动了函数的签名。我用与 main 相同的代码更改了 svm_my_exec(int,char* []) 中的 main 函数的名称。我修改了makefile,因此为svm_mylearn.c创建了目标代码(.o)后来命名我的.cpp文件Test.cpp我必须这样做:

make all
g++ -c Test.cpp
g++ Test.o svm_learn.o svm_common.o svm_hideo.o svm_mylearn.o    (linking)
./a.out

此外,我忘记了在 Test.cpp 我必须添加这样的 extern 声明:

extern "C" 
{
# include "svm_common.h"
# include "svm_learn.h"
# include "svm_mylearn.h"
} 

并以这种方式调用 svm_my_exec 函数(例如):

const char *comando[]={"./svm_learn" ,"-v", "1", "-x", "1", "-o", 
"2.0", "-k" ,"100", "example1/train.dat", "example1/model"}; 
svm_my_exec(sizeof(comando)/sizeof(char *),comando );
于 2017-05-18T13:41:43.187 回答
0

这个链接http://svmlight.joachims.org/在页面底部的扩展和添加下有一个 DLL 接口。我会从那里开始。

更好的是,在版本历史记录下,在 V6.01 - V6.02 下,第二句话说“更新了 makefile 以添加将 SVM-light 编译到共享对象库中的能力,从而使外部代码可以轻松访问学习和分类功能。 " 应该记录这个库接口。

于 2017-05-16T19:47:02.523 回答