测试环境
VisualStudio2022 / .NET Framework 4.7.2
Matlab2021b
参考:C# Matlab 相互调用
Matlab
1、编写Matlab函数
可以没有任何参数单纯定义matlab处理的函数,输出的数据都存在TXT中用以后期读取数据
function [result,m,n] = TEST(list)
% 计算 矩阵与其转置矩阵的乘积
% 测试返回多个结果
result = list*list';
[m,n] = size(result);
% 文件名
filename = 'result.txt';
% 将矩阵存入TXT
writematrix(result,filename);
end
2、打包Matlab函数
- APP中找到库编译器 Library Compiler
- 打包函数
1)选择目标类型(TYPE)
2)添加需要打包的函数文件
3)重命名库名称
4)重命名类名称,或者添加类,分配函数所属类
5)打包操作
如下图所示 - 生成打包文件
&emsp在生成的文件中,找到 “for_redistribution_files_only” 文件夹,里面有 TESTNative.dll 和TEST.dl l两个dll文件,均可使用。另外在c#还需要用格式进行转换,需要MWArray.dll。该文件在Matlab安装目录中,参考路径:
X:\Program Files\MATLAB\R2021b\toolbox\dotnetbuilder\bin\win64\vX.0\
x表示不同安装的不同路径
C#
1、效果演示
- 添加引用 TESTNative.dll 和 MWArray.dll
- C#调用代码
这里用一个按键控件做演示,在该按键的触发函数中调用Matlab函数
//添加引用
using System;
using TESTNative;
using MathWorks.MATLAB.NET.Arrays;
//触发代码
private void TEST_Click(object sender, EventArgs e)
{
int[,] list = { { 1 }, { 2 }, { 3 }, { 4 } }; //列向量
MWArray array = new MWNumericArray(list); //转换list格式
TESTNative.Cal ts = new Cal();//定义目标类
object resultObj = ts.TEST(1, array);// 1表示返回的结果数量,要小于等于Matlab对应函数实际的返回值数量
//转换返回值
object[] resultObjs = (object[])resultObj;
double[,] calcResult = (double[,])resultObjs[0];
}
点击按键触发函数,生成的矩阵结果存入TXT中
2、遇到的问题记录
- 无法运行,提示下图错误
解决办法: 在项目属性中将生成的目标平台该为x64
- 点击按键时,可能会出现串口分辨率变化的情况
Matlab代码在运行过程中窗口大小改变了。
解决方法: 首先确认.m代码中没有修改窗口大小的代码,然后屏幕设置里调整屏幕缩放大小为100%可以解决