C#与Matlab的二三事
实验室需要,继续在Win下面给Matlab作包装,写一些GUI什么的,之前也弄过一些相关的东西。主要采用的MFC加Matlab的方式,
想把GUI做的更好看一些,打算换一种方式尝试一下。具体的方式主要有m文件作成库文件,Matlab Engine等等,对Engine方式做
一些简单的总结。
添加Matlab Engine的步骤
1.加入引用
Matlab Application Type Library这个选项
2.添加引擎变量
MLApp.MLApp matlab = new MLApp.MLApp();
matlab就是需要的引擎对象
本质上主要的数据接口就是 C#数据 --> Matlab ---> C#环境
接口变量是 System.Array变量,主要函数如下
http://www.mathworks.cn/cn/help/matlab/call-matlab-com-automation-server.html
控制台范例如下
using System; namespace ConsoleApplication4 { class Class1 { [STAThread] static void Main(string[] args) { MLApp.MLApp matlab = new MLApp.MLApp(); System.Array pr = new double[4]; pr.SetValue(11,0); pr.SetValue(12,1); pr.SetValue(13,2); pr.SetValue(14,3); System.Array pi = new double[4]; pi.SetValue(1,0); pi.SetValue(2,1); pi.SetValue(3,2); pi.SetValue(4,3); matlab.PutFullMatrix("a", "base", pr, pi); System.Array prresult = new double[4]; System.Array piresult = new double[4]; matlab.GetFullMatrix("a", "base", ref prresult, ref piresult); } } }
注意:
GetFullMatrix函数后两个参数分别为, 实数部分的数值, 复数部分的数值, 类似 a + bi, 分别存入两个数组中
如果Matlab环境中只有实数部分的数值, 如此返回会出现运行时异常
可以采用另外一种方式
GetWorkspaceData函数,将数值存入object对象当中,例如
matlab.GetWorkspaceData("varName", "base", out targetInCsharp);
返回到object对象当中,再进行进一步操作
解决了数据传输问题,
那么可以将C#中的数据读入以后传入到Matlab环境当中,再将结果从Matlab环境中读出,更多信息,
参见Matlab官方文档
http://www.mathworks.cn/cn/help/matlab/external-interfaces.html
使用GetWorkspaceData的例子
读取的数据返回到 object对象中, 采用out方式
MLApp.MLApp matlab = new MLApp.MLApp(); matlab.Execute("cd " + matlabWorkPath); object result; matlab.Execute("load matlab.mat"); matlab.GetWorkspaceData("b", "base", out result); double[,] d = (double[,])result; Console.WriteLine(d[0, 0].ToString());
写入到matlab的workspace当中
double[,] dd = new double[1, 5]; for (int i = 5; i > 0; i--) { dd[0, 5 - i] = i; } object outArray = (object)dd; matlab.PutWorkspaceData("b", "base", outArray);