[置顶] 如何将MATLAB程序插入到.net(C#)中(流程以及常见错误总结)

时间:2023-01-15 21:37:28

目录:

1.将MATLAB的m文件形成.dll形式

2.将.dll组件插入到.net程序中

3.MATLAB程序与.net程序数据形式转换

4.常见问题

以我写的ELM文件为例,matlab是2010b版本。会出现常见错误的地方标红。

1.将MATLAB的m文件形成.dll形式

(1)确保写好.m 文件。        m文件中最好无clear all等与MATLAB平台有关的语句。否面后面.net平台调用时会出错。        m文件定义好程序入口,如function Y=ELM(x,y);(返回一个输出) function [a,b,c]=ELM(x,y)(返回多个输出)        m文件例子如下:        
function Y=ELM(P,T,P_tests)%输入训练集,训练结果,预测集
%clear all//这些注释掉,调用会出错
%clc
%训练模型
%tic
[IW,B,LW,TF,TYPE]=elmtrain(P,T,10,'sig',1);
%toc
%测试模型
%tic
Y_test=elmpredict(P_tests,IW,B,LW,TF,TYPE);
%toc
Y=Y_test;
(2)将m文件形成.dll组件形式
       在command window里写“deploytool”回车       [置顶]        如何将MATLAB程序插入到.net(C#)中(流程以及常见错误总结)
      出现下图,在“Name”里定义工程名称,“Location”是保存的地址,“Target”中选择“.NET Assembly”,转换成.net组件。点击“OK”[置顶]        如何将MATLAB程序插入到.net(C#)中(流程以及常见错误总结)
出现下图。点击“Add class”,将默认名“Class1”改为你想要的名字,但是与之前写的工程的名称不要相同。并在“Add files”下添加.m文件需要的子m文件。比如我的ELM程序中用到elmtrain.m,elmpredict.m.而下方的“Add file/directories”中可以添加数据库和其他的.m文件。会有读者出错是因为程序识别不出.m的某个文件。都可以在此处添加[置顶]        如何将MATLAB程序插入到.net(C#)中(流程以及常见错误总结)       [置顶]        如何将MATLAB程序插入到.net(C#)中(流程以及常见错误总结)
此处还需要注意的是保存的project的要与你写的.net的Framework兼容点击"Project"——"Settings"——".NET"标签,在“Microsoft Framework”中选择适合的选项。选完后直接“close”就可以。点击红框内符号加载。等几分钟后加载完毕。形成两个文件,"ELM.prj"和ELM文件夹、[置顶]        如何将MATLAB程序插入到.net(C#)中(流程以及常见错误总结)

2.将.dll组件插入到.net程序中

打开Visual studio,在项目下的“引用”添加刚才形成的.dll文件。可以在ELM文件夹的“distrib”中找到。同时将用于matlab与.net数据转换的“MWArray”添加上。其路径为“ C:\Program
Files\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll”(每个人的路径略有不同)
[置顶]        如何将MATLAB程序插入到.net(C#)中(流程以及常见错误总结)
接下来使用命名空间,在程序的 using 区域内添加以下两个 using:
using ELM;
using MathWorks.MATLAB.NET.Arrays;

3.MATLAB程序与.net程序数据形式转换

      首先将要输入的数据(DataSet形式等)转换成二维或多维数组。为Array[,]而非Array[][]的形式。我尝试过将double[][]数组作为输入,结果出错
比如代码中的double[,] data形式是正确的。然后我们要把这个.NET 中的二维数组转化成 MWArray 的中间类型,因为 Matlab 生成的函数接收的是 MWArray 类型的数据,MWArray 是 Matlab 与.NET 进行数据交换的中间类型。这里我们定义的是 MWNumericArray 类型,它是从 MWArray 派生的类型,在传递参数的时候同样可用。之后很关键的一个问题就是如何把 double[,]转换成MWNumericArray 了,这里非常简单,只需要在实例化 MWNumericArray 的时候将 data 作为 MWNumericArray 构造函数的参数就行了。      把MWNumericArray 类型的结果转成double[,]的结果。直接调用 MWNumericArray 的 ToArray 方法。
                //matlab与.net数据类型转换
//double[,] data = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } };
//MWNumericArray Array_train = new MWNumericArray(data);
MWNumericArray Array_train = new MWNumericArray(dt_train);
MWNumericArray Array_test = new MWNumericArray(dt_test);
MWNumericArray Array_trainResult = new MWNumericArray(trainResult);
//调用MATLAB的dll组件
elm elmModel = new elm();
MWNumericArray resultArray;
resultArray = (MWNumericArray)elmModel.ELM(Array_train, Array_trainResult, Array_test);
//将结果转换成数组
double[,] result = (double[,])resultArray.ToArray();
   注意的是如果需要输入字符串怎么办?Matlab中的字符串都是以单引号表示,C# 中是双引号。其实与上方一样。调用MWCharArray的构造函数即可。
            MWCharArray function = new MWCharArray("sig");
elmModel.Saveelmtrain(Array_train, Array_trainResult, 10, function, 1, name);

我还遇到的问题是我需要保存ELM跑出的模型,而且跑出的模型名称由前台用户输入。所以模型名称是变量。这里用到的matlab中的save和Load函数。
具体如下:Name作为输入,将返回的多个输出值保存到Name.mat里
           function [IW,B,LW,TF,TYPE]=Saveelmtrain(P,T,N,TF,TYPE,Name)
%内容省略
save(Name,'IW','B','LW','TF','TYPE');
加载模型的m文件:
  
           function Y=Loadelmpredict(P,Name) 
           %可以分别求出各个值,但是如果要使用这些值,要把这些值(struct形式)转换成cell,cell再转换成数值形式。比较麻烦           % IW=load(Name,'-mat','IW');           % LW=load(Name,'-mat','LW');           % B=load(Name,'-mat','B');           % TF=load(Name,'-mat','TF');           % TYPE=load(Name,'-mat','TYPE');
           %这种方法简单,但是模型名称是常量           % load Name IW LW B TF TYPE
           %这种方法是我需要的,Name是变量。如果想为常量,写成‘模型名’即可。           load(Name,'IW','LW','B','TF','TYPE')

4.常见问题

(1)未能加载文件或程序集“MWArray, Version=2.10.1.0, Culture=neutral,PublicKeyToken=e1d84a0da19db86f”或它的某一个依赖项。试图加。。。。。
      如果引用路径没问题的话,考虑平台的兼容性问题。如果.NET平台是“X86”即32位(如何查看?选择项目中的“Properties”中的“生成”下的“目标平台“),则MWArray也需要是Matlab 32位下的组件。统一即可。(2)"MathWork.MATLAB.NET.Arrays.MWNumericArray"的类型初始值设定发生异常    应该也是系统兼容问题,可通过平台是否都是32位或者都是64位入手。(3)在调用MATLAB程序时,MATLAB内部程序报错    比如:"...MWMCR::EvaluateFunction error... Reference to a cleared variable p ".    考虑将Matlab中”Clear all“等语句去掉。