matalb7与VC2008混合编程DLL方法(三)VC调用matlab的DLL库函数

 

本文通过一个例子说明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中的测试函数

测试函数用于调用matlab_c_test函数,以便验证VC程序的运行结果。

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 ++;
  }
  std::cout<<"\n";
 }

 //-<13>----处理第4个返回结果-------------------------------------------------
 // (a) 取返回数据的维数,1维数组返回为1,2维数组返回为2
 iNumberOfDimensions = MatlabOut_4.NumberOfDimensions();
 // (b) 取数据的总的元素个数
 iNumberOfElements = MatlabOut_4.NumberOfElements();
 // (c) 取返回数据的每一维的维数,
 //     得到的下面的mwArray数据是一个维数为1*iNumberOfDimensions的数组,
 //     其中每个元素代表1个维度的维数
 mDim = MatlabOut_4.GetDimensions();
 // (d) 取出数组中的所有数据
 pdOut_4 = new double[iNumberOfElements];
 MatlabOut_4.GetData(pdOut_4, iNumberOfElements);
 // (d) 将数据打印出来
 std::cout<<"第4个数:"<<std::endl;
 for(i=0; i<iNumberOfElements; i++)
 {
  std::cout<<*(pdOut_4+i)<<" ";
 }
 std::cout<<std::endl;

 //-<14>----处理第5个返回结果-------------------------------------------------
 // (a) 取返回数据的维数,1维数组返回为1,2维数组返回为2
 iNumberOfDimensions = MatlabOut_5.NumberOfDimensions();
 // (b) 取数据的总的元素个数
 iNumberOfElements = MatlabOut_5.NumberOfElements();
 // (c) 取返回数据的每一维的维数,
 //     得到的下面的mwArray数据是一个维数为1*iNumberOfDimensions的数组,
 //     其中每个元素代表1个维度的维数
 mDim = MatlabOut_5.GetDimensions();
 // (d) 取出数组中的所有数据
 pdOut_5 = new double[iNumberOfElements];
 MatlabOut_5.GetData(pdOut_5, iNumberOfElements);
 // (d) 将数据打印出来
 std::cout<<"第5个数:"<<std::endl;
 for(i=0; i<iNumberOfElements; i++)
 {
  std::cout<<*(pdOut_5+i)<<" ";
 }
 std::cout<<std::endl;

 //-<15>----释放内存空间-------------------------------------------------------
 delete []pdOut_1;
 delete []pdOut_2;
 delete []pdOut_3;
 delete []pdOut_4;
 delete []pdOut_5;


 //-<16>----结束matlab的mcl----------------------------------------------------
 mclTerminateApplication();

 //-<17>----结束自己编的Matlab的DLL库----------------------
 libmatlab_c_testTerminate();

 //打印结束提示信息
 std::cout<<"The end"<<std::endl;
}

3.程序说明

a.VC程序用mwArray型数据实现VC与matlab的dll函数之间的数据传输.

b.建立VC程序时,选择的工程模板为Win32 Console Application,然后在进行设置(Application Settings)时选择“Empty project”,建好工程后,将上述程序代码考入一个*.cpp文件,然后加入到工程中即可。

c.关于matlab函数打包成dll库的方法和dll库加入VC的方法,可参考见本博客关于“matalb7与VC2008混合编程DLL方法”系列的(一)和(二)。

4.运行结果

用第3节中给出程序可以显示调用matlab的dll函数时的函数返回值,如下图1。

图1.VC调用matlab的Dll函数的结果

可以对比matlab和VC的运行结果验证本文的结果。 

5.需要注意的数据类型问题

在matlab函数输入和输出数据的类型,查看matlab中函数运行结果可以看到(如图2),在matlab中输入和输出数据都是double型的,因此VC程序中matlab的dll函数的返回值都定义为double。 


图2.matlab中的数据类型

猜你喜欢

转载自blog.csdn.net/dreamofnous/article/details/7107523