c語言調matlab,C語言調試

本文目錄一覽:

c語言如何調用matlab?

1.準備好C語言程序,清楚C語言的入口函數 2.編寫mexfunction函數。mexfunction函數為C語言與MATLAB語言的接口函數。調用實例在mylinedetect.c文件中.在MATLAB中調用mex指令編譯相關文件,將C語言編譯為MEX文件。 3.編譯完成後,生成mylinedetect…

C語言調用matlab函數

matlab中調用c語言函數:

#include “mex.h” //頭文件必須包含mex.h

double mexSimpleDemo(double *y,double a,double b);

//C語言算法程序聲明,在最後調用時,第一

// 個參數是返回結果

//c語言到matlab變換,以mexFunction命名

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

{

double *y;

double m,n;

//獲取輸入變量的數值大小

m=mxGetScalar(prhs[0]);

n=mxGetScalar(prhs[1]);

//獲取輸出變量的指針

plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);

y=mxGetPr(plhs[0]);

//調用子函數

mexSimpleDemo(y,m,n);

}

//C語言函數

double mexSimpleDemo(double *y,double a,double b)

{

return *y=(ab)?a:b;

}

c語言可以在matlab 上運行嗎

呵呵,看來我們有研究相同的問題吧

matlab是一種科學的計算語言,採用的是解釋執行的方式,在配置比較水的機器(比如說我的),運行起來速度不敢恭維,但是他適合工程師用,快速建立起自己的運算平台,很多語法是類似c語言。你可以考察一下matlab的安裝目錄下extern下面lib庫中的函數,可以發現,有很多的c語言代碼,實際上,其內核有很多c的成分。

所以你應該可以明白了,可以運行,但是要把matlab的庫函數包含在c編譯庫中。

你完全可以在extern中的example中,在matlab環境下面運行幾個c代碼試一試,當然所採用的指令是mex(把c語言用於matlab中),mcc把matalb代碼轉化為c代碼,一些具體的參數,你可以用matlab強大的help工具獲得。我們還可以一起探討一下啊,給各郵箱之類的吧,呵呵,很樂意的

在C語言編程中,如何調用MATLAB的繪圖功能?

一、調用Matlab引擎

調用Matlab引擎可以在WIN32、MFC中使用,它的原理實際上相當於打開一個精簡版的Matlab然後往裡面輸命令。下面是調用Matlab中的加法程序add.m的例子。

先在Matlab的work目錄下創建add.m文件並編寫程序如下:

function s = add (a, b) s = a+b;在C程序中,首先打開精簡版的Matlab

Engine *ep = engOpen (NULL);

編譯運行後,會自動打開一個命令行監控窗口,輸入pwd就可以看到當前的工作目錄,於是需要先將工作目錄轉換至存放add.m的目錄: engEvalString (ep, ”cd ..\\..\\work”);

engEvalString是往Matlab里輸命令的函數,顯然我們的目標是成功運行: engEvalString (ep, ”s=add(a,b)”);

目前Matlab中並沒有a和b兩個變量,因此需要在C中初始化這兩個變量並轉換成Matlab基本變量類型mxArray,才能將它們輸入到Matlab中。

如何將C語言轉換成matlab?

matlab 主要使用矩陣,變量是矩陣,運算是矩陣。即使是C語言中的一個簡單變量,matlab也要視它為矩陣。

C語言程序放入matlab使用:

(1)必須改寫main(){},把main(){},變成 matlab 入口函數 mexFunction(){},

(2)其它功能性函數/子程序不需變化。

(3)加頭文件 #include “mex.h”

你需要學習一下mexFunction(){} 如何書寫,參數意義等。這裡就不費筆墨了。

入口函數樣子:

void mexFunction(int nlhs,mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

//一般變量聲明

//檢查輸入輸出參數

//為輸出參數創建矩陣,輸出指針指向它

//輸入指針輸出指針賦值

//調用功能性函數/子程序

}

編譯:

mex my_program.c

怎麼用c語言實現matlab中的功能?

通過把耗時長的函數用c語言實現,並編譯成mex函數可以加快執行速度。Matlab本身是不帶c語言的編譯器的,所以要求你的機器上已經安裝有VC,BC或Watcom

C中的一種。如果你在安裝Matlab時已經設置過編譯器,那麼現在你應該就可以使用mex命令來編譯c語言的程序了。如果當時沒有選,就在Matlab里鍵入mex

-setup,下面只要根據提示一步步設置就可以了。需要注意的是,較低版本的在設置編譯器路徑時,只能使用路徑名稱的8字符形式。比如我用的VC裝在路徑C:\PROGRAM

FILES\DEVSTUDIO下,那在設置路徑時就要寫成:“C:\PROGRA~1”這樣設置完之後,mex就可以執行了。為了測試你的路徑設置正確與否,把下面的程序存為hello.c。

/*hello.c*/

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

mexPrintf(“hello,world!\n”);

}

假設你把hello.c放在了C:\TEST\下,在Matlab里用CD

C:\TEST\

將當前目錄改為C:\

TEST\(注意,僅將C:\TEST\加入搜索路徑是沒有用的)。現在敲:

mex

hello.c

如果一切順利,編譯應該在出現編譯器提示信息後正常退出。如果你已將C:\TEST\加

入了搜索路徑,現在鍵入hello,程序會在屏幕上打出一行:

hello,world!

看看C\TEST\目錄下,你會發現多了一個文件:HELLO.DLL。這樣,第一個mex函數就算完成了。分析hello.c,可以看到程序的結構是十分簡單的,整個程序由一個接口子過程

mexFunction構成。

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

前面提到過,Matlab的mex函數有一定的接口規範,就是指這

nlhs:輸出參數數目

plhs:指向輸出參數的指針

nrhs:輸入參數數目

例如,使用

[a,b]=test(c,d,e)

調用mex函數test時,傳給test的這四個參數分別是

2,plhs,3,prhs

其中:

prhs[0]=c

prhs[1]=d

prhs[2]=e

當函數返回時,將會把你放在plhs[0],plhs[1]里的地址賦給a和b,達到返回數據的目的。

細心的你也許已經注意到,prhs[i]和plhs[i]都是指向類型mxArray類型數據的指針。

這個類型是在mex.h中定義的,事實上,在Matlab里大多數數據都是以這種類型存在。當然還有其他的數據類型,可以參考Apiguide.pdf里的介紹。

為了讓大家能更直觀地了解參數傳遞的過程,我們把hello.c改寫一下,使它能根據輸

入參數的變化給出不同的屏幕輸出:

//hello.c

2.0

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

int

i;

i=mxGetScalar(prhs[0]);

if(i==1)

mexPrintf(“hello,world!\n”);

else

mexPrintf(“大家好!\n”);

}

將這個程序編譯通過後,執行hello(1),屏幕上會打出:

hello,world!

而hello(0)將會得到:

大家好!

現在,程序hello已經可以根據輸入參數來給出相應的屏幕輸出。在這個程序里,除了用到了屏幕輸出函數mexPrintf(用法跟c里的printf函數幾乎完全一樣)外,還用到了一個函數:mxGetScalar,調用方式如下:

i=mxGetScalar(prhs[0]);

“Scalar”就是標量的意思。在Matlab里數據都是以數組的形式存在的,mxGetScalar的作用就是把通過prhs[0]傳遞進來的mxArray類型的指針指向的數據(標量)賦給C程序里的變量。這個變量本來應該是double類型的,通過強制類型轉換賦給了整形變量i。既然有標量,顯然還應該有矢量,否則矩陣就沒法傳了。看下面的程序:

//hello.c

2.1

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

int

*i;

i=mxGetPr(prhs[0]);

if(i[0]==1)

mexPrintf(“hello,world!\n”);

else

mexPrintf(“大家好!\n”);

}

這樣,就通過mxGetPr函數從指向mxArray類型數據的prhs[0]獲得了指向double類型的指針。

但是,還有個問題,如果輸入的不是單個的數據,而是向量或矩陣,那該怎麼處理呢

?通過mxGetPr只能得到指向這個矩陣的指針,如果我們不知道這個矩陣的確切大小,就

沒法對它進行計算。

為了解決這個問題,Matlab提供了兩個函數mxGetM和mxGetN來獲得傳進來參數的行數

和列數。下面例程的功能很簡單,就是獲得輸入的矩陣,把它在屏幕上顯示出來:

//show.c

1.0

#include

“mex.h”

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

double

*data;

int

M,N;

int

i,j;

data=mxGetPr(prhs[0]);

//獲得指向矩陣的指針

M=mxGetM(prhs[0]);

//獲得矩陣的行數

N=mxGetN(prhs[0]);

//獲得矩陣的列數

for(i=0;iM;i++)

{

for(j=0;jN;j++)

mexPrintf(“%4.3f

“,data[j*M+i]);

mexPrintf(“\n”);

}

}

編譯完成後,用下面的命令測試一下:

a=1:10;

b=[a;a+1];

show(a)

show(b)

需要注意的是,在Matlab里,矩陣第一行是從1開始的,而在C語言中,第一行的序數為零,Matlab里的矩陣元素b(i,j)在傳遞到C中的一維數組大data後對應於data[j*M+i]

輸入數據是在函數調用之前已經在Matlab里申請了內存的,由於mex函數與Matlab共用同一個地址空間,因而在prhs[]里傳遞指針就可以達到參數傳遞的目的。但是,輸出參數卻需要在mex函數內申請到內存空間,才能將指針放在plhs[]中傳遞出去。由於返回指針類型必須是mxArray,所以Matlab專門提供了一個函數:mxCreateDoubleMatrix來實現內存的申請,函數原型如下:

mxArray

*mxCreateDoubleMatrix(int

m,

int

n,

mxComplexity

ComplexFlag)

m:待申請矩陣的行數

n:待申請矩陣的列數

為矩陣申請內存後,得到的是mxArray類型的指針,就可以放在plhs[]里傳遞迴去了。但是對這個新矩陣的處理,卻要在函數內完成,這時就需要用到前面介紹的mxGetPr。使用

mxGetPr獲得指向這個矩陣中數據區的指針(double類型)後,就可以對這個矩陣進行各種操作和運算了。下面的程序是在上面的show.c的基礎上稍作改變得到的,功能是將輸

//reverse.c

1.0

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

double

*inData;

double

*outData;

int

M,N;

int

i,j;

inData=mxGetPr(prhs[0]);

M=mxGetM(prhs[0]);

N=mxGetN(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);

outData=mxGetPr(plhs[0]);

for(i=0;iM;i++)

for(j=0;jN;j++)

outData[j*M+i]=inData[(N-1-j)*M+i];

}

當然,Matlab里使用到的並不是只有double類型這一種矩陣,還有字符串類型、稀疏矩陣、結構類型矩陣等等,並提供了相應的處理函數。本文用到編製mex程序中最經常遇到的一些函數,其餘的詳細情況清參考Apiref.pdf。

通過前面兩部分的介紹,大家對參數的輸入和輸出方法應該有了基本的了解。具備了這些知識,就能夠滿足一般的編程需要了。但這些程序還有些小的缺陷,以前面介紹的re由於前面的例程中沒有對輸入、輸出參數的數目及類型進行檢查,導致程序的容錯性很差,以下程序則容錯性較好

#include

“mex.h”

void

mexFunction(int

nlhs,

mxArray

*plhs[],

int

nrhs,

const

mxArray

*prhs[])

{

double

*inData;

double

*outData;

int

M,N;

//異常處理

//異常處理

if(nrhs!=1)

mexErrMsgTxt(“USAGE:

b=reverse(a)\n”);

if(!mxIsDouble(prhs[0]))

mexErrMsgTxt(“the

Input

Matrix

must

be

double!\n”);

inData=mxGetPr(prhs[0]);

M=mxGetM(prhs[0]);

N=mxGetN(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);

outData=mxGetPr(plhs[0]);

for(i=0;iM;i++)

for(j=0;jN;j++)

outData[j*M+i]=inData[(N-1-j)*M+i];

}

在上面的異常處理中,使用了兩個新的函數:mexErrMsgTxt和mxIsDouble。MexErrMsgTxt在給出出錯提示的同時退出當前程序的運行。MxIsDouble則用於判斷mxArray中的數據是否double類型。當然Matlab還提供了許多用於判斷其他數據類型的函數,這裡不加詳述。

需要說明的是,Matlab提供的API中,函數前綴有mex-和mx-兩種。帶mx-前綴的大多是對mxArray數據進行操作的函數,如mxIsDouble,mxCreateDoubleMatrix等等。而帶mx前綴的則大多是與Matlab環境進行交互的函數,如mexPrintf,mxErrMsgTxt等等。了解了這一點,對在Apiref.pdf中查找所需的函數很有幫助。

至此為止,使用C編寫mex函數的基本過程已經介紹完了。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/219927.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-09 11:01
下一篇 2024-12-09 11:01

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • 用Matlab繪製正多邊形

    在這篇文章中,我們將探討如何使用Matlab繪製正多邊形。我們將從以下幾個方面進行闡述: 一、繪製正三角形 正三角形是最簡單的正多邊形之一。要繪製一個正三角形,我們可以使用Matl…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Matlab中addpath的使用方法

    addpath函數是Matlab中的一個非常常用的函數,它可以在Matlab環境中增加一個或者多個文件夾的路徑,使得Matlab可以在需要時自動搜索到這些文件夾中的函數。因此,學會…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28

發表回復

登錄後才能評論