• C# Matlab 相互调用


    测试环境

    VisualStudio2013 / .net4.0
    Matlab2015b

    高版本的matlab对外接其它语言做得很方便了,并不需要一堆的配置。
    其它语言与matlab的交互操作也类似。

    C#调用Matlab

    基本思路:将matlab函数打包成DLL文件,联合matlab数据支持DLL(MWArray.dll),交付给其它语言程序使用。

    1、Matlab端的操作

    编写matlab函数:

    function [result,m,n] = GetSelfMultiplyResult(list)
    % 计算 矩阵与其转置矩阵的乘积
    % 测试返回多个结果
    result = list*list';
    [m,n] = size(result);
    end
    function result = GetSelfSquareResult(list)
    % 计算 矩阵各元素平方后的结果
    result = list.^2;
    end

    打包函数:

    1. 找到库编译器(LibraryCompiler)
      Matlab库编译器

    2. 打包函数
      如下图所示,
      1)选择目标类型(TYPE);
      2)添加需要打包的函数文件;
      3)重命名库名称。
      打包DLL库

    3. 重命名类名称,或者添加类,分配函数所属类。完成打包操作。
      打包类

    在生成的文件中,找到“for_redistribution_files_only”文件夹,里面有
    CalcMatResult.dll CalcMatResultNative.dll 两个dll文件,均可使用。
    另外,MWArray.dll 在matlab安装目录中,参考路径:

    X:Program FilesMATLABR2015b	oolboxdotnetbuilderinwin64v2.0

    也可以直接使用Everything等软件直接搜索。

    2、C#端的操作

    C#端用到的就是 MWArray.dll 和 CalcMatResultNative.dll 这两个DLL文件。

      1. 添加DLL引用
        添加DLL引用

      2. 演示代码

    复制代码
    using System;
    using CalcMatResultNative; //添加引用
    using MathWorks.MATLAB.NET.Arrays; //添加引用
    
    namespace CsharpMatlabDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[,] list ={{1},{2},{3},{4}}; //列向量
    
                MWArray array = new MWNumericArray(list);
    
                CalcMatResultNative.Multiply multi = new Multiply();
                object resultObj = multi.GetSelfMultiplyResult(3, array);// 3 表示返回的结果数量,要小于等于matlab对应函数实际的返回值数量
                object[] resultObjs = (object[]) resultObj;
    
                double[,] calcResult = (double[,])resultObjs[0];
                double[,] sizem = (double[,])resultObjs[1];
                double[,] sizen = (double[,])resultObjs[2];
    
                Console.ReadKey();
            }
        }
    }
    复制代码

    Matlab调用C#

    matlab调用C#更加简单,先将C#代码编译成dll库,matlab中直接引用即可调用。

    如果失败,注意检查使用的.net版本是否过高,平台(x64/86)是否匹配等问题。
    注意选择Release版本的DLL(C#的Bebug版本也可以引用,但C++的不行)。

    1、C#端操作

    代码

    复制代码
    namespace MatlabInterface
    {
        public class Dialog
        {
            public static bool ShowSelectMsg(string msg, string title)
            {
                DialogResult r = MessageBox.Show(msg, title, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                return r == DialogResult.Yes;
            }
    
            public string Msg { get; set; }
    
            public void ShowMsg()
            {
                MessageBox.Show(Msg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
    
        }
    }
    复制代码

    2、Matlab操作

    复制代码
    % 调用C# dll
    
    % 引用绝对路径
    NET.addAssembly('R:UsersGrassPhyDesktopMatlabCsharpDemoMatlabInterface.dll');
    
    % 静态方法调用
    select = MatlabInterface.Dialog.ShowSelectMsg('请选择...','提示');
    if select
        disp('yes');
    else
        disp('no');
    end
    
    % 成员方法调用
    dialog = MatlabInterface.Dialog();
    dialog.Msg = '提示信息';
    dialog.ShowMsg();
    复制代码
  • 相关阅读:
    Asp.Net Mvc: 应用BindAttribute
    Mvc内建功能(DefaultModelBinder)自动绑定。
    生成随机字母字符串(数字字母混和)
    C#中实现输入汉字获取其拼音(汉字转拼音)的2种方法
    集合里查找数据
    C#自定义导出数据到Excel中的类封装
    MySQL性能优化的最佳20+条经验
    DevExpress.XtraGrid.view.gridview 属性说明
    c# 连接Mysql数据库
    ADO.NET 结构 集中数据库联接结构
  • 原文地址:https://www.cnblogs.com/yuanshuo/p/13477641.html
Copyright © 2020-2023  润新知