fang5720 发表于 2008-3-21 14:35

matlab与vc基于COM混合编程中的问题请教

matlab中编译成功的COM组件是否就是一定可以用的。我用的matlab函数中包含有一个叫iddata函数,编译COM组件没有问题。但是在vc中调用就是不成功?请高手给予指教。

[ 本帖最后由 eight 于 2008-3-21 23:13 编辑 ]

fang5720 发表于 2008-3-21 14:51

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中出现问题,请高手给予帮助

fang5720 发表于 2008-3-21 18:14

刚才在仿真论坛的一位高手指导下进行了一些修改。现在不报错误了。但是返回数值的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中出现问题,请高手给予帮助

tigerhead099 发表于 2008-4-5 16:16

用到matlab的工具箱的时候,可能会出现问题,建议编译成dll,可能能解决!祝你成功
页: [1]
查看完整版本: matlab与vc基于COM混合编程中的问题请教