matalb7与VC2008混合编程DLL方法(三)VC调用matlab的
本文通过一个例子说明VC中如何调用matlab生成的dll库函数。
1.matlab的m函数文件
% 输入
function [out_int,out_double,out_array_int,out_array_double, out_array_double_other] = ... % '...'是续行符
matlab_c_test(in_int, in_double, in_array_int, in_array_double)
% int型数据的处理
out_int = in_int * 3;
% double型数据的处理
out_double = in_double * 5;
% int型矩阵数据的处理
out_array_int = in_array_int * 2;
% double型矩阵数据的处理
out_array_double = in_array_double * 4;
% double型矩阵数据的处理,该返回矩阵的元素个数不受调用函数的影响
out_array_double_other = [1,2,3,4,5,6,7,8,9,0];
2.测试函数
测试函数用于调用matlab_c_test函数
clc
clear
in_int = 1;
in_double = 1.5;
in_array_int = [1,2,3;4,5,6];
in_array_double = [1.3,2.6,3.3];
[out_int,out_double,out_array_int,out_array_double, out_array_double_other] = ... % '...'是续行符
matlab_c_test(in_int, in_double, in_array_int, in_array_double);
3.VC2008的程序文件
(1)程序源文件
//
// 本程序的作用是演示如何在VC中调用matlab的dll函数,包括其中的参数传递方法
//
//c++流库
#include <iostream>
//matlab的dll头文件
#include "libmatlab_c_test.h"
void main()
{
//循环变量
int i,j,k;
//-<1>----声明并初始化输入数据的维数---------------------------------------
const int iIn_Row_1 = 2;
const int iIn_Column_1 = 3;
const int iIn_Len_1 = iIn_Row_1*iIn_Column_1;
const int iIn_Row_2 = 1;
const int iIn_Column_2 = 3;
const int iIn_Len_2 = iIn_Row_2*iIn_Column_2;
//-<2>----声明并初始化输入数据---------------------------------------------
int in_int = 1;
double in_double = 1.5;
int in_array_int[iIn_Row_1][iIn_Column_1] = {{1,2,3},{4,5,6}};
double in_array_double[iIn_Row_2][iIn_Column_2] = {1.3,2.6,3.3};
//-<3>----初始化matlab的mcl-----------------------------------------------------
if(!mclInitializeApplication(NULL, 0))
{
std::cout<<"mclInitializeApplication is bad"<<std::endl;
return;
}
else
{
std::cout<<"mclInitializeApplication is ok"<<std::endl;
}
//-<4>----初始化用户的matlab函数dll库--------------------------------------
if(!libmatlab_c_testInitialize())
{
std::cout<<"libmatlab_c_testInitialize is bad"<<std::endl;
return;
}
else
{
std::cout<<"libmatlab_c_testInitialize is ok"<<std::endl;
}
//-<5>----matlab函数输入数据定义,并赋值-----------------------------------
// (a) 单个数据的定义赋值
mwArray MatlabIn_int(in_int);
mwArray MatlabIn_double(in_double);
// (b) 数组的定义赋值
// (b.1) int型处理
//声明数组变量,包括数组维数和数据类型
mwArray MatlabIn_array_int(iIn_Row_1, iIn_Column_1, mxINT32_CLASS);
//用int型数组给mwArray数组变量赋初值
MatlabIn_array_int.SetData(&in_array_int[0][0], iIn_Row_1*iIn_Column_1);
// (b.2) double型处理
//声明数组变量,包括数组维数和数据类型
mwArray MatlabIn_array_double(iIn_Row_2,iIn_Column_2, mxDOUBLE_CLASS);
//用double型数组给mwArray数组变量赋初值
MatlabIn_array_double.SetData(&in_array_double[0][0], iIn_Row_2*iIn_Column_2);
//-<6>----matlab函数返回参数个数,需要预先知道-------------------------------
int iNum_MatlabOut = 5;
//-<7>----matlab函数的返回值定义--------------------------------------------
mwArray MatlabOut_1;
mwArray MatlabOut_2;
mwArray MatlabOut_3;
mwArray MatlabOut_4;
mwArray MatlabOut_5;
//-<8>----调用matlab的dll函数-----------------------------------------
try
{
matlab_c_test( iNum_MatlabOut,//返回数据个数
MatlabOut_1,MatlabOut_2,MatlabOut_3,MatlabOut_4,MatlabOut_5,//返回数据
MatlabIn_int, MatlabIn_double, MatlabIn_array_int, MatlabIn_array_double//输入数据
);
}
catch (const mwException& erro)//如果出错,显示出错信息
{
std::cout << erro.what() << std::endl; //显示错误信息
}
//-<9>----输出变量-----------------------------------------------------
double *pdOut_1;
double *pdOut_2;
double *pdOut_3;
double *pdOut_4;
double *pdOut_5;
//double *pdDim;
//-<10>----处理第1个返回结果-------------------------------------------------
// (a) 取返回数据的维数,1维数组返回为1,2维数组返回为2
int iNumberOfDimensions = MatlabOut_1.NumberOfDimensions();
// (b) 取数据的总的元素个数
int iNumberOfElements = MatlabOut_1.NumberOfElements();
// (c) 取返回数据的每一维的维数,
// 得到的下面的mwArray数据是一个维数为1*iNumberOfDimensions的数组,
// 其中每个元素代表1个维度的维数
mwArray mDim = MatlabOut_1.GetDimensions();
// (d) 取出数组中的所有数据
pdOut_1 = new double[iNumberOfElements];
MatlabOut_1.GetData(pdOut_1, iNumberOfElements);
// (d) 将数据打印出来
std::cout<<"第1个数:"<<std::endl;
for(i=0; i<iNumberOfElements; i++)
{
std::cout<<*(pdOut_1+i)<<" ";
}
std::cout<<std::endl;
//-<11>----处理第2个返回结果-------------------------------------------------
// (a) 取返回数据的维数,1维数组返回为1,2维数组返回为2
iNumberOfDimensions = MatlabOut_2.NumberOfDimensions();
// (b) 取数据的总的元素个数
iNumberOfElements = MatlabOut_2.NumberOfElements();
// (c) 取返回数据的每一维的维数,
// 得到的下面的mwArray数据是一个维数为1*iNumberOfDimensions的数组,
// 其中每个元素代表1个维度的维数
mDim = MatlabOut_2.GetDimensions();
// (d) 取出数组中的所有数据
pdOut_2 = new double[iNumberOfElements];
MatlabOut_2.GetData(pdOut_2, iNumberOfElements);
// (d) 将数据打印出来
std::cout<<"第2个数:"<<std::endl;
for(i=0; i<iNumberOfElements; i++)
{
std::cout<<*(pdOut_2+i)<<" ";
}
std::cout<<std::endl;
//-<12>----处理第3个返回结果-------------------------------------------------
// (a) 取返回数据的维数,1维数组返回为1,2维数组返回为2
iNumberOfDimensions = MatlabOut_3.NumberOfDimensions();
// (b) 取数据的总的元素个数
iNumberOfElements = MatlabOut_3.NumberOfElements();
// (c) 取返回数据的每一维的维数,
// 得到的下面的mwArray数据是一个维数为1*iNumberOfDimensions的数组,
// 其中每个元素代表1个维度的维数
mDim = MatlabOut_3.GetDimensions();
// (d) 取出数组中的所有数据
pdOut_3 = new double[iNumberOfElements];
MatlabOut_3.GetData(pdOut_3, iNumberOfElements);
// (d) 将数据打印出来
std::cout<<"第3个数:"<<std::endl;
for(i=0; i<iNumberOfElements; i++)
{
std::cout<<*(pdOut_3+i)<<" ";
}
std::cout<<std::endl;
std::cout<<"第3个数的维数:"<<std::endl;
for(i=1; i<=iNumberOfDimensions; i++)
{
if(i<iNumberOfDimensions)
{
std::cout<<mDim.Get(1,i)<<" * ";
}
else
{
std::cout<<mDim.Get(1,i)<<" "<<std::endl;
}
}
//分行打印第3个数(这是个数组)
std::cout<<"第3个数的分行(每一行对应数组的最低一维)打印:"<<std::endl;
i = 0;
int iCur_dim = (int)(mDim.Get(1,iNumberOfDimensions));
while(i<iNumberOfElements)
{
for(k=0; k<iCur_dim; k++)
{
std::cout<<*(pdOut_3+i)<<" ";
i ++;