zoukankan      html  css  js  c++  java
  • C#与MATLAB之间传递参数

    本文转载自http://www.cr173.com/html/10249_1.html

    MWNumericArray是MWArray和c#中数据的中间类,怎么用?怎样在C参数?

    a.double型、int型等数值类型的变量传递

    MWNumericArray i = null, result = mydouble; 

    i=4; 

    myClass myclass = new myClass(); //实例化 
    result = (MWNumericArray)myclass.myfunc(i); 

    b.字符串(需要用到MWCharArray和MWArray转换
    MWCharArray FileName = myString; 
    MWNumericArray sensitivity; 
    sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)

    c.多个输出参数组成的数组 
    MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取的数组(matlab返回的数组下界是从1开始的) 
    取出数组中的一个元素值 
    mydouble=out_Arr[i].ToScalarDouble(); 
    如上面例子ToScalarDouble一类的toXXXX等方法还有许多。 

    d.result.toArray可以把matlab返回的矩阵变成C#的n x m数组,eg: 
    double[,] csArray= (double[,])result.ToArray(MWArrayComponent

    e.将数组传入Matlab(和传递单个数值的方法一样
    double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } }; 
    MWNumericArray x=dbx; 
    myclass.picture(x); 
    ________________________________________ 

    M文件如何接收和返回? 
    function x=test(h,d) //接收两个参数,返回一个 
    function [x1,x2]=test(h,d) //返回数组 
    ________________________________________ 
    以上为.Net方式连接,以下为COM方式连接(编译速度而言.net的方式要快上很多,而且似乎比较稳定) 
    matlab编译工作 
    - mbuild -setup 
    - deploytool,Matlab Builder for .net,Generic COM Component 
    - 添加m函数文件(eg: myfunc.m),改类名(eg: myComClass),build 
    注册dll 
    regsvr32 myCom.dll 
    regsvr32 mwcomutil.dll 
    VS2005调用: 
    - Reference加Com控件 
    - 调用示例 
    double[,] arr = null; 
    object in_a, out_a; 
    in_a = 500; 
    out_a = arr1; 
    myCom.myComClass mc = new myCom.myComClass(); 
    mc.myfunc(1, ref out_a, in_a); 
    ________________________________________ 

    小例子:(提取matlab返回的两个参数并转化为C#的矩阵) 
    Code 
    testz.testzclass st = new testz.testzclass(); 
    MWArray[] max = st.testz(2); 
    MWNumericArray x1 = (MWNumericArray)max[0]; 
    MWNumericArray x2 = (MWNumericArray)max[1]; 
    double[,] location1 = (double[,])x1.ToArray(MWArrayComponent.Real); 
    double[,] location2 = (double[,])x2.ToArray(MWArrayComponent.Real); 
    label1.Text = location1[1,2].ToString(); 
    其中的M文件: 
    Code 
    function [x1,x2]=testz() 
    x1=[1 2 3; 
    4 5 6; 
    7 8 9;]; 
    x2=[9 8 7; 
    6 5 4; 
    3 2 1;];

    另一篇: 
    以下是本人编程中总结的一些思路,拿出来与大家共享。不对之处,请留言说明。 
    版本:Matlab R2007b ,Visual Studio 2005 
    C++/C#数据类型到M类型 
    此方向转换十分简单。 
    如果C++/C#数据不是数组, 
    • 直接将值传递给已经初始化的MWArray数组中的成员 
    • 直接将数据类型赋值给已经初始化的MWNumericArray变量。 
    • 直接将字符串类赋值给已经初始化的MWCharArray变量。 
    如果是数组类型: 
    • 直接赋值给MWNumericArray变量; 
    • 赋值给MWArray变量,则在前面加上类型转换如:(MWNumericArray)进行强制转换。 
    总之,MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值。 
    M类型到C++/C#数据类型 
    MWArray 
    M类型,它是M文件的编译后内部的标准类型,一切C++/C#类型都要最终转换成此类型,方可作为参数调用M语言函数。 
    MWCharArray 
    M的字符串类型,使用它可以将M中的字符类型转换成C++/C#的字符串类型。 
    MWNumericArray 
    MWNumericArray是MWArray与C#等语言的转换中间类型。 
    常用的转换函数: 
    ① public Array ToArray(MWArrayComponent component); 
    M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。 
    ② public byte ToScalarByte(); 
    M类型转换成C#的字节类型; 
    ③ public double ToScalarDouble(); 
    M类型转换成C#的双精度类型; 
    double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble(); 
    ④ public float ToScalarFloat(); 
    M类型转换成C#的单精度类型; 
    ⑤ public int ToScalarInteger(); 
    M类型转换成C#的整型类型; 
    ⑥ public long ToScalarLong(); 
    M类型转换成C#的长整C/C++/C#数据型类型; 
    ⑦ public short ToScalarShort(); 
    M类型转换成C#的短整型类型; 
    ⑧ public override string ToString(); 
    M类型转换成C#的字符串类型;string arror = mwArgout[2].ToString(); 
    ⑨ public Array ToVector(MWArrayComponent component); 
    M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。 
    下面使用调试过的代码示例表述①⑨两个函数的区别: 
     
    double[,] Temp1 = new double[1,3]; 
    Temp1= 
    (double[,])((MWNumericArray)mwArgout[1]).ToArray(MWArrayComponent.Real); 
     
    double[] s1 = new double[2]; 
    s1 = 
    (double[])((MWNumericArray)mwArgout[1]).ToVector(MWArrayComponent.Real); 
    从以上代码可以看出:函数①得到了二维数组,而⑨则是得到了一维数组。转换成C++/C#数据类型后,它们的维数均为从0开始。

  • 相关阅读:
    如何在eclipse开发环境中连接数据库?oracle和db2
    oracle数据库表的记录误删后如何恢复
    人事经理眼中的好简历
    JavaScript常用方法
    如何解决plsql被用户锁定的问题?
    eclipse 快捷键
    刚开始用9.3的版本,一堆问题。(转)
    十条不错的编程观点(转)
    http://localhost:8099无法登录,出现incorrect info报错信息,怎么办?
    http://localhost:8399/arcgis/rest/services 无法访问,怎么办?
  • 原文地址:https://www.cnblogs.com/qiulang/p/6027154.html
Copyright © 2011-2022 走看看