c語言如何呼叫matlab,C語言呼叫matlab函式

時間 2021-12-19 13:42:51

1樓:育知同創教育

方法1 mcc 生成cpp檔案方式

1、設定專案編譯選項

首先建立乙個新的專案,或者開啟乙個已有的專案,然後選擇選單:

project-> settings-> c/c++category:preprocessorpreprocessor definitions:

新增: msvc,ibmpc,mswindcategory: precompiled headers選擇: automatic use of precompiled headers

through header: stdafx.h2、調設定專案連線選項

首先要從下面幾個函式定義檔案(*.def)生成相應的導入庫檔案(*.lib)

libmmfile.def

libmcc.def

libmatlb.def

libmx.def

libmat.def

2樓:答題太累了

1.準備好c語言程式,清楚c語言的入口函式 2.編寫mexfunction函式。

mexfunction函式為c語言與matlab語言的介面函式。呼叫例項在mylinedetect.c檔案中.

在matlab中呼叫mex指令編譯相關檔案,將c語言編譯為mex檔案。 3.編譯完成後,生成mylinedetect...

c語言呼叫matlab函式

3樓:文件類共創空間

matlab中呼叫c語言函式:

#include "mex.h" //標頭檔案必須包含mex.hdouble mex******demo(double *y,double a,double b);

//c語言演算法程式宣告,在最後呼叫時,第一// 個引數是返回結果//c語言到matlab變換,以mexfunction命名void mexfunction(int nlhs,mxarray *plhs,int nrhs,const mxarray *prhs)

//c語言函式

double mex******demo(double *y,double a,double b)

4樓:緋色春天

matlab中有相關的元件,可以看看matlab的書,我記得有好幾本講了這個內容的書,不過書名記不清楚了。

5樓:匿名使用者

matlab函式呼叫**如下:

#include "mex.h"

#include "matrix.h"

#include "linedetect.h"

#include "string.h"

void mexfunction(int nlhs, mxarray *plhs, int nrhs, const mxarray *prhs)

m = mxgetm(prhs[0]);

n = mxgetn(prhs[0]);

pimg = mxgetpr(prhs[0]);

img_s.data = pimg;

img_s.xsize = m;

img_s.ysize = n;

p=lsd(&img_s);

plhs[1] = mxcreatedoublematrix(1,3,mxreal);

*(mxgetpr(plhs[1])+0) = p->size;

*(mxgetpr(plhs[1])+1) = p->max_size;

*(mxgetpr(plhs[1])+2) = p->dim;

plhs[0] = mxcreatedoublematrix(p->dim,p->max_size,mxreal);

memcpy(mxgetpr(plhs[0]),p->values,(p->max_size)*(p->dim)*sizeof(double));}

6樓:

我也想找到這個方法 我試過混合程式設計 但是可移植性太差了

如何在matlab上執行c語言寫的程式

7樓:刀無極啊

1.準備好c語言程式,清楚c語言的入口函式

2.編寫mexfunction函式。mexfunction函式為c語言與matlab語言的介面函式。

呼叫例項在mylinedetect.c檔案中.在matlab中呼叫mex指令編譯相關檔案,將c語言編譯為mex檔案。

3.編譯完成後,生成mylinedetect.mexw32或mylinedetect.mexw64檔案,此檔案即mex檔案,用於matlab與c語言介面函式.

4.編譯完成之後,編寫matlab函式,呼叫mex檔案。以mex檔案的形式呼叫編譯完成的c語言函式[o1,o2]=mylinedetect(double(x).

');......

5.輸出結果,上述linedetect函式完成影象中直線檢測功能,帶入matlab中呼叫後形成結果。

8樓:渾永修毋嬋

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

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

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

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

在c語言程式設計中,如何呼叫matlab的繪圖功能?

9樓:day忘不掉的痛

一、呼叫

baimatlab引擎

呼叫matlab引擎可以du在win32、mfc中使用,zhi

它的原理實際上dao相當於開啟乙個回精簡版的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中。

10樓:匿名使用者

你這樣想沒

bai有錯,但du是你有沒有考慮

matlab怎麼和c語言鏈結?

11樓:南方小智

如果我有乙個用c語言寫的函式,實現了乙個功能,如乙個簡單的函式:

double add(double x, double y)

現在我想要在matlab中使用它,比如輸入:

>> a = add(1.1, 2.2)

3.3000

要得出以上的結果,那應該怎樣做呢?

解決方法之一是要通過使用mex檔案,mex檔案使得呼叫c函式和呼叫matlab的內建函式一樣方便。mex檔案是由原c**加上mex檔案專用的介面函式後編譯而成的。

可以這樣理解,mex檔案實現了一種介面,它把在matlab中呼叫函式時輸入的自變數通過特定的介面調入了c函式,得出的結果再通過該介面調回matlab。該特定介面的操作,包含在mexfunction這個函式中,由使用者具體設定。

所以現在我們要寫乙個包含add和mexfunction的c檔案,matlab呼叫函式,把函式中的自變數(如上例中的1.1和2.2)傳給mexfunction的乙個引數,mexfunction把該值傳給add,把得出的結果傳回給mexfunction的另乙個引數,matlab通過該引數來給出在matlab語句中呼叫函式時的輸出值(如上例中的a)。

比如該c檔案已寫好,名為add.c。那麼在matlab中,輸入:

>> mex add.c

就能把add.c編譯為mex檔案(編譯器的設定使用指令mex -setup),在windows中,mex檔案型別為mexw32,即現在我們得出add.mexw32檔案。

現在,我們就可以像呼叫m函式那樣呼叫mex檔案,如上面說到的例子。所以,通過mex檔案,使用c函式就和使用m函式是一樣的了。

我們現在來說mexfunction怎樣寫。

mexfunction的定義為:

void mexfunction(

int nlhs,

mxarray *plhs,

int nrhs,

const mxarray *prhs)

可以看到,mexfunction是沒返回值的,它不是通過返回值把結果傳回matlab的,而是通過對引數plhs的賦值。mexfunction的四個引數皆是說明matlab呼叫mex檔案時的具體資訊,如這樣呼叫函式時:

>> b = 1.1; c = 2.2;

>> a = add(b, c)

mexfunction四個引數的意思為:

nlhs = 1,說明呼叫語句左手面(lhs-left hand side)有乙個變數,即a。

nrhs = 2,說明呼叫語句右手面(rhs-right hand side)有兩個自變數,即b和c。

plhs是乙個陣列,其內容為指標,該指標指向資料型別mxarray。因為現在左手面只有乙個變數,即該陣列只有乙個指標,plhs[0]指向的結果會賦值給a。

prhs和plhs類似,因為右手面有兩個自變數,即該陣列有兩個指標,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指標陣列,即不能改變其指向內容。

因為matlab最基本的單元為array,無論是什麼型別也好,如有double array、 cell array、 struct array……所以a,b,c都是array,b = 1.1便是乙個1x1的double array。而在c語言中,matlab的array使用mxarray型別來表示。

所以就不難明白為什麼plhs和prhs都是指向mxarray型別的指標陣列。

完整的add.c如下:

// add.c

#include "mex.h" // 使用mex檔案必須包含的標頭檔案

// 執行具體工作的c函式

double add(double x, double y)

// mex檔案介面函式

void mexfunction(

int nlhs,

mxarray *plhs,

int nrhs,

const mxarray *prhs)

mexfunction的內容是什麼意思呢?我們知道,如果這樣呼叫函式時:

>> output = add(1.1, 2.2);

在未涉及具體的計算時,output的值是未知的,是未賦值的。所以在具體的程式中,我們建立乙個1x1的實double矩陣(使用mxcreatedoublematrix函式,其返回指向剛建立的mxarray的指標),然後令plhs[0]指向它。接著令指標a指向plhs[0]所指向的mxarray的第乙個元素(使用mxgetpr函式,返回指向mxarray的首元素的指標)。

同樣地,我們把prhs[0]和prhs[1]所指向的元素(即1.1和2.2)取出來賦給b和c。

於是我們可以把b和c作自變數傳給函式add,得出給果賦給指標a所指向的mxarray中的元素。因為a是指向plhs[0]所指向的mxarray的元素,所以最後作輸出時,plhs[0]所指向的mxarray賦值給output,則output便是已計算好的結果了。

上面說的一大堆指向這指向那,什麼mxarray,初學者肯定都會被弄到頭暈眼花了。很抱歉,要搞清楚這些亂糟糟的關係,只有多看多練。

實際上mexfunction是沒有這麼簡單的,我們要對使用者的輸入自變數的個數和型別進行測試,以確保

輸入正確。如在add函式的例子中,使用者輸入char array便是一種錯誤了。

從上面的講述中我們總結出,mex檔案實現了一種介面,把c語言中的計算結果適當地返回給matlab罷了。當我們已經有用c編寫的大型程式時,大可不必在matlab裡重寫,只寫個介面,做成mex檔案就成了。另外,在matlab程式中的部份計算瓶頸(如迴圈),可通過mex檔案用c語言實現,以提高計算速度。

c語言中如何函式的多次呼叫,c語言中如何乙個函式的多次呼叫

乙個函式只能有乙個返回值,指標可以返回多個,例如 void aaa int a,c int a,c a a c c a b c b 下面呼叫 a和 c.1.可以使用迴圈語句實現。例如while迴圈語句,計算機的一種基本迴圈模式。當滿足條件時進入迴圈,不滿足跳出。while語句的一般表示式為 whil...

C介面呼叫問題,C 介面如何呼叫

此處稱之為隱式轉換,具體是識別符號隱式轉換還是其他的我記不清了,就是如果乙個變數實現某個介面,或者父類實現某個介面,或者父類的父類實現某個介面,以此類推,就可以直接轉換而不需要寫轉換操作符 ca是classa 型別的.ia是ia型別。兩個型別不一致,當然不能給它賦值 c 怎麼呼叫介面裡的方法?暈 介...

關於c語言指標呼叫函式,關於C語言中指向函式的指標的呼叫問題

第一條紅線是定義乙個函式指標 第二條紅線起強轉作用,把0xd010f0強轉為對應的函式指標型別 我寫的這個程式可以幫你理解.常量位址被printab取代 劃紅線的是宣告了乙個函式指標,這個函式的兩個引數和返回值都是int,然後將0xd 的位址強制轉換為函式啊 同下面類似 typedef int fu...