找回密码
 注册
Simdroid-非首页
查看: 139|回复: 4

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

[复制链接]
发表于 2011-5-21 13:04:04 | 显示全部楼层 |阅读模式 来自 河北廊坊
关于C#调用Matlab的问题,zccbest已经在前面的帖子里面讲的很详细
我只想在这里说下结构体和单元数组的类型转换问题。
Matlab的结构数组和C#是不同的,而Matlab的单元数组,C#没有,所以在Matlab程序中使用结构数组和单元数组作为输入和输出的时候,如何传化为C#的数据类型,就是一个值得探讨的问题,matlab提供了MWArray程序集可以处理这个问题:
下面是我写的一个m文件:

  1. function [x,y,z] = StructCellExample(a,b,c)
  2. if nargin == 0
  3.     a.m = 1;
  4.     a.n = 2;
  5.     b ={rand(2),rand(2)};
  6.     c = 'Hello,World!';
  7. end
  8. x = a.m + a.n;
  9. y = struct('p',cell(size(b)),'q',cell(size(b)));
  10. for i =1 :length(b)
  11.     y(i).p = sum(b{i}(:));
  12.     y(i).q = max(b{i}(:));
  13. end
  14. z = fliplr(c);
复制代码

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

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

然后编写C#代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using MathWorks.MATLAB.NET.Arrays.native;
  6. using SCtestNative;
  7. namespace StructCellExample
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             string[] mn = new string[2];
  14.             mn[0] = "m";
  15.             mn[1] = "n";

  16.             double[,] b1 = new double[2, 2];
  17.             double[,] b2 = new double[2, 2];
  18.             b1[0, 0] = 2.3;
  19.             b1[0, 1] = 1.1;
  20.             b1[1, 0] = 1.5;
  21.             b1[1, 1] = 2.9;
  22.             b2[0, 0] = 1.4;
  23.             b2[0, 1] = 2.8;
  24.             b2[1, 0] = 3.1;
  25.             b2[1, 1] = 4.4;
  26.             int[] ib1 = new int[2];
  27.             ib1[0] = 1;
  28.             ib1[1] = 1;
  29.             int[] ib2 = new int[2];
  30.             ib2[0] = 1;
  31.             ib2[1] = 2;
  32.             MWStructArray a = new MWStructArray(1, 1, mn);
  33.             a.SetField(mn[0], 1);
  34.             a.SetField(mn[1], 2);
  35.             MWCellArray b = new MWCellArray(1, 2);
  36.             b[ib1] = b1;
  37.             b[ib2] = b2;
  38.             string c = "Hello, World";
  39.             Demo MyTest = new Demo();
  40.             object[] xyz = MyTest.StructCellExample(3, a, b, c);
  41.             int[,] x = (int[,])xyz[0];
  42.             MWStructArray y = (MWStructArray)xyz[1];
  43.             string[] pq = y.FieldNames;
  44.             double[,] y1p = (double[,])y.GetField(pq[0], 1);
  45.             double[,] y1q = (double[,])y.GetField(pq[1], 1);
  46.             double[,] y2p = (double[,])y.GetField(pq[0], 2);
  47.             double[,] y2q = (double[,])y.GetField(pq[1], 2);
  48.             char[,] z = (char[,])xyz[2];
  49.             Console.WriteLine("程序运行完毕");
  50.             Console.WriteLine("输出第一个返回参数");
  51.             Console.WriteLine("a={0}", x[0, 0]);
  52.             Console.WriteLine("输出第二个返回参数");
  53.             Console.WriteLine("y(1).{0}={1}", pq[0], y1p[0, 0]);
  54.             Console.WriteLine("y(1).{0}={1}", pq[1], y1q[0, 0]);
  55.             Console.WriteLine("y(2).{0}={1}", pq[0], y2p[0, 0]);
  56.             Console.WriteLine("y(2).{0}={1}", pq[1], y2q[0, 0]);
  57.             Console.WriteLine("输出第三个返回参数");
  58.             foreach (char i in z)
  59.                 Console.Write(i);
  60.             Console.WriteLine(System.Environment.NewLine);
  61.         }
  62.     }
  63. }

复制代码

运行:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2011-5-21 14:26:19 | 显示全部楼层 来自 北京
Simdroid开发平台
你用的是哪个版本的VS?
我用的是VS2005
没有找到Microsoft.CSharp
回复 不支持

使用道具 举报

 楼主| 发表于 2011-5-21 14:39:00 | 显示全部楼层 来自 河北廊坊
2# ljelly
这个不需要的,只需要MWArray和生成的带native的,这两个程序集就可以了
我用的是VS2010
回复 不支持

使用道具 举报

发表于 2011-6-29 17:10:36 | 显示全部楼层 来自 河北廊坊
如果结构数组是一个包含子域的嵌套结构怎么办?该如何传递
回复 不支持

使用道具 举报

发表于 2011-7-8 09:17:45 | 显示全部楼层 来自 河北廊坊
本帖最后由 feynmand 于 2011-7-8 09:20 编辑
如果结构数组是一个包含子域的嵌套结构怎么办?该如何传递
feynmand 发表于 2011-6-29 17:10

之前对c#基本没有了解,所以在赋值的时候出现了些问题,然后这个嵌套数组的传递困扰我好几天。其实赋值也挺简单,先建立子结构数组,然后赋值给上层结构数组某一个域就可以了。示例代码如下:



  1.             MWStructArray option11 = null;
  2.             MWStructArray option22 = null;
  3.             MWStructArray para = null;

  4.             string[] myFieldNames = new string[2];
  5.             myFieldNames[0] = "a";
  6.             myFieldNames[1] = "b";
  7.             option11 = new MWStructArray(1, 1, myFieldNames);
  8.             option11["a", 1] = 5;
  9.             option11["b", 1] = 7;


  10.             string[] myFieldNames1 = new string[2];
  11.             myFieldNames1[0] = "c";
  12.             myFieldNames1[1] = "d";
  13.             option22 = new MWStructArray(1, 1, myFieldNames1);
  14.             option22["c", 1] = 5;
  15.             option22["d", 1] = 7;


  16.             string[] myFieldNames2 = new string[2];
  17.             myFieldNames2[0] = "option1";
  18.             myFieldNames2[1] = "option2";
  19.             para = new MWStructArray(1, 1, myFieldNames2);
  20.             para["option1", 1] = option11;
  21.             para["option2", 1] = option22;

  22.             MWArray output4 = demo.testfun3(para);
复制代码

  1. function x=testfun3(para)
  2. x(1)=para.option1.a+para.option2.c
  3. x(2)=para.option1.a+para.option2.d
  4. x(3)=para.option1.a+para.option1.b
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-6 09:20 , Processed in 0.031359 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表