1. 程式人生 > >C#與Matlab混合程式設計_入門

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:


這樣,在Matlab主窗體上,新添了個視窗:


點選上圖所示的窗體的最大化按鈕,使得新新增的窗體最大化:


要想還原,點選上圖所示的按鈕即可。

給新建的.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混合程式設計是整個專案中比較難的一部分,主要

cMATLAB混合程式設計 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的底層緊密關聯 執行截圖如下: 原始碼如下

Qtmatlab混合程式設計實現過程

最近專案需要,matlab的一些演算法需要工程用,因此需要直接轉成Qt能夠呼叫的形式,之前也做過類似的,但那個時候是使用vs2012,而且也沒怎麼做記錄,一些坑坑繞繞也都忘了,現在用Qt呼叫,感覺區別還是很大的。 環境: Qt5.9 mingW(32位) matlab2

使用matlabcontrol控制元件實現javamatlab混合程式設計

背景: 本人在做畢設時需要實現以下場景,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去修飾這個列舉型別。

學習筆記:QtMatlab混合程式設計及遇到的諸多問題(附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/CVIMatlab混合程式設計的一種實現方法

最近一段時間都在學習基於LabWindows/CVI(後文簡稱CVI)開發模擬軟體,由於已有一個不太穩健,但基本框架較為齊備的工程。所以我的工作主要是在這個已有的工程上進行debug、整理修改、開發新功能,從5月開始已經持續了接近三個月。 在之前的開發過程中我

MatlabC++和MATLAB混合程式設計-DLL篇

先小話一下DLL,DLL是動態連結庫,是原始碼編譯後的二進位制庫檔案和程式介面,和靜態連結庫不同的是,程式在編譯時並不連結動態連結庫的執行體,而是在檔案中保留一個呼叫標記,在程式執行時才將動態連結庫檔案載入入記憶體。並且DLL在執行時是共享的,即當多個程式呼叫時,記憶體中也只

人臉識別系統開發(3) -- C++QML混合程式設計

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。 本文連結:https:/

關於matlabC語言的混合程式設計

摘要:本文著重描述了運用MATLAB命令將M檔案翻譯為C語言程式,並修改為可直接呼叫的C語言函式的方法,使用該方法所需要注意的方法侷限性和MATLAB版本差異的影響。運用該方法將能夠使C語言能直接使用MATLAB當中已經完成的數學計算功能,大大擴充了C語言的數學計算功能和開