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...