声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1036|回复: 3

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

[复制链接]
发表于 2008-3-21 14:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

[ 本帖最后由 eight 于 2008-3-21 23:13 编辑 ]
回复
分享到:

使用道具 举报

 楼主| 发表于 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[24]={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组件
        HRESULT  hr=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[1];
                //数组元素个数
                ubound[0].cElements=24;
                //数组元素所引的下界
                ubound[0].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[1];
                //数组元素个数
                bound[0].cElements=24;
                //数组元素所引的下界
                bound[0].lLbound=0;
                a.parray=SafeArrayCreate(VT_R8,1,bound);
               
                int count=24;
                double data[24];//存放输出数据
                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中出现问题,请高手给予帮助
 楼主| 发表于 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[24]={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组件
        HRESULT  hr=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[1];
                //数组元素个数
                ubound[0].cElements=24;
                //数组元素所引的下界
                ubound[0].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[1];
                //数组元素个数
                bound[0].cElements=24;
                //数组元素所引的下界
                bound[0].lLbound=0;
                out.parray=SafeArrayCreate(VT_R8,1,bound);
               
                int count=24;
                double data[24];//存放输出数据
                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中出现问题,请高手给予帮助
发表于 2008-4-5 16:16 | 显示全部楼层
用到matlab的工具箱的时候,可能会出现问题,建议编译成dll,可能能解决!祝你成功
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-4 20:31 , Processed in 0.073942 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表