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

4 篇文章 0 订阅

问题介绍

需要在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控件
winform界面展示

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();


        }
    }
}
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C#调用Matlab函数可以通过以下两种方式实现: ### 1. 使用Matlab Engine API Matlab Engine API提供了一组接口,可以在C#加载和执行Matlab函数。具体步骤如下: 1. 安装Matlab Engine API。Matlab Engine API需要和Matlab一起安装,安装时需要选择Matlab Engine API选项。 2. 在C#项目添加对Matlab Engine API的引用。在Visual Studio,右键项目,选择“引用”,然后选择“添加引用”,在COM选项卡选择“Matlab Application”。 3. 在C#代码加载和执行Matlab函数。示例代码如下: ```csharp // 创建Matlab Engine对象 var matlab = new Matlab(); // 执行Matlab函数 matlab.Execute("addpath('C:\\path\\to\\matlab\\function\\folder')"); matlab.Execute("result = myfunction(arg1, arg2)"); // 获取Matlab函数的返回值 double[] result = matlab.GetVariable("result", "base") as double[]; // 释放Matlab Engine对象 matlab.Quit(); ``` ### 2. 使用Matlab Compiler SDK Matlab Compiler SDK可以将Matlab函数编译成.NET组件,然后在C#调用。具体步骤如下: 1. 安装Matlab Compiler SDK。Matlab Compiler SDK需要和Matlab一起安装,安装时需要选择Matlab Compiler SDK选项。 2. 在Matlab编译函数。在Matlab命令行输入以下命令: ```matlab mcc -W "dotnet:MyComponent,MyNamespace,1.0" -T link:lib myfunction.m ``` 其,MyComponent是.NET组件的名称,MyNamespace是.NET命名空间的名称,1.0是.NET组件的版本号,myfunction.m是需要编译的Matlab函数。 3. 在C#项目添加对.NET组件的引用。在Visual Studio,右键项目,选择“引用”,然后选择“添加引用”,选择“浏览”,找到编译出来的.NET组件,添加引用。 4. 在C#代码调用.NET组件。示例代码如下: ```csharp // 创建.NET组件对象 var component = new MyComponent(); // 调用Matlab函数 double[] result = component.myfunction(arg1, arg2); // 释放.NET组件对象 component.Dispose(); ``` 需要注意的是,使用Matlab Compiler SDK编译的.NET组件需要在部署时安装Matlab Runtime,以保证能够正确运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值