中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

windows系統下C++調用matlab程序的方法詳解

發布時間:2020-09-23 12:01:08 來源:腳本之家 閱讀:190 作者:MachineLP 欄目:編程語言

前言

之前已經跟大家介紹了在ubuntu系統下C++調用matlab程序的方法,需要的朋友們可以參考這篇文章,本文將給大家介紹關于windows下C++調用matlab程序的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

實驗平臺:

   matlab R2016b   VS2013

思路:

     1. 設置matlab的編譯器,使用外部的VC或者gcc等編譯器。

     2. 編譯m文件成dll

     3. 設置VS的Include路徑和lib鏈接庫的路徑

     4. 編寫C++調用dll

步驟:

1.    設置matlab的編譯器

在命令行窗口下,輸入并執行如下命令:mex –setup

在出現的編譯器中,選擇VS2013

然后在輸入命令:mbuild –setup 同樣選擇VS2013

2.    編寫.m文件

如下函數時完成圖像的分割功能,第一個參數是圖像的文件名(路徑),第二個參數是分割圖像閾值的大小;完成分割后,將圖像保存為result.bmp;返回值則是原圖像的數據;

function imagedata=improcess(filename,threshold); 
imagedata=double(imread(filename)); 
newbuf=imagedata; 
[M N]=size(imagedata); 
for i=1:1:M 
 for j=1:1:N 
  if imagedata(i,j)>threshold 
   newbuf(i,j)=255; 
  else 
   newbuf(i,j)=0; 
  end 
 end 
end 
imwrite(uint8(newbuf),'result.bmp'); 
return; 

3.    編譯.m文件

mcc -W cpplib:pr_lib -T link:lib improcess.m

解釋:其中-W是控制編譯之后的封裝格式;

cpplib,是指編譯成C++的lib;

cpplib冒號后面是指編譯的庫的名字;

-T表示目標,link:lib表示要連接到一個庫文件的目標,目標的名字即是.m函數的名字。

編譯完成之后,pr_lib.h pr_lib.libpr_lib.dll這三個文件時我們在c++中調用所需要的;這三個文件和我們用c++編寫dll時,生成的三個文件時對應的;

VS中的調用步驟

1.    設置VC環境

將matlab的頭文件路徑和對應的庫文件路徑包含到VS;在VS中,點項目屬性然后在‘VC++目錄目錄'選項卡中,將包含目錄的最后一行,添加matlab相關的頭文件;如我的matlab對應的路徑為:

........\MATLAB\R2016b\extern\include

........\MATLAB\R2016b\extern\include\win64

將庫目錄,將matlab相關的靜態鏈接庫的路徑加入其中:

........\MATLAB\R2016b\extern\lib\win32\microsoft

將鏈接器->輸入:

libeng.lib
libmat.lib
libmex.lib
mclmcrrt.lib
pr_lib.lib

2.    新建一個基于控制臺的hello World程序;

2.1    添加必須的頭文件和必須的靜態鏈接庫

如果在上面的鏈接庫中添加了lib, 下面只需要加入頭文件就可以了。

#pragma comment(lib,"mclmcrrt.lib") 
#pragma comment(lib,"libmx.lib") 
#pragma comment(lib,"libmat.lib") 
#include "matrix.h" 
#include "stdafx.h" 
#include <iostream> 
#include "pr_lib.h" 

2.2    將matlab編譯生成的pr_lib.h pr_lib.libpr_lib.dll文件拷貝到工程目錄下;并將頭問價和靜態鏈接庫添加到工程中:

#pragma comment(lib,"pr_lib.lib")
#include "pr_lib.h"

2.3    編輯main函數,調用improcess函數;

int main(int argc, char* argv[]) 
{ 
 //初始化, 在C++調用matlab時,必須要進行初始化。 
 if( !pr_libInitialize()) 
 { 
  printf("Could not initialize !"); 
  return -1;  
 } 
 char f_name[10]="lenna.pgm"; 
//必須將lenna.pgm圖像,拷貝到工程目錄下 
 mwArray file_name(f_name);//'lenna.pgm' 
 mwArray m_threshold(1,1, mxDOUBLE_CLASS); 
 m_threshold(1,1)=128;//閾值為128 
 mwArray ImageData(512,512, mxDOUBLE_CLASS); 
 improcess(1,ImageData,file_name,m_threshold); 
//1,表示返回值的個數,ImageData用于接收返回值 
 printf("\n圖像處理結束,已經圖像以閾值128分割開!\n"); 
 double *resultdata=new double[512*512]; 
 ImageData.GetData(resultdata,512*512); 
 printf("\n已獲得圖像數據...\n"); 
 for(int i=0;i<512;i++) 
 { 
  for(int j=0;j<512;j++) 
  { 
   printf("%0.1f ",resultdata[512*i+j]); 
  } 
  printf("\n"); 
 } 
 delete []resultdata; 
 // 后面是一些終止調用的程序 
 // terminate the lib  
 pr_libTerminate();   
 return 0; 
} 

解析:從上面的程序我們可以看出,c++與matlab函數數據傳遞是借助matlab定義的mwArray類完成的!該類支持的數據類型有:

/*typedef enum
 {
 mxUNKNOWN_CLASS = 0,
 mxCELL_CLASS,
 mxSTRUCT_CLASS,
 mxLOGICAL_CLASS,
 mxCHAR_CLASS,
 mxVOID_CLASS,
 mxDOUBLE_CLASS,
 mxSINGLE_CLASS,
 mxINT8_CLASS,
 mxUINT8_CLASS,
 mxINT16_CLASS,
 mxUINT16_CLASS,
 mxINT32_CLASS,
 mxUINT32_CLASS,
 mxINT64_CLASS,
 mxUINT64_CLASS,
 mxFUNCTION_CLASS,
 mxOPAQUE_CLASS,
  mxOBJECT_CLASS}*/

同時我們應注意:mwArray類定義的對象數組,其坐標仍然是從1開始,而不是像c++那樣,從0開始!mwArray的更詳細的用法,可以參看mclcomclass.h

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣武区| 汉川市| 漳平市| 泌阳县| 达州市| 南平市| 壶关县| 酉阳| 颍上县| 蒙自县| 太仓市| 邻水| 台南县| 长丰县| 济源市| 视频| 金寨县| 鸡东县| 勃利县| 塔河县| 西丰县| 徐汇区| 巴楚县| 盐津县| 汕尾市| 阳新县| 乌拉特后旗| 积石山| 喀喇沁旗| 永康市| 康平县| 西贡区| 来凤县| 容城县| 南投县| 聊城市| SHOW| 确山县| 留坝县| 东乌珠穆沁旗| 清河县|