• C++ -- mwArray用法


    在vc中调用MATLAB产生的组建时,需要将vc中的参数转换成mwArray格式。

    对mwArray赋值,主要包括矩阵赋值和字符串赋值。

    一.矩阵赋值

    <1>mwArray 定义矩阵变量

                mwArray  A(rows, cols, type)

                参数说明:

    •  A  : 变量名
    • rows:行数
    • col   :列数
    • type :数t据类型

    整体含义是:定义矩阵A,行数为:rows,列数为:cols,类型为:type

    typedef enum  
    {  
        mxUNKNOWN_CLASS = 0, //未知类型  
        mxCELL_CLASS, //细胞类型  
        mxSTRUCT_CLASS, //结构类型  
        mxLOGICAL_CLASS, //布尔类型  
        mxCHAR_CLASS,  //字符串类型  
        mxVOID_CLASS,  //void类型  
        mxDOUBLE_CLASS,   
        mxSINGLE_CLASS, //单精度浮点数  
        mxINT8_CLASS, //  
        mxUINT8_CLASS,  
        mxINT16_CLASS,  
        mxUINT16_CLASS,  
        mxINT32_CLASS,  
        mxUINT32_CLASS,  
        mxINT64_CLASS,  
        mxUINT64_CLASS,  
        mxFUNCTION_CLASS, //函数类型  
        mxOPAQUE_CLASS, //  
        mxOBJECT_CLASS  //对象类型  
    }

    注: 如果参数不是矩阵,只是一个数,令 rows=1,cols=1即可。

    <2>矩阵赋初值:

    int a[6] = {1,2,3,4,5,6}  
    mwArray A(2,3,mxINT32_CLASS);    
    A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols

    注:该过程相当于把1*6的矩阵,转化为2*3的矩阵,matlab转化顺序是,先排第一列,由上到下为a[0] a[1],然后排第二列,由上到下为a[2] a[3],即转化后的A为:

    1     3      5
    
    2     4      6

    如果要使A为:

    1      2     3
    
    4      5     6

    需这样赋值:

    int a[6] = {1,2,3,4,5,6}  
    mwArray A(3,2,mxINT32_CLASS);  //修改此处:行列数互换  
    A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols  

    此时生成的A为:

    1      4
    
    2      5
    
    3      6

    该矩阵转置之后,既可以达到所需形式,转置过程可以在matlab的.m文件中添加,先修改.m,然后在生成dll、lib、h文件。

    尤其是,在图像处理时,如果传递的矩阵为图像数据矩阵,要采用后一种方法赋值,否则,图像会严重变形失真。

    二、字符串赋值

    char str[5] = "abcd";  
    //或 CString str = "abcd"  
    mwArray mwA(str); 

    该过程比较简单。

    DEMO:

    void MainWindow::on_pushButton_clicked()
    {
        mwArray aa(1,1,mxDOUBLE_CLASS,mxREAL);
        mwArray bb(1,1,mxDOUBLE_CLASS,mxREAL);
        mwArray cc(1,1,mxDOUBLE_CLASS,mxREAL);
    
        //参数赋值
        double a[1]={111};       //input
        double b[1]={5};          //input
        double c[1];                  //output
    
        aa.SetData(a,1);           //把a的值赋给aa
        bb.SetData(b,1);           //把b的值赋给bb
        testmat(1,cc,aa,bb);     //目标函数
        cc.GetData(c,1);           //获取输出值cc
    
        ui->label->setText(QString::number(c[0]));   //显示输出值c
    }

    转载于:https://my.oschina.net/zengjs275/blog/730358

  • 相关阅读:
    sizeof与strlen的区别
    面试题46:求1+2+...+n
    opennebula 安装指定参数
    opennebula 开发记录
    virsh 查看hypervisor特性
    opennebula kvm日志
    Cgroup
    opennebula kvm 创建VM oned报错日志
    opennebula kvm 创建虚拟机错误
    golang hello
  • 原文地址:https://www.cnblogs.com/zzzsj/p/14631379.html
Copyright © 2020-2023  润新知