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

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

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

关于C#调用Matlab的问题,simwe的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);

}
}
}
运行:



Rainyboy 发表于 2011-5-21 14:43

回复 1 # qibbxxt 的帖子

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

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

meiyongyuandeze 发表于 2011-5-21 21:51

谢谢主任,学习了!但自己不怎么用C#语言,用C和Fortan较多。

wangyouyi 发表于 2011-5-22 18:18

以前研究过一段C#调用matlab,进来学习下!

tenglang 发表于 2011-5-22 19:54

有没有matlab调用COM(或ActiveX)的例子?
最进想从matlab调用一分析软件的kit

zhangjingtxwd 发表于 2011-6-17 10:26

有没有用matlab调用C#的数组的问题啊?

rencs1 发表于 2012-3-15 18:10

谢谢斑竹,学习了

Joehom 发表于 2013-1-17 17:08

你好,我看了你发的 C#调用Matlab中结构数组和单元数组的类型转换 贴,我想请教下,我现在matlab有个.m函数,我用C#调用转换的dll文件,而m函数中的输入项是1行多列的数组,请问我在C#中如何定义输入项。麻烦可以给我个简单的例子代码吗?你贴中的代码有点看不懂,谢谢!

machreehappy 发表于 2013-6-2 17:35

非常不错的帖子

补充内容 (2013-6-4 10:02):
页: [1]
查看完整版本: C#调用Matlab中结构数组和单元数组的类型转换