zoukankan      html  css  js  c++  java
  • C/C++与Matlab混合编程

         Matlab 拥有丰富的功能,编程简单。不过,有些情况下,Matlab程序的执行速度比较慢。C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些。因此存在一种方案,就是使用Matlab实现我们的实验程序,用C/C++来实现Matlab程序中比较耗时的部分,从Matlab程序中调用C/C++的程序以实现加速。

    Visual C++ 2015

    1:配置环境

    1.1:在vc++目录中

    包含目录:(1):生成的mydll.h所在目录。

              (2):matlab 内的include目录。

    Include files

    D:Program FilesMATLABR2012aexterninclude

    库目录:(1):mydll.lib所在目录。

            (2):matlab的lib目录。

    Library files

    D:New Project手写体数字识别QpPrjdistrib

    D:Program FilesMATLABR2012aexternlibwin64microsoft

    1.2:在连接器-》输入-》附加依赖项  

    mclmcrrt.lib

    libmx.lib

    libmat.lib

    mclmcr.lib

    QpPrj.lib

    将编译好的dll复制到VC工程的Debug或者Release目录下,以使得dll可以被找到。还要把编译生成的QpPrj.h文件拷贝到VC工程里

     

    代码实现:

    #include <iostream>
    #pragma comment(lib,"QpPrj.lib")
    #include "QpPrj.h"
    #include "mclmcr.h"   
    #include "matrix.h"   
    #include "mclcppclass.h"  
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    	// 初始化  
    	if (!QpPrjInitialize())
    	{
    		printf("Could not initialize !");
    		return -1;
    	}
    
    	// 1.调用MyAdd
    	double a = 6;
    	double b = 9;
    	double c;
    
    	// 为变量分配内存空间   
    	mwArray mwA(1, 1, mxDOUBLE_CLASS); // 1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度)   
    	mwArray mwB(1, 1, mxDOUBLE_CLASS);
    	mwArray mwC(1, 1, mxDOUBLE_CLASS);
    
    	// set data,调用类里面的SetData函数给类赋值   
    	mwA.SetData(&a, 1);
    	mwB.SetData(&b, 1);
    
    	// using my add,掉我自己写的函数
    	// 调用示例: extern LIB_QpPrj_CPP_API void MW_CALL_CONV MyAdd(int nargout, mwArray& c, const mwArray& a, const mwArray& b);
    	MyAdd(1, mwC, mwA, mwB);
    
    	// get data,调用类里面的Get函数获取取函数返回值   
    	c = mwC.Get(1, 1);
    	printf("c is %f
    ", c);
    
    	// 2.调用TestChar
    	// extern LIB_QpPrj_CPP_API void MW_CALL_CONV TestChar(int nargout, mwArray& result, const mwArray& char0)
    
    	double d = 4;
    	double e;
    
    	// 为变量分配内存空间   
    	mwArray mwInput(1, 1, mxDOUBLE_CLASS);
    	mwArray mwOutput(1, 1, mxDOUBLE_CLASS);
    
    	mwInput.SetData(&d, 1);
    
    	TestChar(1, mwOutput, mwInput);
    	e = mwOutput.Get(1, 1);
    	printf("e is %f
    ", e);
    
    	char training_result_path[] = "D:\New Project\手写体数字识别";
    	char digital_img_path[] = "D:\hh\t_4.jpg";
    	char training_result_file[] = "training_result_200_trees";
    
    	double f;
    
    	cout << training_result_path << endl;
    	cout << digital_img_path << endl;
    	cout << training_result_file << endl;
    
    	// 为变量分配内存空间
    	mwArray recognition_result(1, 1, mxDOUBLE_CLASS); 
    
    	// 调用示例:extern LIB_QpPrj_CPP_API void MW_CALL_CONV digital_recogn_9(int nargout, mwArray& recognition_result, const mwArray& training_result_path, const mwArray& digital_img_path, const mwArray& training_result_file);
    	digital_recogn_9(1, recognition_result, training_result_path, digital_img_path, training_result_file);
    
    	f = recognition_result.Get(1, 1);
    
    	// 终止调用的程序
    	QpPrjTerminate();
    
    	// terminate MCR
    	mclTerminateApplication();
    
    	return 0;
    
    
    }
    

      

    ... MWMCR::EvaluateFunction error ...

    Error using predict (line 85)

    Systems of uint32 class cannot be used with the "predict" command. Convert the system to an identified model first, such as by using the "idss" command.

    matlab代码

    digital_recogn_9.m

    function   [recognition_result]

    = digital_recogn_9( training_result_path , digital_img_path , training_result_file )

    1 training_result_path 

    训练库路径   ' D:New Project手写体数字识别'

    2 digital_img_path 

    传入的图片路径  ' D:hh _4.jpg '

    3 training_result_file 

    训练库文件名   ' training_result_200_trees '

    调用示例:

    digital_recogn_9('D:New Project手写体数字识别','D:hh _4.jpg','training_result_200_trees')

    function   [recognition_result] = digital_recogn_9( training_result_path , digital_img_path , training_result_file )

     

    input_number = imread(digital_img_path) ;

     

    %%%%%%%%%%%%     image trsformation

    input_number = 255 - rgb2gray(input_number) ;

    threshold_noise = 35 ;

     

    for ii = 1:size(input_number,1)

            for jj = 1:size(input_number,2)

                    if   input_number( ii , jj ) < threshold_noise

                            input_number( ii , jj ) = 0;

                    end    

            end

    end

     

    %%%%%%%%%%%%%%%%%%%%%%%%

    projecting_width = sum(input_number, 1);

    projecting_height = sum(input_number, 2);

     

    %%%%%%%  cut off the boundary

    boundary_width = zeros( size( projecting_width ) );

    boundary_height = zeros( size( projecting_height ) );

    offset_width = 3;

    offset_height = 3;

     

    aa = size( boundary_width , 2) - offset_width + 1  ;

    boundary_width ( 1 , offset_width : aa ) = 1 ;

     

    bb =   size( boundary_height , 1) - offset_height  + 1  ;

    boundary_height ( offset_height : bb , 1 ) = 1 ;

     

    projecting_width = projecting_width .* boundary_width ;

    projecting_height = projecting_height .* boundary_height ;

     

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    threshold_width = max ( projecting_width ) / size(projecting_width , 2 ) ;

    threshold_height = max ( projecting_height ) / size(projecting_height , 1 ) ;

     

    s1 = ( projecting_width > threshold_width ) ;

    new_width = sum(s1) ;

     

    s2 = ( projecting_height > threshold_height ) ;

    new_height = sum(s2) ;

     

    trimming_img = zeros( new_height , new_width );

    trimming_img = uint8(trimming_img) ;

    counter_height =1 ;

    for ii=1 : (size( input_number , 1 ) - 1)

            %%%%%%%   select qualified rows

            if s2( ii , 1 )==true

                counter_height  = counter_height +1 ;

            end

           

            %%%%%%%   select qualified columns

            counter_width =1 ;

            for jj=1 : (size( input_number , 2 ) - 1)

                    if s1( 1 , jj )==true

                        counter_width  = counter_width +1 ;

                    end

                

                    %%%%% copy pixels to new image

                    if s2( ii , 1 ) == true  ||   s1( 1 , jj ) == true      

                            s3 = input_number( ii , jj );

                            trimming_img( counter_height ,  counter_width ) = s3;      

                    end 

            end

    end

     

    %%%%%%%%%% flatten the image

    edge_length =16 ;  %% 16*16=256

    trimming_img = imresize( trimming_img , [edge_length , edge_length] ) ;

    %% 暂时注释 掉

    %%imshow( trimming_img ) ;

     

    flatten_img = reshape( trimming_img , 1 , 256 ) ;

     

    %%%%%%%%%%%%%%%%%%%%%

    cd(  training_result_path )

    %% 加上分号,训练库文件名 ' training_result_200_trees '

    training_result = load( training_result_file );

    Xtest = training_result.Xtest ;

    mdl = training_result.mdl ;

     

    %%%%%%%%%%%%%%%%%%%%%

    image_set = zeros( size(Xtest) ) ;

    image_set  = uint8( image_set  );

     

    for ii=1:size(Xtest, 1)

            image_set( ii ,  : ) = flatten_img(: , :);

    end

     

    %%%%     Train and Predict Using a Single Classification Tree

     

    Xtest = double( image_set );

    %%ypred = predict(mdl, Xtest);

    ypred = predict(mdl, Xtest);

     

    % % Confmat_bag = confusionmat(Ytest,ypred);

     

    %% recognition_result = ypred(1,1);

     

    recognition_result = ypred(1,1);

     

    end

     

    MyAdd.m

    function [c] = MyAdd(a, b)

    %UNTITLED Summary of this function goes here

    %   Detailed explanation goes here

    c = a + b;

     

    end

     

    MyChar.m

    function [result] = MyChar(str)

    %UNTITLED2 Summary of this function goes here

    %   Detailed explanation goes here

    result = str;

     

     

    end

     

  • 相关阅读:
    TortoiseSVN 命令 (命令行执行工具)(转)
    express blend下载
    js绝对地址图片转换成base64的方法
    js判断是否安装flash player及当前版本 和 检查flash版本是否需要升级
    js实现默认或者触发一个事件选中元素内容的方法
    js实现复制功能,将需要复制的内容放入剪切板上
    前端js上传文件插件
    javascript检测浏览器的缩放状态实现代码 是指浏览器网页内容的百分比缩放(按Ctrl和+号键或者-号键的缩放)
    html5 canvas 画图移动端出现锯齿毛边的解决方法
    jquery实现全选/反选功能
  • 原文地址:https://www.cnblogs.com/Bobby0322/p/5381801.html
Copyright © 2011-2022 走看看