zoukankan      html  css  js  c++  java
  • matlab C++ (VS Qt)混合编程 / mxArray / QT5中文乱码

    一、混合编程环境搭建---依据我的情况,分成了4个部分:

    1:破解matlab,因为matlab破解不完全,编译器不能使用,会出错。(参考https://blog.csdn.net/a125930123/article/details/53508097

      三个文件相应覆盖,但license文件在安装路径里面没有找到,就在help里面找到active。。然后导入lisence文件。

    2、打包.m函数,形成.h .lib .dll文件(参考https://blog.csdn.net/r1254/article/details/52587970

      进行完上面的激活步骤后,完全按照参考博客即可

      --------我的matlab函数中还调用了其他matlab函数,于是我在打包添加函数文件时,将两个函数文件都加进去了。

    3、配置环境:VS环境配置(参考:https://blog.csdn.net/r1254/article/details/52587970

      项目属性中VC++目录:include添加matlab安装目录下externinclude

                库目录添加matlab安装目录下externlibwin32microsoft      (32位系统)

      连接器 -》输入:libeng.lib;libmat.lib;libmex.lib;libmx.lib;mclmcrrt.lib;mclmcr.lib +自己函数生成的.lib文件

      ----------才发现上面两个博客是一个。。

    4、运行,

      运行的时候将三个文件放在工程中放头文件和源文件的文件夹里面,dll文件放在debug文件中。

    二、执行过程----中间涉及到了mxArray,qt5中文乱码

      针对这一部分,没有做过多的研究,只是将自己的程序调通了。

      调用的流程:

      1、先调用初始化函数

        初始化函数建议放在类的构造函数里,terminate函数放在析构函数里。【我在使用这块的时候,如果在调用初始化函数之前该类做了其他事情,那么初始化就会出现错误,于是将初始化放在了最前面,结束函数放在了最后】----下面代码里没写,直接将函数写在构造和析构函数中就行

      2、创建mxArray变量用于传参和接收返回的数据

      3、调用matlab函数,我调用的是前面加mlx的函数【生成了哪些函数,在那个.h文件里都能看到】

      4、调用terminate函数【在析构函数里调用】。完成

      下面是代码: 

      函数传入的参数是一个字符串:

      

    QString dataFilePath;//之前在前面赋值了
    string inStr = qstr2str(dataFilePath);//qstr2str是一个函数
    const char* in = inStr.c_str();
    mxArray *im = mxArrayCreatString(in);//传参
    mxArray *out = mxArrayCreateDoubleMatrix(row,3,mxREAL);//row是文件行数,返回数据的行数也是这些
    
    //调用matlab函数
    mlxCalculateTrajectory(1,&out,1,&im);
    //因为路径里面存在中文字符,在Qt里面不可避免地出现了乱码,网上的方法都是针对Qt4之前的,而且有滥用之嫌,后来就去掉了。下面是参考博客内容:
    //https://blog.csdn.net/baidu_34045013/article/details/58603221
     string qstr2str(const QString qstr) 
    {
      QByteArray cdata
    = qstr.toLocal8bit();
            
      return string(cdata);
    }

      因为程序中获取matlab函数输入数据是动态存在数组里的,而网上常用的方法是memcpy,但是这个函数是将一块连续的内存的数据复制到另外一块连续的内存中。所以针对我的情况,网上有提示说,需要通过循环将数据一个一个赋值。接收数据是一个n*3的矩阵,n的大小未知,采用循环的方式逐个赋值。赋值过程中,matlab是按列进行存储,即先存第一列,再存第二列。。。。。

    for(int i = 0;i < row;i++)
    {
           for(int j = 0; j < 3;j++)
           {
                memcpy(&positionList[i][j],mxGetPr(out)+j*row+i,sizeof(double));
            }  
    }                

    至此就完成了整个过程

      

  • 相关阅读:
    [转]android Intent机制详解
    [转]Android进程与线程基本知识
    HTML背景图片自适应
    边框边界填充理解
    [转]Android 代码自动提示功能
    [转]Windows7:Visual Studio 2008试用版的评估期已经结束解决方法
    eclipse安装、汉化、搭建安卓开发环境
    asp.net控件拖不动。控件错误
    opengl 入门浅学(一)
    opengl 无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll上
  • 原文地址:https://www.cnblogs.com/ling123/p/9134601.html
Copyright © 2011-2022 走看看