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

news/2024/10/22 13:30:05/

问题介绍

需要在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();}}
}

http://www.ppmy.cn/news/534132.html

相关文章

servlet 技能总结

Servlet介绍 Servlet是Server Applet的简称,称为服务端小程序,是JavaEE平台下的技术标准,基于Java语言编写的服务端程序。Web容器或应用服务器实现了Servlet标准所以Servlet需运行在Web容器或应用服务器中。Servlet主要功能在于能在服务器中执…

微信为什么使用 SQLite 保存聊天记录?

概要 SQLite 是一个被大家低估的数据库,但有些人认为它是一个不适合生产环境使用的玩具数据库。事实上,SQLite 是一个非常可靠的数据库,它可以处理 TB 级的数据,但它没有网络层。接下来,本文将与大家共同探讨 SQLite 在…

kahn是什么牌子_akin是什么牌子_哪个国家的_什么档次

最近新发现了一个洗护品牌akin,看起来好像是国外的牌子,以前从来没有听说过。那么akin是什么牌子?akin是哪个国家的?akin是什么档次? akin是什么牌子 来自澳洲的天然护肤品牌Akin入驻天猫国际,旨在从品牌及产品源头上带给消费者正品保障。…

la是什么牌子_la bruket是什么牌子_哪个国家的_什么档次

la bruket是一个很小众的牌子,它家的护手霜和唇膏是热门产品,有些MM第一次听说它。那么la bruket是什么牌子?la bruket是哪个国家的?la bruket是什么档次? la bruket是什么牌子 la bruket是来自北欧瑞典的海洋系有机护肤品牌,将进军亚洲市…

都是散热片惹的祸

散热片会惹什么祸啊?除非风扇不转了!嘿!且听我慢慢道来。 最近机房四台联想学生机换了四个30G的大硬盘,需要装好98、各种应用软件,唉!此等小事,咱半小时就能搞定了(有Ghost帮我吗)!装好硬盘,…

ce是什么牌子的包_cemoy是什么牌子

cemoy是澳洲自然护肤品牌,旗下的产品全部采用了自然植物护肤配方,cemoy出色护肤效果以及温和舒适的护肤体验,让cemoy在中国市场非常受欢迎,尤其是cemoy旗下的精华液产品。 cemoy是什么牌子 在众多的澳洲护肤品牌中,cem…

ABB片式散热器结构大型配电变压器36KV

大型配电变压器主要应用在较高电压等级的配网网络,将电能转换和分配给较低电压的变电站或直接向大工业用户供电。 大型配电变压器的调压方式分为无载调压和有载调压两种方式,有载调压式变压器通常有独立的调压线圈。 变压器的铁芯材料采用晶粒取向硅钢片…

比大衣保暖,比羽绒服显瘦!这件高级反貂绒毛衣火了!不起球不掉毛,明明毛茸茸的却巨显瘦,舒适又保暖....YYDS!...

©程序员严选 丨为您甄选全球好物 在寒冬为保暖 每个小仙女衣柜里都有一沓打底衫或毛衣 软软糯糯冬天氛围分分钟被拉满~ 但是过来人都知道, 很多漂亮且造型夸张的毛衣或打底衫, 只适合单穿, 因为天气一冷,穿件大衣、羽绒服就瞬…