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 Files\MATLAB\R2012a\extern\include
库目录:(1):mydll.lib所在目录。
(2):matlab的lib目录。
Library files
D:\New Project\手写体数字识别\QpPrj\distrib
D:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft
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\n", 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\n", 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\t_4.jpg '
3 training_result_file
训练库文件名 ' training_result_200_trees '
调用示例:
digital_recogn_9('D:\New Project\手写体数字识别','D:\hh\t_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
|
C/C++与Matlab混合编程的更多相关文章
- C++和MATLAB混合编程-DLL
先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...
- java matlab混合编程之返回值Struct类型
java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...
- WPF(C#)与MATLAB混合编程
WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...
- VC 与Matlab混合编程之引擎操作详解
Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便. Matlab 是一款将数值分析.矩阵计算.信 ...
- VS/Qt C++和Matlab混合编程
最近两天在搞C++和Matlab混合编程,这个中间过程真是让人心酸啊,最后还是搞定成功!现在把这个过程记录一下. 首先自己的电脑本来就安装着matlab2013b,按着网上的说法首先需要输入!mcc, ...
- C++和MATLAB混合编程求解多项式系数(矩阵相除)
摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...
- matlab混合编程向导(vc,vb,.net...)
一.matlab与vc混编 1.通过mcc将matlab的m文件转化为cpp,c文件或dll供vc调用: 这方面的实现推荐精华区Zosco和ljw总结的方法(x-6-1-4-3-1和2) ...
- Matlab混合编程
Matlab混合编程 混合编程目的 在Matlab中采用混合编程目的主要包括 利用已有的函数库,避免重复工作 加速计算,特别是减少循环所用时间 利用GPU等进行异构编程 混合编程方法-mex函数 目前 ...
- C#Matlab混合编程类 初始化问题解决方法
************** 异常文本 ************** System.TypeInitializationException: “myPlus.matClass”的类型初始值设定项引发异 ...
- 国内第一部C#.Net调用Matlab混合编程视频教程
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录:[目录]Matlab和C#混合编程文章目录 一.视频说明 2014年的5.1,我将这套视频教 ...
随机推荐
- 安装Arch Linux
参考自:https://wiki.archlinux.org/index.php/Main_Page_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 用fdisk建立分区 ...
- 10.5.2 Boot Block 启动块 - 操作系统教程
简单一篇文章明白地讲解了计算机操作系统的启动过程 OPERATING SYSTEM CONCEPTS ABRAHAM SILBERSCHATZ PETER BAER GALVIN GREG GAGNE ...
- nginx的worker_processes,worker_cpu_affinity及worker_connections
worker_processes:nginx要开启的进程数,一般为cpu的核数 worker_cpu_affinity:为每个进程绑定一个cpu,减少cpu切换的开销 配置示例: worker_pro ...
- java中PriorityQueue优先级队列使用方法
优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...
- 协程并发框架gevent及其用法
gevent是python的一个并发框架,采用协程实现并发目的,用起来也非常简单 gevent的docs:http://www.gevent.org/contents.html 一个最简单的例子: i ...
- iOS开发UI篇—Modal简单介绍
iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...
- echarts入门基础,画折线图
注意:一定要自己引入echarts库 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- lua MVC框架 Orbit初探
介绍 http://keplerproject.github.io/orbit/ Orbit是lua语言版本的MVC框架. 此框架完全抛弃CGILUA的脚本模型, 支持的应用, 每个应用可以卸载一个单 ...
- JS---------IIFE(Imdiately Invoked Function Expression 立即执行的函数表达式)
+function($){}(jQuery); 今天看到js代码里面有这个格式的代码,不知道啥意思,就去查了一下,我也是js小白.首先前面的+号,这个不是固定非要写+号,只要写一级运算符都可以.目的是 ...
- C/C++ 结构体 函数传递
#include <stdio.h> #include <stdlib.h> struct student{ int num; ]; double dec; }; void s ...