声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6890|回复: 8

[混合编程] C#调用Matlab中结构数组和单元数组的类型转换

[复制链接]
发表于 2011-5-21 13:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 qibbxxt 于 2011-5-21 13:15 编辑

关于C#调用Matlab的问题,simwe的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
生成的dll.JPG
引用.JPG
编写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. }
复制代码
运行:
效果.jpg


评分

2

查看全部评分

回复
分享到:

使用道具 举报

发表于 2011-5-21 14:43 | 显示全部楼层
回复 1 # qibbxxt 的帖子

挺好的,不同高级语言和平台之间的相互引用看来确实需要解决一系列细节啊。

但不知matlab是否有网络通信的接口,若有的话,将C#(调用方)作为client ,MATLAB程序作为sever,参数的输入和返回都已本地网络通信的方式进行,是否可行呢?

点评

赞成: 5.0
赞成: 5
这个倒是没有研究过,有时间可以找找  发表于 2011-5-21 16:25
发表于 2011-5-21 21:51 | 显示全部楼层
谢谢主任,学习了!但自己不怎么用C#语言,用C和Fortan较多。
发表于 2011-5-22 18:18 | 显示全部楼层
以前研究过一段C#调用matlab,进来学习下!
发表于 2011-5-22 19:54 | 显示全部楼层
有没有matlab调用COM(或ActiveX)的例子?
最进想从matlab调用一分析软件的kit
发表于 2011-6-17 10:26 | 显示全部楼层
有没有用matlab调用C#的数组的问题啊?

点评

不明白你要说什么?  发表于 2011-6-20 08:48
发表于 2012-3-15 18:10 | 显示全部楼层
谢谢斑竹,学习了
发表于 2013-1-17 17:08 | 显示全部楼层
你好,我看了你发的 C#调用Matlab中结构数组和单元数组的类型转换 贴,我想请教下,我现在matlab有个.m函数,我用C#调用转换的dll文件,而m函数中的输入项是1行多列的数组,请问我在C#中如何定义输入项。麻烦可以给我个简单的例子代码吗?你贴中的代码有点看不懂,谢谢!
发表于 2013-6-2 17:35 | 显示全部楼层
非常不错的帖子

补充内容 (2013-6-4 10:02):
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-24 16:24 , Processed in 0.076865 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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