gpt4 book ai didi

c++ - Lib svm,如何将 MyModel.mat 转换为 MyModel.model

转载 作者:太空狗 更新时间:2023-10-29 20:45:02 25 4
gpt4 key购买 nike

我有一个 .mat 文件,可以通过 matlab 轻松读取,但我需要将其转换为 C++ 可读的 .model 文件。有没有办法做到这一点(手动或以编程方式)?

最佳答案

您可以将数据矩阵作为任何常规 MAT 文件加载到 MATLAB 中:

load data.mat

然后使用 libsvm MATLAB 接口(interface)附带的 MEX 函数 libsvmwrite,将其写入所谓的“稀疏”格式:

libsvmwrite('data.txt', label_vector, instance_matrix)

如果您谈论的是经过训练的模型而不是数据,快速搜索会显示 this page (我没有亲自测试过)。


编辑:

好的,看起来 the code我提到需要一些调整。下面是我修改后的版本。我使用最新的 libSVM-3.12 对它进行了测试,使用 VS2010 作为编译器:

svm_savemodel.c

#include "../svm.h"
#include "mex.h"
#include "svm_model_matlab.h"

static void fake_answer(mxArray *plhs[])
{
plhs[0] = mxCreateDoubleMatrix(0, 0, mxREAL);
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
struct svm_model *model;
char *filename;
const char *error_msg;
int status;

// check input
if(nrhs != 2) {
mexPrintf("Usage: svm_savemodel(model, 'filename');\n");
fake_answer(plhs);
return;
}
if(!mxIsStruct(prhs[0])) {
mexPrintf("model file should be a struct array\n");
fake_answer(plhs);
return;
}
if(!mxIsChar(prhs[1]) || mxGetM(prhs[1])!=1) {
mexPrintf("filename should be given as char(s)\n");
fake_answer(plhs);
return;
}

// convert MATLAB struct to C struct
model = matlab_matrix_to_model(prhs[0], &error_msg);
if(model == NULL) {
mexPrintf("Error: can't read model: %s\n", error_msg);
fake_answer(plhs);
return;
}

// get filename
filename = mxArrayToString(prhs[1]);

// save model to file
status = svm_save_model(filename,model);
if (status != 0) {
mexWarnMsgTxt("Error occured while writing to file.");
}

// destroy model
svm_free_and_destroy_model(&model);
mxFree(filename);

// return status value (0: success, -1: failure)
plhs[0] = mxCreateDoubleScalar(status);

return;
}

假设您编译了上面的 MEX 文件,下面是一个示例用法:

[labels, data] = libsvmread('./heart_scale');
model = svmtrain(labels, data, '-c 1 -g 0.07');
svm_savemodel(model, 'mymodel.model');

创建的文本文件如下所示:

我的模型.model

svm_type c_svc
kernel_type rbf
gamma 0.07
nr_class 2
total_sv 130
rho 0.426412
label 1 -1
nr_sv 63 67
SV
1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1
0.6646947579781318 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5
.
.

关于c++ - Lib svm,如何将 MyModel.mat 转换为 MyModel.model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11744244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com