C# 调用 Matlab 函数

类型对应关系

    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 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模式比较好。

你可能感兴趣的:(dotnet,matlab,c#)