系統環境:
- 用於生成dll文件的電腦:VS2015專業版,Matlab2016a,均爲64位
- 用於調用dll文件的電腦:VS2015社區版,64位
生成dll文件
這部分網上教程非常多,可以參考:[MATLAB]將.m文件生成dll文件。
主要注意的幾點:
- visual studio要安裝專業版,詳見官方System Requirements and Supported Compilers。
- VS安裝時,自定義功能時要選擇“適用於Visual C++2015的公共工具”和“Visual Studio擴展性工具”。
- Matlab要是已經激活狀態。
首次生成的步驟分3步(後面再生成只需要用deploytool
):
- Matlab的命令行窗口輸入
mbuild -setup
; - Matlab的命令行窗口輸入
mex -setup C++
; - Matlab的命令行窗口輸入
deploytool
,選擇Library Compiler
。
調用dll
主要也是平臺匹配的問題:
- VS2015的安裝需要選擇“適用於Visual C++2015的公共工具”和“Visual Studio擴展性工具”。(調用可以用社區版的VS,生成只能用專業版)
- 添加導出的dll文件和MWArray.dll(C:\ProgramFiles\MATLAB\R2016a\toolbox\dotnetbuilder\bin\win64\v2.0)的引用;
- 工程文件的首行添加如下信息
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using matlab_class;
- VS2015的“屬性——>生成——>目標平臺” 選擇
x64
VS2015的參考安裝項如下
MWArray數據類型
MWArray是MathWorks公司爲其他語言調用matlab編譯的dll設計出的一種數據類型。C#需要通過MWArray與MATLAB的數據進行互通,數據類型映射規則如下:
.NET Type | MWArray Type | MATLAB Type |
---|---|---|
System.Double | MWNumericArray | double |
System.Number | MWNumericArray | double |
System.Float | MWNumericArray | single |
System.Byte | MWNumericArray | int8 |
System.Short | MWNumericArray | nt16 |
System.Int32 | MWNumericArray | int32 |
System.Int64 | MWNumericArray | int64 |
System.Char | MWCharArray | char |
System.String | MWCharArray | char |
System.Boolean | MWLogicalArray | logical |
N/A | MWStructArray | structure |
N/A | MWCellArray | cell |
MATLAB生成的dll文件,返回的數據都是MWArray類型的,這是個抽象類,需要先轉換成MW*****Array子類型,然後再轉換成C#的數據類型。
- MWArray——>C#數字
MWArray aaa = 10;
MWArray bbb = 10.1
int ccc = (MWNumericArray)aaa.ToScalarInteger();
double ddd = (MWNumericArray)bbb.ToScalarDouble();
- MWArray——>C#字符串
MWArray ccc = "matlab";
string str = (MWCharArray)ccc.ToString();
- MWArray——>C#二維數組
MWArray aaa = new double[2, 2] { { 1.1, 2.2 }, { 3.3, 4.4 } };
Array arr = (MWNumericArray)aaa.ToArray();
double[,] bbb = (double[,])arr;
- MWArray——>C#一維數組
MWArray aaa = new double[] { 1.1, 2.2 };
Array arr = ((MWNumericArray)aaa).ToVector(MWArrayComponent.Real);
double[] bbb = (double[])arr;
// ToVector中的MWArrayComponent.Real是指複數中的實部。
更多關於MWArray數據類型的介紹可以參考:https://blog.csdn.net/zwjabcd/article/details/50663134