C#與Matlab混合程式設計_入門
Author: [email protected]
Copyright 2013, [email protected], All Rights Reserved.
Date: 2013-11-07
C#與Matlab混合程式設計基礎過程。
參考:
系統平臺:
Windows 7 Ultimate x64
軟體版本:
C#:Visual Studio 2010
Matlab:MATLAB R2011b x64(或更高版本,安裝版和綠色免安裝版均可,需要啟用Compiler元件的License)
注:
雖然
a. VS2010不區分32位和64位系統,只區分二者的編譯器;
但是
b. Matlab區分32位和64位系統;
所以
64位系統平臺下只能編譯64位的matlab介面,在vs2010中引用時,vs必須配置成64位平臺編譯。具體配置過程下面會有介紹。
32位系統無須配置vs的編譯器。
1. 設定Matlab對外介面
開啟Matlab,在預設的當前資料夾(Current Folder)下即可,一般為安裝目錄的bin目錄,2013b可能是我的文件下的MATLAB目錄。
新建M檔案,實現兩個向量(或數字)的相加,命名為sumab,位置放在預設當前資料夾下即可:
function [tsum] = sumab(a, b)
tsum = sum([a, b]);
end
首先,配置選擇C#的混合編譯器VS2010,在Matlab的命令視窗(Command Window)中,鍵入:
mbuild -setup
會彈出:
Would you like mbuild to locate installed compilers [y]/n?
在彈出的選擇項中,使用預設的[y](直接回車就是選擇預設值),讓Matlab自動搜尋可用的編譯器。
如果只安裝了vs2010,會彈出可選編譯器為:
Select a compiler:
[1] Microsoft Visual C++ 2010 in C:\Program Files (x86)\Microsoft Visual Studio 10.0
[0] None
Compiler:
填寫1,回車:
Please verify your choices: Compiler: Microsoft Visual C++ 2010 Location: C:\Program Files (x86)\Microsoft Visual Studio 10.0 Are these correct [y]/n?
確認,直接回車即可。
****************************************************************************
Warning: Applications/components generated using Microsoft Visual C++
2010 require that the Microsoft Visual Studio 2010 run-time
libraries be available on the computer used for deployment.
To redistribute your applications/components, be sure that the
deployment machine has these run-time libraries.
****************************************************************************
Trying to update options file: C:\Users\xxx\AppData\Roaming\MathWorks\MATLAB\R2011b\compopts.bat
From template: D:\MATLAB\R2011B~1\bin\win64\mbuildopts\msvc100compp.bat
Done . . .
其次,使用部署工具,建立.Net介面工程,在Command Window中,鍵入:
deploytool
在彈出的部署工程對話方塊中,將工程名命名為sumab,Location預設,Type型別選擇.NET Assembly:
點選上圖所示的窗體的最大化按鈕,使得新新增的窗體最大化:
要想還原,點選上圖所示的按鈕即可。
給新建的.NET工程新增新類,點選Build選項卡下的Add Class,新增一個新類,命名為Sumab,再點選新類下面的Add files,選擇前面建立的sumab.m函式檔案:
然後點選上圖所示的編譯按鈕,編譯此工程。大約1分鐘左右。
編譯完成後,點選Close關閉即可。
注:若出現mcc failed錯誤,或者cannot find ‘Compiler’,說明MATLAB Compiler工具的License未啟用,解決方法是重新啟用Matlab,或者重新安裝已經啟用Compiler工具的Matlab版本。
上述工程生成的介面dll檔案位於工程所在目錄(本例中為Matlab的預設current folder,即D:\MATLAB\R2011b_x64\bin)下的同名的子目錄中。
裡面有兩個子目錄,生成的dll檔案位於distrib目錄下。
這樣,Matlab的對外介面就設定好了。
2. VS2010開始引用Matlab介面
開啟VS2010,使用C#環境(預設環境如何切換可以百度)。新建C#的控制檯應用程式,命名為TestMatlabCs:
為此專案新增Matlab的介面引用(Preference)。需要新增三個,分別為MLApp(mlapp,tlb),MWArray(mwarray.dll),和新建立的sumab.dll,三個引用的新增過程類似。
首先新增MLApp。
在右側的解決方案資源管理器中,右擊引用,新增引用:
在彈出的對話方塊中,選擇瀏覽選項卡,找到Matlab安裝目錄下的bin\win64目錄(本例為D:\MATLAB\R2011b_x64\bin\win64),選擇mlapp.tlb:
注:32位系統為bin\win32目錄。
這樣,就在專案的引用中,新添了MLApp的引用:
同理,再新增另外兩個引用,路徑分別為:
MWArray.dll:D:\MATLAB\R2011b_x64\toolbox\dotnetbuilder\bin\win64\v2.0
sumab.dll:D:\MATLAB\R2011b_x64\bin\sumab\distrib
下面,新增專案的測試程式碼。
目的是對兩個變數a和b,呼叫matlab的sumab函式實現相加,輸出結果。
開啟專案的Program.cs檔案。
首先,新增標頭檔案引用:
using MathWorks.MATLAB.NET.Arrays;
在函式體的Main函式中,定義三個變數a、b、c,型別均為MWArray(matlab的對外矩陣型別介面),a賦初值為1,b賦初值為2,c用於存放結果。
MWArray a = 1, b = 2, c;
新建matlab介面sumab的類Sumab的例項,呼叫其方法sumab(),計算結果:
c = new sumab.Sumab().sumab(a, b);
這裡偷了個懶,把建立例項並呼叫方法寫在一塊了。
將結果c轉換成double型別,儲存在double型別變數e中:
double e = (double)(MWNumericArray)c;
這裡,需要了解一下double和MWArray的轉換:
double <-> MWNumericArray <-> MWArray
所以,先將MWArray強制顯式轉換成MWNumericArray,在把MWNumericArray強制顯式轉換成double。
如上,轉換優先順序為從右向左,所以可以這樣寫在一塊,也可以單獨建立一個MWNumericArray變數,一步一步開始轉換。
最後,將結果顯示出來:
Console.WriteLine(e);
Console.ReadKey();
這時,如果直接執行,會報錯誤:
未能載入檔案或程式集 “MWArray” 或它的某一個依賴項。。。
原因是,MWArray為64位Matlab對外介面,而VS當前使用的編譯平臺為32位,所以需要配置VS編譯器為64位。
點選VS工具欄Debug右側的下三角,開啟配置管理器:
在彈出的配置管理器對話方塊中,點選平臺的右側下拉三角,選擇新建:
在彈出的新建專案平臺中,選擇新建平臺為x64,從此處複製設定為<空>:
這樣,就可以編譯執行專案了。
Program.cs程式碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MathWorks.MATLAB.NET.Arrays;
namespace TestMatlabCs
{
class Program
{
static void Main(string[] args)
{
MWArray a = 1, b = 2, c;
c = new sumab.Sumab().sumab(a, b);
double e = (double)(MWNumericArray)c;
Console.WriteLine(e);
Console.ReadKey();
}
}
}
相關推薦
C#與Matlab混合程式設計_入門
Author: [email protected] Copyright 2013, [email protected], All Rights Reserved. Date: 2013-11-07 C#與Matlab混合程式設計基礎過程。 參考:
C#與matlab混合程式設計以及C#程式設計
把最近所做的C#與MATLAB混合程式設計,還有介面一些問題進行總結。MATLAB有非常強大的運算功能,C#有很多封裝好的庫可以用來做介面,所以利用兩者的優勢來製作一個c#呼叫MATLAB演算法程式的展示介面。 C#與MATLAB混合程式設計是整個專案中比較難的一部分,主要
c與MATLAB混合程式設計 mxArray矩陣賦值
在MATLAB裡邊定義 a = [1, 4, 2; 3, 2, 0]; 在C語言等效定義是 double a[2][3] = { 1, 3, 4, 2, 2, 0 };//c語言的陣列在記憶體裡邊是按行依次儲存的,而MATLAB的mxArray是按列依次儲存的 mxAr
c#與matlab混合程式設計時出現應用程式發生異常 未知的軟體異常(0xe0434f4d),位置為 0x7c812a7b.
第一次寫部落格,詞語組織的不好,往大家莫噴,在進行c#與matlab混合程式設計時,當c#呼叫matlab生成的.dll時,讀取運算得到的結果時,遇到了應用程式發生異常 未知的軟體異常(0xe0434f4d),位置為 0x7c812a7b,我的問題出在讀取了一個不存在
FFT原理及C++與MATLAB混合程式設計詳細介紹
## 一:FFT原理 ### 1.1 DFT計算 在一個週期內的離散傅立葉級數(DFS)變換定義為離散傅立葉變換(DFT)。 $$ \begin{cases} X(k) = \sum_{n=0}^{N-1}x(n)W_N^{kn}, & 0 \le k \le {N-1} \\ x(n) = \frac
C語言與matlab混合程式設計中mwArray的Get函式的簡單用法解釋
網上的通用示例: double data[4] = {1.0, 2.0, 3.0, 4.0}; double x; mwArray a(2, 2, mxDOUBLE_CLASS); a.SetData(data, 4); x = a.Get(1,1); // x = 1.0
c++與matlab混合編譯———讀取mxArray內容
mxArray作為一種特殊且複雜的資料結構,需要通過matrix.h提供的相關介面去訪問。在混合編譯過程中,matlab變數以mxArray形式儲存,通常用mxArray* 型別來指定matlab工作空間變數的地
Qt文件閱讀筆記-C++與QML混合程式設計(QML畫餅狀圖)
這裡只點名一點: Qt Charts是利用Qt的圖形檢視框架(QGraphics)搞出來的,底層並不是用OPenGL,而QML卻與OPenGL的底層緊密關聯 執行截圖如下: 原始碼如下
Qt與matlab混合程式設計實現過程
最近專案需要,matlab的一些演算法需要工程用,因此需要直接轉成Qt能夠呼叫的形式,之前也做過類似的,但那個時候是使用vs2012,而且也沒怎麼做記錄,一些坑坑繞繞也都忘了,現在用Qt呼叫,感覺區別還是很大的。 環境: Qt5.9 mingW(32位) matlab2
使用matlabcontrol控制元件實現java與matlab混合程式設計
背景: 本人在做畢設時需要實現以下場景,web前端接收資料,傳到Jsp後端後,接著需要將前端傳遞來的資料送到matlab演算法函式中,使用matlab進行演算法的計算,得到結果後,再次將資料傳到JSP後端,最終實現結果資料在前端網頁的顯示。最初考慮的是將matl
c與彙編混合程式設計
1、為什麼要混合程式設計? 組合語言:執行效率高,編寫繁瑣 C語言:可讀性強,移植性好,除錯方便 應用在對執行效率有要求的場合、能夠更直接地控制處理器 (1)彙編呼叫c函式 很簡單,在彙編程式中直接ldr: 例如:ldr pc,=gboot_mai
QT5:C++與 QML混合程式設計
C++作為底層(後臺),QML作為上層(前臺),可以實現混合程式設計。 (一) 僅載入QML檔案(與javaScript) 利用QQmlApplicationEngine 類實現: Main.qml中最底層採用ApplicationWindow類。 (二) 載入QML檔案
Qt C++與QML混合程式設計(2)- QML中使用C++的列舉、結構體、列表型別的函式
C++中返回函式返回的列舉型別、結構體型別、列表型別的函式是不能直接作為QML使用的。下面介紹C++中使用這些型別作為返回值的函式使用。 1. 使用列舉型別 C++的列舉型別如果要在QML中使用,需要在使用Q_ENUMS去修飾這個列舉型別。
學習筆記:Qt與Matlab混合程式設計及遇到的諸多問題(附DEMO)
工具:MATLAB R2014b,Qt 5.6.1, 目標:通過MATLAB寫一個簡單的函式,生成動態連結庫DLL,再在Qt上呼叫 1.在MATLAB主頁新建一個函式 記住函式的名字和儲存的函式檔案的名字要相同,比如我寫了一個函式f,儲存時檔名需要是f.m 2.生
keil中的C與彙編混合程式設計
keil C語言與組合語言混合程式設計 C與彙編混合程式設計主要有以下幾種: (1)C語言中嵌入彙編(2)無引數傳遞的函式呼叫(3)有引數傳遞的函式呼叫 (1). C語言中嵌入彙編: 1、在 C 檔案中要嵌入彙編程式碼片以如下方式加入彙編程式碼: #
Qt C++與QML混合程式設計(1)- QML中使用C++的類和函式
本章主要介紹一下在QML中使用C++的類的兩種方法 1.設定QML的上下文屬性 為QML的節點設定上線屬性,在QML檔案中可以之間使用這個屬性的函式。 QQuickView view; view.rootContext()->setCo
LabWindows/CVI與Matlab混合程式設計的一種實現方法
最近一段時間都在學習基於LabWindows/CVI(後文簡稱CVI)開發模擬軟體,由於已有一個不太穩健,但基本框架較為齊備的工程。所以我的工作主要是在這個已有的工程上進行debug、整理修改、開發新功能,從5月開始已經持續了接近三個月。 在之前的開發過程中我
【Matlab】C++和MATLAB混合程式設計-DLL篇
先小話一下DLL,DLL是動態連結庫,是原始碼編譯後的二進位制庫檔案和程式介面,和靜態連結庫不同的是,程式在編譯時並不連結動態連結庫的執行體,而是在檔案中保留一個呼叫標記,在程式執行時才將動態連結庫檔案載入入記憶體。並且DLL在執行時是共享的,即當多個程式呼叫時,記憶體中也只
人臉識別系統開發(3) -- C++與QML混合程式設計
版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。 本文連結:https:/
關於matlab與C語言的混合程式設計
摘要:本文著重描述了運用MATLAB命令將M檔案翻譯為C語言程式,並修改為可直接呼叫的C語言函式的方法,使用該方法所需要注意的方法侷限性和MATLAB版本差異的影響。運用該方法將能夠使C語言能直接使用MATLAB當中已經完成的數學計算功能,大大擴充了C語言的數學計算功能和開