概述
类型对应关系
Matlab中一切皆矩阵,只不过维度不同,标量维度1,1 向量维度n,1 矩阵维度 m,n
C# | Matlab | MWArray.Dimensions[0] | MWArray.Dimensions[1] |
int / double | MWNumericArray | 1 | 1 |
int[n] / double[n] | MWNumericArray | n | 1 |
int[m,n]/double[m,n] | MWNumericArray | m | n |
C#程序只与MWArray打交道, MWNumericArray、MWCellArray是MWArray的子类。
Matlab中的MWCellArray是一个特殊类型,MWCellArray是嵌套矩阵,矩阵中的每个Cell也是一个矩阵。例如3×2 cell中,cell[1,1]为 3×3 double,cell[1,2]为2×2 double。
简单调用步骤
1. 将Matlab的.p或.m文件编译成C#的dll;
2. 将C#参数转换为MWArray,依次传递给1的dll中的函数;
3. 根据返回的MWArray的Dimensions 将返回结果转换为C#类型。
配置+反射调用
1. 将Matlab函数视为由函数名、输入参数、输出结果组成的类,伪代码:
public class MatlabFunction
{
public string Name{get;set;}
public string AssemblyFile{get;set;}//matlab编译的dll
public string ClassName{get;set;}//含命名空间
public string MethodName{get;set;}
public List<MatlabFunctionParam> Inputs{get;}
public MatlabFunctionParam Result{get;set;}
}
2. 将不同类型的输入参数与输出结果定义为参数类MatlabFunctionParam,参数类负责C#与Matlab的类型转换,例如IntParam,DoubleParam,IntArrayParam, DoubleArrayParam, MatrixParam等等;
3.通过配置文件的方式,将Matlab函数配置好,然后用反射的方式调用,注意,matlab导出的函数有很多重载,需要给出参数类型进行方法的精确匹配。
var assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + function.Library);
var type = assembly.GetType(function.ClassName);
instance = Activator.CreateInstance(type);//实例化
Type[] types = new Type[function.Inputs.Count];//用于精确匹配方法
for(int i = 0; i < function.Inputs.Count; i++)
{
types[i] = typeof(MWArray);
}
methodInfo = type.GetMethod(function.MethodName, types);//加载方法
效率问题
切忌对大矩阵的MWArray的进行[i,j]索引,效率很低,要先转换为C#二维数组在遍历:
//var value = mwArray[i,j];//低效做法
var array2 = (double[,])mwArray.ToArray();
//var value = array2[i-1,j-1];//高效做法
运行环境要求
虽然只用到了MWArray.dll,要运行程序还是要安装Matlab Runtime,并且版本要跟编译dll的Matlab一致,否则无法运行,感觉不适合给用户安装单机版,做成C/S或B/S模式比较好。
最后
以上就是明亮黄豆为你收集整理的C# 调用 Matlab 函数的全部内容,希望文章能够帮你解决C# 调用 Matlab 函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复