C# 调用 Matlab 函数

类型对应关系

    Matlab中一切皆矩阵,只不过维度不同,标量维度1,1 向量维度n,1 矩阵维度 m,n

C#MatlabMWArray.Dimensions[0]MWArray.Dimensions[1]
int / doubleMWNumericArray1       1
int[n] / double[n]MWNumericArrayn1
int[m,n]/double[m,n]MWNumericArraymn

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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值