问题介绍
需要在C#编写的winform中调用matlab写的函数类型的m文件,并在winform中读取m文件的返回值。
之前也写过类似的博客,请参考:C#中调用MATLAB执行MATLAB代码
本篇文章算是之前文章的更新版本吧。
步骤
1 创建C#的winform项目
在桌面创建名为《MATLAB》的文件夹,然后再Visual studio 2022中创建名为《MATLAB》的项目,选定刚刚的文件夹为项目所在的文件夹。创建项目,创建完项目之后再桌面的《MATLAB》文件夹下面会创建一个新的名为《MATLAB》的项目文件夹,点击进入新的名为《MATLAB》的项目文件夹,准备下一步工作。
2 创建存放MATLAB文件的文件夹
在名为《MATLAB》的项目文件夹中新建一个《app》文件夹,效果如下图所示
3 编写m文件
为了测试写了简单的MATLAB的函数文件,名为:test.m,如下所示:
function [c] = test(a,b)
c = a+b;
end
4 打开winform项目编写程序
在winform中添加一个button控件和label控件
5 添加引用
在vs 界面中选择“解决方案”下项目的“引用”,并右击,如下图所示:
在弹出的窗口中选择“com”,并在右面输入MATLAB并搜索,然后在对应项目前打勾,点击下面的确定
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();
}
}
}