VC 6.0 matlabのプログラムを呼び出す方法

6064 ワード

ソフトウェア環境:windows Xp,VC 6.0, Matlab 2010b
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
  • #include "libmyadd2.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