當前位置:首頁 » 編程軟體 » matlab混合編譯

matlab混合編譯

發布時間: 2023-04-01 10:10:58

1. C++ Builder 與matlab混合編程編譯錯誤

1、標志符錯誤念伏 2、第34行沒有; 3、 4、36行沒有; 5 6、字元型指針不姿飢能賦給mxArray_tag 7、43行仔冊攜缺;

2. matlab與java混合編程有什麼作用

Java和matlab混合編程

如果用Matlab和java混合編程開發Windows的應用程序則可以實現優勢互補,縮短開發時間,降低程序設計的復雜度。同時程序可以脫離Matlab環境獨立運行,在工程計算和教學實踐中都具有實際意義。
1.使用java調用Maltab函數的基本方法是:通過Java Builder實現Java調用Matlab。在Java環境中直接調用Matlab所生成的Jar包。

下面以在Java中產生任意維數的魔方矩陣,計算任意矩陣的特徵向量和特徵值,對兩組數據進
行擬合並繪制擬合曲線三個實例來說明通過Java
Builder實現Java調用Matlab的過程。傳統的純Java編程實現上述實例非常復雜,甚至很難完成。這一問題在Matlab中只需要調用幾個
函數即可完成。

1.1、將Matlab函數包裝成Java類

首先在Matlab中編寫三個M文件:

Eig.m

function [v,d]=Eig(input)

format long

[v,d]=eig(input);

End

Magic.m

function f =Magic( input )

f=magic(input);

end

Plot.m

function Plot(x,y )

p=polyfit(x,y,3);

t=min(x):max(x)/100:max(x);

s=polyval(p,t);

plot(x,y,'*',t,s);

title('數據擬合結果');

xlabel('x');

ylabel('y');

end

其次,在Matlab中新建一個Deployment
Project,名稱為MyProject.prj,類型為Java
package。在Project中新建三個Class,分別為GetEig,GetMagic,PolyFit。將
Eig.m,Magic.m,plot.m分別添加到上述Class中。之後點擊Builder the project,等待編譯成功即可。

1.2、在Java中調用Matlab函數

新建一個Java類JavaMatlab,並引入相關的包。

import com.mathworks.toolbox.javabuilder.*;//引入Matlab相關包

import MyProject.*;//引入建立的包及類

調用時Java與Matlab之間的參數傳遞需要通過MWNumericArray完成。具體的調用代碼如下:

package org.genius.ExpandJava;

import MyProject.*;

import com.mathworks.toolbox.javabuilder.*;

public class JavaMatlab {

public static void main(String[] args) {

MWNumericArray a = null; // 用於保存矩陣

MWNumericArray ax = null; // 用於保存矩陣

MWNumericArray ay = null; // 用於保存矩陣

Object[] result = null; // 用於保存計算結果

GetEig getEig = null;

GetMagic getMagic=null;

PolyFit polyFit=null;

int r = 4; // 魔方矩陣維數

int array[][]={{50,-20,0},{-20,80,60},{0,60,-70}};

double x[]={0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1};

double y[]={-0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.3,11.2};

try {

//產生魔方矩陣並列印

a = new MWNumericArray(r, MWClassID.DOUBLE);

getMagic = new GetMagic();

result = getMagic.Magic(1,a);

System.out.println("產生的四維魔方矩陣:");

System.out.println(result[0]);

MWArray.disposeArray(result);

//計算所給矩陣的特徵向量和特徵值並列印結果

a = new MWNumericArray(array, MWClassID.DOUBLE);

getEig = new GetEig();

result = getEig.Eig(2, a);

System.out.println("原始矩陣:");

System.out.println(a.toString());

System.out.println("得到的特徵向量:");

System.out.println(result[0]);

System.out.println("得到的特徵值:");

System.out.println(result[1]);

MWArray.disposeArray(result);

ax = new MWNumericArray(x, MWClassID.DOUBLE);

ay = new MWNumericArray(y, MWClassID.DOUBLE);

polyFit = new PolyFit();

result=polyFit.Plot(ax,ay);

polyFit.waitForFigures();

} catch (Exception e) {

System.out.println("Exception: " + e.toString());

}

finally {

// 釋放本地資源

MWArray.disposeArray(a);

MWArray.disposeArray(ax);

MWArray.disposeArray(ay);

MWArray.disposeArray(result);

getEig.dispose();

getMagic.dispose();

polyFit.dispose();

}

}

}

3. matlab與c混合編程,engOpen()的問題,matlab引擎啟動不了

使用engOpen()打開Matlab引擎總是失敗,問題可能就是Matlab組件沒有注冊。注冊方法:點擊開始/運行/cmd,在命令行提示窗口下更改到Matlab安裝路徑/bin,運行指令
matlab/regserver,注冊成功後會彈出Matlab 命令窗口。

4. vc++ matlab混合編程 fsolve

這個可以有四種方法實現:
(1)將Matlab程序編譯成 C/C++源文件並嵌入VC++;
(2)在C/C++程序中利用 Matlab engine調用 Matlab函數;
(3)在C/C++程序中直接使用 Matlab C/C++ Math Library;
(4)將.m文件編鬧鬥鬥譯成 *.dll文件嵌入到 VC++的程序中。
自己上銷喚網查一下。

不過告訴你一個簡單的,在matlab的工作窗口執行:
mbuild -setup

按提示操作
然後執行
met -setup
完成後,到VC裡面,應該會出現met工液磨程選項,然後操作就很簡單了。

5. 請問大神,在VC++和matlab混合編程中,結構體如何轉換成mwArray形式的

1. VC調用Matlab Engine的方式:
Matlab Engine是一組Matlab提供的介面函數,支持C/C++語言,Matlab Engine採用C/S(客戶機/伺服器)模式,Matlab作為後台伺服器,而C/C++程序作為前台客戶機,向Matlab Engine傳遞執行命令和數據信息,從Matlab Engine接收執行結果。用戶可以在前台應用程序中調用這些介面函數,實現對Matlab Engine的控制。採用這種方法幾乎能利用Matlab全部功能,但是需要在機器上安裝Matlab軟體,缺點是執行效率較低。下面簡單介紹下這種方式的實現步驟:
1.1 API介面介紹
先來介紹一組Matlab提供的引擎API介面:(僅作簡單功能介紹,詳細參數說明請參考Matlab幫助)
Engine* engOpen(const char* startcmd)啟動Matlab引擎
int engClose(Engine* ep) 關閉Matlab引擎
int engEvalString(Engine* ep, const char* string)執行Matlab表達式
mxArray* engGetArray(Engine* ep, const char* name)獲取一個變數數組的值
int engPutArray(engine* ep, const mxArray* mp)設置一個變數數組的值
int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上
mxArray *engGetVariable(Engine *ep, const char *name)獲取一個變數
int engOutputBuffer(Engine* eP,char* p,int n)獲取輸出字元串

1.2 VC環境配置
要想在VC集成環境下調用Matlab引擎實現VC和Matlab的混合編程,一般需要經過以下幾個必要的步驟:(以下以Matlab2008a和VS2005版本為例)
(1)添加include路徑:將「\extern\include」(在Matlab的安裝路徑下)路勁添加到VC編譯器的include下
(2)添加lib路徑:將「\extern \lib\win32\microsoft」 (在Matlab的安裝路徑下) 路徑添加到VC編譯器的lib下
(3)載入lib:需要載入至少libmx.lib、libmat.lib、libeng.lib三個庫
(4)include頭文件:在要使用 engine 函數的地方包含engine.h頭文件

1.3 引擎調用
接下來就可以在VC中調用Matlab引擎了,簡單的示例代碼如下:

#include "engine.h"

#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")

void TestDeno()
{
Engine* pEng = NULL;
if (!(pEng = engOpen(NULL)))
{
printf("Open matlab enging fail!");
return;
}

//call Engine plot A*sin(t)+B A=2 B=1

mxArray *A = NULL;

double init = 2;
A = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));
engPutVariable(pEng, "A", A);

init = 1;
memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));
engPutVariable(pEng, "B", A);

mxDestroyArray(A);

Sleep(3*60*1000);

engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");

if(NULL != pEng)
{
engClose(pEng);
}
}

示例代碼通過VC調用Matlab引擎,繪制正弦曲線,相對簡單,就不再詳細解釋,效圖如下:

2. VC調用Matlab DLL的方式
DLL是一個可執行的二進制文件。把很多通用的功能放在DLL中,可以供各種應用程序調用,這樣可以很好的減少外部存儲空間的佔有量,並實現代碼的共享。Matlab也支持將m程序編譯成dll,供其他語言(包括VC、VB、Fortran等)調用,下面先簡單介紹下Matlab DLL的編譯步驟:
2.1 Matlab DLL製作
(1)配置Matlab的編譯器跟,要將mex和mbuil兩個都配置成本機上安裝的VC,mbuild的配置方法同mex
(2)編譯m函數成為dll,在matlab命令空間中使用mcc命令編譯m文件:(mcc的使用參考Matlab幫助)
示例:將一個Matlab函數MyFun 編譯成libMyFun 的命令:
mcc –W cpplib:libMyFun –T link:lib MyFun
參數說明:-W控制編譯之後的封裝格式,cpplib表示c++的lib,冒號之後是編譯輸出lib名,-T表示目標,link:lib表示連接到lib的目標,MyFun是待編譯的m文件名,編譯成功之後,會輸出三個文件:libMyFun.lib libMyFun.dll libMyFun.h

2.2 DLL在VC中調用
要想在VC集成環境下調用Matlab的DLL,實現VC和Matlab的混合編程,一般需要經過以下幾個必要的步驟:(以下以Matlab2008a和VS2005版本為例)
(1)VC環境配置,同前面VC調用Matlab引擎方式類似,也需要配置VC的編譯環境,其中include路徑、lib路徑和前一種方式相同,載入的lib變更為:mclmcrrt.lib、libmx.lib、libmat.lib、mclmcr.lib四個,include的頭文件變更為:mclmcr.h、matrix.h、mclcppclass.h三個。
(2)DLL中函數的調用,先看一下m函數編譯成C++Dll之後的函數聲明,例:matlab函數:function [y, out] = CaculateFun(x, in)編譯之後對應c++的聲明:void MW_CALL_CONVCaculateFun(int nargout, mwArray& y, mwArray& out, const mwArray& x, const mwArray& in)參數int nargout指定調用時,輸出參數的個數,緊跟的後續nargout個參數y、out為輸出參數,後續再剩下的多個參數x、in就為輸入參數。
(3)注意事項:在VC中調用dll中的函數之前,需要先調用函數libFunInitialize初始化,在調用完函數以後,需要再調用函數libFunTerminate和mclTerminateApplication終止。
准備好了上述步驟,就可以在VC中調用DLL中函數的了,簡單的示例代碼如下:

// include matlab sys head file
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"

// include lib head file
#include "libCaculateFun.h"

// link matlab sys lib
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "mclmcr.lib")

// link lib
#pragma comment(lib, "libCaculateFun.lib")

void TestDeno()
{
// init lib
if (!(libCaculateFunInitialize()))
{
std::cout<<"Could not init lib !"<<endl;
return -1;
}

double xxxx[2] = {0};
double inin = 0;

double yyyy[2] = {0};
double outo = 0;

// 為函數參數分配內存空間
mwArray mwXX(1, 2, mxDOUBLE_CLASS);
mwArray mwIn(1, 1, mxDOUBLE_CLASS);

mwArray mwYY(1, 2, mxDOUBLE_CLASS);
mwArray mwOut(1, 2, mxDOUBLE_CLASS);

// 為輸入參數賦值
mwXX.SetData(&xxxx, 2);
mwIn.SetData(&inin, 1);

// 調用計算函數
CaculateFun(2, mwYY, mwOut, mwXX, mwIn);

// 獲取輸出參數
outo = mwOut.Get(1, 1);

// lib Terminate
libCaculateFunTerminate();

// MCR Terminate
mclTerminateApplication();
}

6. matlab與linux混合編程! 求解呀!

1,matlab命令行下輸入mex -setup,得到已安裝的編譯器,選擇編譯器。

2,mbuild -setup,得到已安裝的編譯環境,選擇編譯環境。

3,mcc -W cpplib:string[編譯好後想得到的庫名] -T link:lib string[想要編譯的.m文件名()]
其中-W是控制編譯之後的封裝格式,cpplib,是指編譯成C++的lib,cpplib冒號後面是指編譯的庫的名字,-T表示目標,link:lib表示褲賣棚要連接到一個庫文件的目標,即你寫的m函數的名字。(文件名都不包含後綴名)

4,得到.dll(動態鏈接庫),.lib(導出庫),.h(頭文件),.ctf

5,建立工程,將以上文件放入目錄配首,並將matlab內置的.lib庫文件路徑及.h頭文件路徑放入path中。包含matlab/extern/include(包含了內置頭文件),matlab/extern/lib/win32/microsoft/msvc50(包含內置.lib文件)

6,將mclmcrrt.lib libmx.lib libmat.lib mclmcr.lib靜態庫以及得到的導入庫文件鏈接進來。

7,在要使用.dll的源文件中#include得到的.h文件以及關於矩胡則陣的數據結構matrix.h文件。

8,用.dll裡面的函數之前,先要用裡面導出的Initialize()函數,最後用Terminate()函數釋放。

重點:注意matlab導出的dll的函數的參數以及返回值都是矩陣數據類型,在matrix.h當中有定義,傳入int類型數據之前先要用matlab提供的函數將它生成為矩陣數據類型代入,具體來說用matlab的matrix.h當中定義的mwArray類。做成.dll文件的話是可以在沒有安裝matlab的機器上使用的。

7. MATLAB混合編程在調用FORTRAN的程序

方法、把段代碼用matlab支持風格重寫遍用mex編譯成mex32文件了
方法二、把段代碼封裝成exesystem命令進行含參調用exe與matlab之間用文件進行數據傳遞
方法三、把段代碼封裝成dllmatlab里用操作dll命令進行調用種方法我用多沒法說更詳細相關資料查閱ilovematlab論壇混合編程板塊

8. matlab mex 混合編程

matlab調用C++的mexFunction,提高運算速度;以及在C++中通過將matlab code編譯為dll庫進行調用,演算法設計更加簡便。

9. vc matlab 混合編程,哪種方式最好

調用matlab引擎:是要求MATLAB作為VC的一個後台來調用,從本質來說還是在MATLAB中運行的程序;
基於matcom:可以脫離MATLAB的環境,但是貌似有一部分MATLBA中的函數不能完全調用;而且方法簡單;
基於COM的:這個我不太會也沒有試過;
我推薦將MATLAB的程序編譯成動態庫在VC中調用,這也可以完全脫離MATLAB的環境,可以完美調用

10. 關於matlab與vc混合編程

nargout是輸出參數,改:

isOK=mlfSignal(0,&y); 為:

isOK=mlfSignal(1,&y);

試試吧。。

熱點內容
119濃度的鹽酸怎麼配置 發布:2024-04-20 06:23:38 瀏覽:119
資料庫pf 發布:2024-04-20 05:57:36 瀏覽:393
c語言編譯出現連接錯誤 發布:2024-04-20 05:42:18 瀏覽:198
湖北戴爾伺服器維修系統雲主機 發布:2024-04-20 05:36:47 瀏覽:62
android上傳數據 發布:2024-04-20 05:36:43 瀏覽:142
python替換文本內容 發布:2024-04-20 05:21:22 瀏覽:899
urllib3源碼 發布:2024-04-20 05:11:23 瀏覽:34
如何通過運行打開伺服器文件 發布:2024-04-20 00:06:50 瀏覽:671
電腦百度網盤怎麼上傳 發布:2024-04-19 23:49:15 瀏覽:417
陸放四驅買哪個配置 發布:2024-04-19 23:49:08 瀏覽:407