VC 6.0 matlabのプログラムを呼び出す方法
6064 ワード
ソフトウェア環境:windows Xp,VC 6.0, Matlab 2010b
1、テストm関数を作成する.これは変わらない.
2、mbuild-setupを実行してコンパイラを設置した後(私が選んだのはvc 6.0のコンパイラで、MATLABが持参したものではありません)、利用
必要なlibmyadd 2を生成します.dll,libmyadd2.h,libmyadd2.lib,libmyadd2.ctfファイル.(R 2010 bでは、mcc-W cpplib:libmyadd 2-T link:lib myadd 2.mはlibmyadd 2.ctfファイルを生成しません.-Cオプションを追加する必要があります)
3、VCの下でコンソールプログラムを新規作成し、ステップは以下の通りである:file>new、Win 32 Console Applicationを選択し、右側project nameを記入する
、OKをクリックします.次の画面で「a simpleアプリケーション」finishポイントOKを選択します.これでプログラムフレームワークを組み立て、libmyadd 2.dll,libmyadd2.h,libmyadd2.libとlibmyadd 2.ctfをtestmyadd 2_にコピーr 2010 bプロジェクトディレクトリの下.
libmyadd 2.h Header filesグループに追加します.
4、プロジェクトに必要な設定を行う(ここではVC 2005とは大きく異なることに注意).vcメインインタフェースはproject>Settingsに入り、C/C++タブをクリックし、CategoryはPreprocessorを選択し、Additional include directoriesの下に次のパスを入力します.
(注意2010 bではこの経路は以前とも異なる).
「link」タブをクリックし、CategoryはGeneralを選択し、次のObject/library modulesの欄の最後に追加します.
libmyadd2.lib mclmcrrt.lib
2つのライブラリ間および他のライブラリはスペースで区切られています.次にCategoryはinputを選択し、Additional library pathの下に記入します.
F:\MATLAB\R2010b\extern\lib\win32\microsoft
、OKをクリックします.これで構成が完了しました.
5、testmyadd 2_を開くr2010b.cppファイル、#include“stdafx.h”の後に追加 #include #include "libmyadd2.h"
(ここではinclude「mclmcr.h」と「mclcppclass.h」は不要であることに注意してください.2010 bで生成された「libmyadd 2.h」にはこの2つのヘッダファイルが含まれているからです).その後main関数に次のコードを追加します.
そしてOK
6,中で最も巻かれているのはmwArrayであり,mwArrayと一般配列の違いを以下のコードで詳細に理解できる.
a = 1, 2 3, 4 5, 6 a(1,1)=1 a(1,2)=4 a(2,1)=2 a(2,2)=5 a(3,1)=3 a(3,2)=6
1、テストm関数を作成する.これは変わらない.
function [y,z] = myadd2(a, b)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end
2、mbuild-setupを実行してコンパイラを設置した後(私が選んだのはvc 6.0のコンパイラで、MATLABが持参したものではありません)、利用
mcc -W cpplib:libmyadd2 -T link:lib myadd2.m -C
必要なlibmyadd 2を生成します.dll,libmyadd2.h,libmyadd2.lib,libmyadd2.ctfファイル.(R 2010 bでは、mcc-W cpplib:libmyadd 2-T link:lib myadd 2.mはlibmyadd 2.ctfファイルを生成しません.-Cオプションを追加する必要があります)
3、VCの下でコンソールプログラムを新規作成し、ステップは以下の通りである:file>new、Win 32 Console Applicationを選択し、右側project nameを記入する
testmyadd2_r2010b
、OKをクリックします.次の画面で「a simpleアプリケーション」finishポイントOKを選択します.これでプログラムフレームワークを組み立て、libmyadd 2.dll,libmyadd2.h,libmyadd2.libとlibmyadd 2.ctfをtestmyadd 2_にコピーr 2010 bプロジェクトディレクトリの下.
libmyadd 2.h Header filesグループに追加します.
4、プロジェクトに必要な設定を行う(ここではVC 2005とは大きく異なることに注意).vcメインインタフェースはproject>Settingsに入り、C/C++タブをクリックし、CategoryはPreprocessorを選択し、Additional include directoriesの下に次のパスを入力します.
F:\MATLAB\R2010b\extern\include
(注意2010 bではこの経路は以前とも異なる).
「link」タブをクリックし、CategoryはGeneralを選択し、次のObject/library modulesの欄の最後に追加します.
libmyadd2.lib mclmcrrt.lib
2つのライブラリ間および他のライブラリはスペースで区切られています.次にCategoryはinputを選択し、Additional library pathの下に記入します.
F:\MATLAB\R2010b\extern\lib\win32\microsoft
、OKをクリックします.これで構成が完了しました.
5、testmyadd 2_を開くr2010b.cppファイル、#include“stdafx.h”の後に追加
(ここではinclude「mclmcr.h」と「mclcppclass.h」は不要であることに注意してください.2010 bで生成された「libmyadd 2.h」にはこの2つのヘッダファイルが含まれているからです).その後main関数に次のコードを追加します.
std::cout << "Hello world!" << std::endl;
/* Initialize the MCR */
if( !mclInitializeApplication(NULL,0) )
{
std::cout << "Could not initialize the application!" << std::endl;
return -1;
}
// initialize lib
if( !libmyadd2Initialize())
{
std::cout << "Could not initialize libmyadd2!" << std::endl;
return -1;
}
try
{
// declare and initialize a
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData;
aData = new double[4];
int i;
for( i=0; i<4; ++i)
{
aData[i] = 1.0*i;
}
// print output
std::cout << "a = " << std::endl;
std::cout << aData[0] << ",\t" << aData[1] << std::endl;
std::cout << aData[2] << ",\t" << aData[3] << std::endl;
a.SetData(aData, 4);
// declare and initialize b
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1,1) = 11.;
b(1,2) = 12.;
b(2,1) = 21.;
b(2,2) = 22.;
mwArray y(2, 2, mxDOUBLE_CLASS);
mwArray z(2, 2, mxDOUBLE_CLASS);
// call the function
myadd2(2, y, z, a, b);
// copy data from mwArray to C++ objects
// allocate outputs
double *yData, *zData;
yData = new double[4];
if( yData == NULL )
{
std::cout << "Failed to allocate memory for yData!" << std::endl;
return -1;
}
zData = new double[4];
if( zData == NULL )
{
std::cout << "Failed to allocate memory for zData!" << std::endl;
return -1;
}
// copy data from mwArray to C++
y.GetData(yData, 4);
z.GetData(zData, 4);
// print output
std::cout << "y = " << std::endl;
std::cout << yData[0] << ",\t" << yData[1] << std::endl;
std::cout << yData[2] << ",\t" << yData[3] << std::endl;
std::cout << "z = " << std::endl;
std::cout << zData[0] << ",\t" << zData[1] << std::endl;
std::cout << zData[2] << ",\t" << zData[3] << std::endl;
// deallocate memory
delete [] aData;
delete [] zData;
delete [] yData;
}
catch( const mwException& e)
{
std::cerr << e.what() << std::endl;
}
// terminate the lib
libmyadd2Terminate();
// terminate MCR
mclTerminateApplication();
そしてOK
6,中で最も巻かれているのはmwArrayであり,mwArrayと一般配列の違いを以下のコードで詳細に理解できる.
mwArray a(3, 2, mxDOUBLE_CLASS);
double *aData;
aData = new double[6];
int iii;
for( iii=0; iii<6; ++iii)
{
aData[iii] = iii+1;
}
// print output
std::cout << "a = " << std::endl;
std::cout << aData[0] << ",\t" << aData[1] << std::endl;
std::cout << aData[2] << ",\t" << aData[3] << std::endl;
std::cout << aData[4] << ",\t" << aData[5] << std::endl;
a.SetData(aData, 6);
std::cout << "a(1,1)="<<a(1,1)<<std::endl;
std::cout << "a(1,2)="<<a(1,2)<<std::endl;
std::cout << "a(2,1)="<<a(2,1)<<std::endl;
std::cout << "a(2,2)="<<a(2,2)<<std::endl;
std::cout << "a(3,1)="<<a(3,1)<<std::endl;
std::cout << "a(3,2)="<<a(3,2)<<std::endl;
実行結果図:【1つの配列から多次元配列への組織方式が列優先】a = 1, 2 3, 4 5, 6 a(1,1)=1 a(1,2)=4 a(2,1)=2 a(2,2)=5 a(3,1)=3 a(3,2)=6