项目需要在c#运行,本人不会c#,需要将matlab的算法供c#调用,总结一下本人使用过的方法:
只想看c#调用python的可以往后翻翻,先讲matlab
首先是matlab转为c++代码
期待用matlab转c++代码,然后生成动态链接库供c#调用,这里需要用到matlab的coder工具,实际用了一下,感觉这是不可能的,因为首先matlab语法要做大量修改而且,生成的 代码很乱。特别是算法较大的时候,几乎不可能。
matlab生成动态链接库
这个是最简单的,我是用的是matlab2021b,就拿2020b举例,下载MCRII解释器好像低版本的matlab默认是下载了这个的,你在你的安装目录找到他安装就行,没安装的matlab命令行输入
>> compiler.runtime.download
下载完成后解压安装
- 查看可用的visual studio
mbuild -setup
- 输入命令deploytool
- 选择第三个Library Compiler
- 选择.net assembly选择转换的函数
- 设置名称空间和方法名(我之前导过,所以这里就没设置了)
- 会生成一个文件夹包含以下内容
- 新建一个控制台程序
- 解决方案资源管理器面板右击引用选项
- 点击添加引用,浏览找到这些文件添加引用(前面4个是我自定义的函数生成的dll,都是按刚才的方法生成的,最后一个和matlab有关,参考我的路径,找到你自己的。
因为我不是太懂,所以我直接把生成的东西都复制到项目的Debug目录了,其实好像不用这样。c#代码是参考别人改的,具体参考哪位的我也记不清了,,,见谅见谅,c#实在是不太懂。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MathWorks.MATLAB.NET.Arrays;
using myfunc;
using CLASSIFY;
namespace ConsoleApp12
{
class Program
{
static void Main(string[] args)
{
Train_Model.Class1 d = new Train_Model.Class1();
eegpredict.eegpredict d1 = new eegpredict.eegpredict();
MWArray[] argsOut = new MWArray[1];
MWArray[] argsIn = new MWArray[] { };
MWArray[] argsOut1 = new MWArray[1];
MWArray[] argsIn1 = new MWArray[] { };
d.train_model(1, ref argsOut, argsIn);
d1.EegPredict(1, ref argsOut1, argsIn1);
MWNumericArray mw = argsOut[0] as MWNumericArray;
MWNumericArray mw1 = argsOut1[0] as MWNumericArray;
double[,] res = (double[,])mw.ToArray();
string str = res[0, 0].ToString("F2");
double[,] res1 = (double[,])mw1.ToArray();
string str1 = res1[0, 0].ToString("F2");
Console.WriteLine(res);
Console.WriteLine(str);
Console.WriteLine(res1);
Console.WriteLine(str1);
Console.ReadKey();
}
}
}
至此,完成功能,缺点是太慢了,matlab解释器太大了,对性能要求过高。速度慢到无语,当然在matlab本身跑的就慢。。根本不能奢望,,
有点也很明显,就是图形界面操作非常简单
采用c#调用python
matlab太慢,只能另想办法,我就用python重写了代码,上网搜如何用c#调用python,搜到很多方法。
- 首先可以python编译成dll调用
采用cython编译成dll。这个方法网上教程很多,我和我旁边的python程序员试了挺久也没搞定,配置环境这个事最烦了,后来直接放弃。 - 采用ironpython
这个东西倒是试了,照着网上教程下载了ironpython,简单的程序调用成功,但是涉及第三方库的程序总是module not found,尝试使用sys.path.append()
也没有搞定,反正试了挺久的,配置环境太烦了,后来直接放弃。但是如果成功的话,这个方法应该是交互性最好的。 - 采用这个博主的方法尝试调用,调用成功,速度是matlab六七倍左右,在此感谢,这个方法其实就是感觉和在控制台调用python差不多。 博客地址不过可惜的是这种方法没办法做到源码保密,,
- 没法做到源码保密肯定是不行的,我继续搜索,发现python的.pyc和.pyd文件可以实现源码保密,但是.pyc文件反编译很容易,只能采用.pyd这个东西有的博主说是相当于python里面的动态链接库。下面详细介绍如何使用。使用方法完全参考下面两位博主即可:
- python编译为pyd
- c#调用pyd