qibbxxt 发表于 2011-5-21 13:04:04

[原创]C#调用Matlab中结构数组和单元数组的类型转换

关于C#调用Matlab的问题,zccbest已经在前面的帖子里面讲的很详细
我只想在这里说下结构体和单元数组的类型转换问题。
Matlab的结构数组和C#是不同的,而Matlab的单元数组,C#没有,所以在Matlab程序中使用结构数组和单元数组作为输入和输出的时候,如何传化为C#的数据类型,就是一个值得探讨的问题,matlab提供了MWArray程序集可以处理这个问题:
下面是我写的一个m文件:

function = StructCellExample(a,b,c)
if nargin == 0
    a.m = 1;
    a.n = 2;
    b ={rand(2),rand(2)};
    c = 'Hello,World!';
end
x = a.m + a.n;
y = struct('p',cell(size(b)),'q',cell(size(b)));
for i =1 :length(b)
    y(i).p = sum(b{i}(:));
    y(i).q = max(b{i}(:));
end
z = fliplr(c);

用deploytool编译成dll,
程序集:SCtest
类:Demo

新建一个控制台应用程序,添加引用

然后编写C#代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MathWorks.MATLAB.NET.Arrays.native;
using SCtestNative;
namespace StructCellExample
{
    class Program
    {
      static void Main(string[] args)
      {
            string[] mn = new string;
            mn = "m";
            mn = "n";

            double[,] b1 = new double;
            double[,] b2 = new double;
            b1 = 2.3;
            b1 = 1.1;
            b1 = 1.5;
            b1 = 2.9;
            b2 = 1.4;
            b2 = 2.8;
            b2 = 3.1;
            b2 = 4.4;
            int[] ib1 = new int;
            ib1 = 1;
            ib1 = 1;
            int[] ib2 = new int;
            ib2 = 1;
            ib2 = 2;
            MWStructArray a = new MWStructArray(1, 1, mn);
            a.SetField(mn, 1);
            a.SetField(mn, 2);
            MWCellArray b = new MWCellArray(1, 2);
            b = b1;
            b = b2;
            string c = "Hello, World";
            Demo MyTest = new Demo();
            object[] xyz = MyTest.StructCellExample(3, a, b, c);
            int[,] x = (int[,])xyz;
            MWStructArray y = (MWStructArray)xyz;
            string[] pq = y.FieldNames;
            double[,] y1p = (double[,])y.GetField(pq, 1);
            double[,] y1q = (double[,])y.GetField(pq, 1);
            double[,] y2p = (double[,])y.GetField(pq, 2);
            double[,] y2q = (double[,])y.GetField(pq, 2);
            char[,] z = (char[,])xyz;
            Console.WriteLine("程序运行完毕");
            Console.WriteLine("输出第一个返回参数");
            Console.WriteLine("a={0}", x);
            Console.WriteLine("输出第二个返回参数");
            Console.WriteLine("y(1).{0}={1}", pq, y1p);
            Console.WriteLine("y(1).{0}={1}", pq, y1q);
            Console.WriteLine("y(2).{0}={1}", pq, y2p);
            Console.WriteLine("y(2).{0}={1}", pq, y2q);
            Console.WriteLine("输出第三个返回参数");
            foreach (char i in z)
                Console.Write(i);
            Console.WriteLine(System.Environment.NewLine);
      }
    }
}


运行:

ljelly 发表于 2011-5-21 14:26:19

你用的是哪个版本的VS?
我用的是VS2005
没有找到Microsoft.CSharp

qibbxxt 发表于 2011-5-21 14:39:00

2# ljelly
这个不需要的,只需要MWArray和生成的带native的,这两个程序集就可以了
我用的是VS2010

feynmand 发表于 2011-6-29 17:10:36

如果结构数组是一个包含子域的嵌套结构怎么办?该如何传递

feynmand 发表于 2011-7-8 09:17:45

本帖最后由 feynmand 于 2011-7-8 09:20 编辑

如果结构数组是一个包含子域的嵌套结构怎么办?该如何传递
feynmand 发表于 2011-6-29 17:10 http://forum.simwe.com/images/common/back.gif
之前对c#基本没有了解,所以在赋值的时候出现了些问题,然后这个嵌套数组的传递困扰我好几天。其实赋值也挺简单,先建立子结构数组,然后赋值给上层结构数组某一个域就可以了。示例代码如下:



            MWStructArray option11 = null;
            MWStructArray option22 = null;
            MWStructArray para = null;

            string[] myFieldNames = new string;
            myFieldNames = "a";
            myFieldNames = "b";
            option11 = new MWStructArray(1, 1, myFieldNames);
            option11["a", 1] = 5;
            option11["b", 1] = 7;


            string[] myFieldNames1 = new string;
            myFieldNames1 = "c";
            myFieldNames1 = "d";
            option22 = new MWStructArray(1, 1, myFieldNames1);
            option22["c", 1] = 5;
            option22["d", 1] = 7;


            string[] myFieldNames2 = new string;
            myFieldNames2 = "option1";
            myFieldNames2 = "option2";
            para = new MWStructArray(1, 1, myFieldNames2);
            para["option1", 1] = option11;
            para["option2", 1] = option22;

            MWArray output4 = demo.testfun3(para);

function x=testfun3(para)
x(1)=para.option1.a+para.option2.c
x(2)=para.option1.a+para.option2.d
x(3)=para.option1.a+para.option1.b
页: [1]
查看完整版本: [原创]C#调用Matlab中结构数组和单元数组的类型转换