01.MATLAB MCR安装
- 利用MATLAB GUI编程所得的exe软件,想在其他电脑上使用时,如果对方电脑没有安装MATLAB,是不能使用的,因为对方电脑上没有MATLAB的编译器。但我们也没有必要为了运行GUI程序而去安装MATLAB,只需要安装MCR编译器就行。
- mcr下载地址:http://cn.mathworks.com/products/compiler/mcr/
- 首先需要找到MCR的安装程序,可以在math官网上下载。当然最简单的方法就是去MATLAB安装目录下拷贝一下。通常目录为
..\MATLAB\R2012a\toolbox\compiler\deploy\win64
。 - 安装步骤很简单,就是选好安装路径,下一步下一步就好。
- 安装完一般会帮你配置好环境变量,当然为了确保还是需要自己去添加和确认。
02.matlab生成动态链接库
- 编写一个简单的代码
function f = add_my(x,y)
f = x+y;
end
- 在命令行输入
deploytool
,随后会出现这个对话框。选择第三项。
- 选择
.NET Assembly
,右边加号添加.m文件
,下面可以修改类名等信息,在后续调用中会用到。设置完,选择绿色按键Package
即可生成。
03.C#中调用
- 添加.dll文件(动态链接库)
我的
MWArray.dll
在这个文件下面D:\sorfware\Matlab2018bMCR Runtime\v95\toolbox\dotnetbuilder\bin\win64\v4.0
我的
add_my.dll
在刚刚生成的文件中D:\sorfware\matlabpro\add_my\for_testing
- C#编写程序
- 添加using指令
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using add_my;
- 简单案例一
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using add_my;
namespace MatlabTest
{
class Program
{
static void Main(string[] args)
{
double[] x = { 1,2,3,4,5};
double[] y = { 5,4,3,2,1};
MyAdd myAdd = new MyAdd();
MWNumericArray a = new MWNumericArray(1, x.Length, x);
MWNumericArray b = new MWNumericArray(1, y.Length, y);
MWArray res = myAdd.add_my(a, b);
double[] tmp = new double[1];
double[] ans = new double[5];
for (int i = 0; i < x.Length; i++)
{
tmp = (double[])((MWNumericArray)res[1 + i]).ToVector(MWArrayComponent.Real);
ans[i] = tmp[0];
}
for (int j = 0; j < ans.Length; j++)
{
Console.WriteLine(ans[j]);
}
}
}
}
- 因为
matlab
中使用的数据格式和C#
中不同,所以需要数据格式转换 - 运行结果
6
6
6
6
6
- 简单案例二
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using add_my;
namespace MatlabTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now.ToString() + ":" + DateTime.Now.Millisecond.ToString());
double[] x = { 1, 2, 3, 4, 5 };
double[] y = { 2, 3, 4, 5, 6 };
MWNumericArray a = new MWNumericArray(x);
MWNumericArray b = new MWNumericArray(y);
MWNumericArray res1;
MWNumericArray res2;
MyAdd myAdd = new MyAdd();
res1 = (MWNumericArray)myAdd.add_my(a, b);
double[,] result1 = (double[,])res1.ToArray();
Console.WriteLine(DateTime.Now.ToString() + ":" + DateTime.Now.Millisecond.ToString());
for (int i = 0; i < result1.GetLength(0); i++)
{
for (int j = 0; j < result1.GetLength(1); j++)
{
Console.WriteLine("result1[{0},{1}]={2}", i, j, result1[i, j]);
}
}
Console.WriteLine(DateTime.Now.ToString() + ":" + DateTime.Now.Millisecond.ToString());
res2 = (MWNumericArray)myAdd.add_my(a, b);
double[,] result2 = (double[,])res1.ToArray();
for (int i = 0; i < result2.GetLength(0); i++)
{
for (int j = 0; j < result2.GetLength(1); j++)
{
Console.WriteLine("result2[{0},{1}]={2}", i, j, result2[i, j]);
}
}
Console.WriteLine(DateTime.Now.ToString() + ":" + DateTime.Now.Millisecond.ToString());
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine(DateTime.Now);
}
}
}
- 运行结果
2020/9/8 11:12:35:194
2020/9/8 11:13:11:60
result1[0,0]=3
result1[0,1]=5
result1[0,2]=7
result1[0,3]=9
result1[0,4]=11
2020/9/8 11:13:11:67
result2[0,0]=3
result2[0,1]=5
result2[0,2]=7
result2[0,3]=9
result2[0,4]=11
2020/9/8 11:13:11:68
- 可以看到第一次调用编译建立连接时间很长,但后续调用就很快了。
评论已关闭