C#与MATLAB混合编程
2020 年 09 月 07 日 245 372 字 暂无评论

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生成动态链接库

  1. 编写一个简单的代码
function f = add_my(x,y)
f = x+y;
end

  1. 在命令行输入deploytool,随后会出现这个对话框。选择第三项。

  1. 选择.NET Assembly ,右边加号添加.m文件,下面可以修改类名等信息,在后续调用中会用到。设置完,选择绿色按键Package即可生成。

03.C#中调用

  1. 添加.dll文件(动态链接库)

  • 我的MWArray.dll在这个文件下面

    • D:\sorfware\Matlab2018bMCR Runtime\v95\toolbox\dotnetbuilder\bin\win64\v4.0
  • 我的add_my.dll在刚刚生成的文件中

    • D:\sorfware\matlabpro\add_my\for_testing
  1. 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
  • 可以看到第一次调用编译建立连接时间很长,但后续调用就很快了。

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/137/



评论已关闭