C#中调用MATLAB的函数形式的m文件

问题介绍

需要在C#编写的winform中调用matlab写的函数类型的m文件,并在winform中读取m文件的返回值。
之前也写过类似的博客,请参考:C#中调用MATLAB执行MATLAB代码
本篇文章算是之前文章的更新版本吧。

步骤

1 创建C#的winform项目

在桌面创建名为《MATLAB》的文件夹,然后再Visual studio 2022中创建名为《MATLAB》的项目,选定刚刚的文件夹为项目所在的文件夹。创建项目,创建完项目之后再桌面的《MATLAB》文件夹下面会创建一个新的名为《MATLAB》的项目文件夹,点击进入新的名为《MATLAB》的项目文件夹,准备下一步工作。

2 创建存放MATLAB文件的文件夹

在名为《MATLAB》的项目文件夹中新建一个《app》文件夹,效果如下图所示
C#中调用MATLAB的函数形式的m文件_第1张图片

3 编写m文件

为了测试写了简单的MATLAB的函数文件,名为:test.m,如下所示:

function [c] = test(a,b)
    c = a+b;
end

4 打开winform项目编写程序

在winform中添加一个button控件和label控件
C#中调用MATLAB的函数形式的m文件_第2张图片

5 添加引用

在vs 界面中选择“解决方案”下项目的“引用”,并右击,如下图所示:
C#中调用MATLAB的函数形式的m文件_第3张图片
在弹出的窗口中选择“com”,并在右面输入MATLAB并搜索,然后在对应项目前打勾,点击下面的确定
C#中调用MATLAB的函数形式的m文件_第4张图片

6 编写代码并实现

首先需要添加namespace

using MLApp;

声明matlab变量,

MLApp.DIMLApp matlab ;

在Form1_load方法中初始化matlab变量

            Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application");
            matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.DIMLApp;
            matlab.Visible = 0;

由于查看下面资料,都是绝对路径,绝对路径不太方便便将读取m文件的方式改为相对路径,通过相对路径调用《app》文件夹下的m文件

            string str1 = System.Environment.CurrentDirectory;
            DirectoryInfo path = new DirectoryInfo(str1);

            matlab.Execute(@"cd "+path.Parent.Parent.Parent.FullName +"\\app");

参看资料:
MATLAB官方文档
C#调用Matlab引擎详细方法以及注意事项

全部代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using MLApp;

namespace MATLAB
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //MLApp.DIMLApp matlab = new MLApp.MLApp();
        MLApp.DIMLApp matlab ;
        private void Form1_Load(object sender, EventArgs e)
        {
            Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application");
            matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.DIMLApp;
            matlab.Visible = 0;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            matlab.PutWorkspaceData("a", "base", 6.0);
            matlab.PutWorkspaceData("b", "base", 3.0);

            string str1 = System.Environment.CurrentDirectory;
            DirectoryInfo path = new DirectoryInfo(str1);

            matlab.Execute(@"cd "+path.Parent.Parent.Parent.FullName +"\\app");
            matlab.Execute("[c] = test(a,b);");
            var c = matlab.GetVariable("c", "base"); 
            label1.Text = c.ToString();


        }
    }
}

你可能感兴趣的:(C#,MATLAB,matlab,c#,开发语言)