1. 程式人生 > 實用技巧 >C# Matlab 相互呼叫

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)

  2. 打包函式
    如下圖所示,
    1)選擇目標型別(TYPE);
    2)新增需要打包的函式檔案;
    3)重新命名庫名稱。

  3. 重新命名類名稱,或者新增類,分配函式所屬類。完成打包操作。

在生成的檔案中,找到“for_redistribution_files_only”資料夾,裡面有
CalcMatResult.dll CalcMatResultNative.dll 兩個dll檔案,均可使用。

另外,MWArray.dll 在matlab安裝目錄中,參考路徑:

X:\Program Files\MATLAB\R2015b\toolbox\dotnetbuilder\bin\win64\v2.0\

也可以直接使用Everything等軟體直接搜尋。

2、C#端的操作

C#端用到的就是 MWArray.dll 和 CalcMatResultNative.dll 這兩個DLL檔案。

    1. 新增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:\Users\GrassPhy\Desktop\MatlabCsharpDemo\MatlabInterface.dll');

% 靜態方法呼叫
select = MatlabInterface.Dialog.ShowSelectMsg('請選擇...','提示');
if select
    disp('yes');
else
    disp('no');
end

% 成員方法呼叫
dialog = MatlabInterface.Dialog();
dialog.Msg = '提示資訊';
dialog.ShowMsg();