matlab与vc基于COM混合编程中的问题请教
matlab中编译成功的COM组件是否就是一定可以用的。我用的matlab函数中包含有一个叫iddata函数,编译COM组件没有问题。但是在vc中调用就是不成功?请高手给予指教。[ 本帖最后由 eight 于 2008-3-21 23:13 编辑 ]
VC调用Matlab时间序列中的函数中的错误求助
我在Matlab中做了一个函数如下:function y1=ARMA(a,b,c)
yy=a';
z=iddata(yy(1:21));
m=armax(z,'na',b,'nc',c);
y=predict(m,yy,1);
y1=y';
end
在Matlab7中编译成了COM组件没有问题。
但是在vc中调用组件就出现了问题,程序如下
if(FAILED(CoInitialize(NULL)))
{
AfxMessageBox("unable to initialize COM");
return;
}
double A={2.9624,3.2691,3.2835,3.3561,3.2836,3.2707,3.2963,3.4147,3.2958,3.431,3.4138,3.6182,5.8616,5.9554,5.7033,4.1007,4.5352,3.9623,3.4714,3.6218,3.741,3.712,10.12312,12.2423};
IARMA *st=NULL;//创建一个com组件
HRESULThr=CoCreateInstance(CLSID_ARMA,NULL,CLSCTX_ALL,IID_IARMA,(void * *)&st);
if(SUCCEEDED(hr))
{
//定义输入变量并初始化
VARIANT a,b,c;//a表示输入数据组,b与c表示ARMA模型阶数
VariantInit(&a);
VariantInit(&b);
VariantInit(&c);
a.vt=VT_ARRAY|VT_R8;//类型(数组,双精度)
b.vt=VT_R8;
c.vt=VT_R8;
//创建一维数组
SAFEARRAYBOUND ubound;
//数组元素个数
ubound.cElements=24;
//数组元素所引的下界
ubound.lLbound=0;
a.parray=SafeArrayCreate(VT_R8,1,ubound);
a.parray->pvData=A;
b.dblVal=3;
c.dblVal=2;
VARIANT out;//输出数据的指针
VariantInit(&out);
out.vt=VT_ARRAY|VT_R8;//数据类型为数组型
//创建一维数组
SAFEARRAYBOUND bound;
//数组元素个数
bound.cElements=24;
//数组元素所引的下界
bound.lLbound=0;
a.parray=SafeArrayCreate(VT_R8,1,bound);
int count=24;
double data;//存放输出数据
st->ARMA(1,&out,a,b,c);//调用com中的ARMA模型进行预测
memcpy(&data,out.parray->pvData,count*sizeof(double));//将数据从VARIANT类型拷出给data
int i=0;
}
else
{
AfxMessageBox("创建com失败!");
}
每次运行就是在memcpy中出现问题,请高手给予帮助 刚才在仿真论坛的一位高手指导下进行了一些修改。现在不报错误了。但是返回数值的data数值全为0
我在Matlab中做了一个函数如下:
function y1=ARMA(a,b,c)
yy=a';
z=iddata(yy(1:21));
m=armax(z,'na',b,'nc',c);
y=predict(m,yy,1);
y1=y';
end
在Matlab7中编译成了COM组件没有问题。
但是在vc中调用组件就出现了问题,程序如下
if(FAILED(CoInitialize(NULL)))
{
AfxMessageBox("unable to initialize COM");
return;
}
double A={2.9624,3.2691,3.2835,3.3561,3.2836,3.2707,3.2963,3.4147,3.2958,3.431,3.4138,3.6182,5.8616,5.9554,5.7033,4.1007,4.5352,3.9623,3.4714,3.6218,3.741,3.712,10.12312,12.2423};
IARMA *st=NULL;//创建一个com组件
HRESULThr=CoCreateInstance(CLSID_ARMA,NULL,CLSCTX_ALL,IID_IARMA,(void * *)&st);
if(SUCCEEDED(hr))
{
//定义输入变量并初始化
VARIANT a,b,c;//a表示输入数据组,b与c表示ARMA模型阶数
VariantInit(&a);
VariantInit(&b);
VariantInit(&c);
a.vt=VT_ARRAY|VT_R8;//类型(数组,双精度)
b.vt=VT_R8;
c.vt=VT_R8;
//创建一维数组
SAFEARRAYBOUND ubound;
//数组元素个数
ubound.cElements=24;
//数组元素所引的下界
ubound.lLbound=0;
a.parray=SafeArrayCreate(VT_R8,1,ubound);
a.parray->pvData=A;
b.dblVal=3;
c.dblVal=2;
VARIANT out;//输出数据的指针
VariantInit(&out);
out.vt=VT_ARRAY|VT_R8;//数据类型为数组型
//创建一维数组
SAFEARRAYBOUND bound;
//数组元素个数
bound.cElements=24;
//数组元素所引的下界
bound.lLbound=0;
out.parray=SafeArrayCreate(VT_R8,1,bound);
int count=24;
double data;//存放输出数据
st->ARMA(1,&out,a,b,c);//调用com中的ARMA模型进行预测
memcpy(data,out.parray->pvData,count*sizeof(double));//将数据从VARIANT类型拷出给data
int i=0;
}
else
{
AfxMessageBox("创建com失败!");
}
每次运行就是在memcpy中出现问题,请高手给予帮助 用到matlab的工具箱的时候,可能会出现问题,建议编译成dll,可能能解决!祝你成功
页:
[1]