C#与Matlab的二三事

实验室需要,继续在Win下面给Matlab作包装,写一些GUI什么的,之前也弄过一些相关的东西。主要采用的MFC加Matlab的方式,

想把GUI做的更好看一些,打算换一种方式尝试一下。具体的方式主要有m文件作成库文件,Matlab Engine等等,对Engine方式做

一些简单的总结。

 添加Matlab Engine的步骤

1.加入引用

Matlab Application  Type Library这个选项

 

2.添加引擎变量

MLApp.MLApp matlab = new MLApp.MLApp(); 

matlab就是需要的引擎对象
本质上主要的数据接口就是 C#数据 -->  Matlab ---> C#环境

接口变量是 System.Array变量,主要函数如下

 http://www.mathworks.cn/cn/help/matlab/call-matlab-com-automation-server.html

控制台范例如下

using System;
namespace ConsoleApplication4
{
class Class1
{
    [STAThread]
    static void Main(string[] args)
    {
        MLApp.MLApp matlab = new MLApp.MLApp(); 

        System.Array pr = new double[4];
        pr.SetValue(11,0);
        pr.SetValue(12,1);
        pr.SetValue(13,2);
        pr.SetValue(14,3);

        System.Array pi = new double[4];
        pi.SetValue(1,0);
        pi.SetValue(2,1);
        pi.SetValue(3,2);
        pi.SetValue(4,3);

        matlab.PutFullMatrix("a", "base", pr, pi);

        System.Array prresult = new double[4];
        System.Array piresult = new double[4];

        matlab.GetFullMatrix("a", "base", ref prresult, ref piresult);
        }
    }
}

 

注意:

GetFullMatrix函数后两个参数分别为, 实数部分的数值, 复数部分的数值, 类似 a + bi, 分别存入两个数组中

如果Matlab环境中只有实数部分的数值, 如此返回会出现运行时异常

可以采用另外一种方式

GetWorkspaceData函数,将数值存入object对象当中,例如

matlab.GetWorkspaceData("varName", "base", out targetInCsharp);

返回到object对象当中,再进行进一步操作

解决了数据传输问题,

那么可以将C#中的数据读入以后传入到Matlab环境当中,再将结果从Matlab环境中读出,更多信息,

参见Matlab官方文档

http://www.mathworks.cn/cn/help/matlab/external-interfaces.html

 

使用GetWorkspaceData的例子

读取的数据返回到 object对象中, 采用out方式

            MLApp.MLApp matlab = new MLApp.MLApp();
            matlab.Execute("cd " + matlabWorkPath);

            object result;
            matlab.Execute("load matlab.mat");
            matlab.GetWorkspaceData("b", "base", out result);
            double[,] d = (double[,])result;
            Console.WriteLine(d[0, 0].ToString());

 写入到matlab的workspace当中

            double[,] dd = new double[1, 5];
            for (int i = 5; i > 0; i--)
            {
                dd[0, 5 - i] = i; 
            }
            object outArray = (object)dd;
            matlab.PutWorkspaceData("b", "base", outArray);

 

posted on 2013-11-01 21:11  小书包_Ray  阅读(1802)  评论(0编辑  收藏  举报

导航