低版本Matlab(2020b)与高版本Visual Studio(VS2022)实现M、C/C++混合编程(调试)

2023-05-16

目录

  • 前言
  • 一、构造编译器的配置文件到Matlab安装目录
  • 二、在Matlab中配置为使用'Microsoft Visual C++ 2022 (C)' 以进行 C 语言编译
  • 三、验证M文件与C文件混合编译
  • 四、配置Cuda加速Matlab程序
  • 总结
  • 参考资料

前言

刚毕业工作发现团队目前是采用Matlab与C/C++混合编程,代码主体为M文件,其中很多函数都需要利用C代码来进行实现,推进下一步IP设计的工作(这一部分我也不太懂,如RTL等等,只知道与Verilog、FPGA有关)。

公司电脑是Matlab 2020b or 2021b配合Visual Studio 2017使用,高版本Matlab与低版本Visual Studio安装完直接就能使用。

我自己电脑是学校期间装的 Matlab2020b ,由于想熟悉一下M、C/C++混合编译,因此想在自己电脑上配置一下环境。

VS我是直接在微软VisualStudio官网的最新版 Visual Studio 2022 Community 版本,想着新点用着也应该问题不大,结果发现在Matlab中使用 >>mex -setup 命令时无法配置为使用’Microsoft Visual C++ 2022 ©’ 以进行 C 语言编译,故着手从网上查找资料进行配置,但发现网上资料对于Matlab与Visual Studio 2022混合编程的资料基本没有,自己刚好误打误撞在不重装、升级Matlab版本到2022a、b的情况瞎解决了问题。下面以 Matlab2020b 配置 Visual Studio 2022 为例给出具体解决办法。

一、构造编译器的配置文件到Matlab安装目录

在Matlab中使用 MEX 可以编译C/C++ ,需要先配置好编译器,可以使用 >>mex -setup 命令来设置。如果电脑上是先安装的Visual Studio,然后安装Matlab,那么一般情况下,只需要在命令行输入 >>mex -setup 按照提示选择即可完成编译器的设置。

但是,假如是先安装的Matlab后安装的Visual Studio,或者其它一些原因,很可能 >>mex -setup 命令无法找到计算机中的Visual Studio编译器,因此需要进行一些修改才能成功配置编译器。

在Matlab的安装目录 …\MATLAB\R2020b\bin\win64\mexopts 目录中有各种编译器的配置文件,Matlab就是依靠这些xml文件和编译器建立关联,对应编译器的 .xml 文件会到windows系统的注册表中读取编译器和SDK的路径信息,之所以 >>mex -setup 命令无法找到编译器就是因为注册表中缺少编译器和SDK的路径信息。
Matlab配置文件
这里是我的电脑 …\mexopts 下配置文件,原本是没有 红色矩形框msvc2022.xmlmsvcpp2022.xml 两个 .xml 文件的。根据网上方法,可以在高版本的Matlab中得到你所需要的配置文件,我没有这么做的原因一个是懒得重新安装Matlab,另外也不确定Matlab2022a、b中是否有没有上述两个配置文件,在网上也查不到相关信息。

因此,我就想着能不能自己构造这两个文件,根据2015、2017和2019版本的 .xml 文件,发现还是有规律的,而且配置文件基本没有变化,这里是msvc2019.xmlmsvcpp2019.xml 文件的内容。
msvc2019.xml
msvcpp2019.xml
其实,只需要将两个文件进行修改就可以了:

  1. 将两个文件的第3行 Name=“Microsoft Visual C++ 2019 ©” 改为 Name=“Microsoft Visual C++ 2022 ©”
  2. 将两个文件的第4行 ShortName=“MSVCPP160” 改为 ShortName=“MSVCPP170”
  3. 将两个文件的第6行 Version=“16.0” 改为 Version=“17.0”
  4. 最后将将两个文件中的所有 [16.0,17.0) 改为 [17.0,18.0),每个文件中均有12处需要修改。

不确定我有没有遗漏的修改的地方,如果嫌麻烦也可以直接下载 msvc2022.xmlmsvcpp2022.xml 这两个文件: msvc2022.xml、msvcpp2022.xml ,提取码:6y42

二、在Matlab中配置为使用’Microsoft Visual C++ 2022 ©’ 以进行 C 语言编译

若在没有 msvc2022.xmlmsvcpp2022.xml 在Matlab命令行输入 >>mex -setup ,则会出现 错误使用 mex
错误使用 mex
为了清楚Matlab2020b搜索编译器和SDK的过程,可以使用 >>mex -setup -v 命令可以看到搜索过程:
Matlab2020b搜索编译器和SDK的过程(未添加2022版配置文件)
在将构造的配置文件 msvc2022.xmlmsvcpp2022.xml 加入到Matlab的安装目录 …\2020b\bin\win64\mexopts 目录中,在Matlab命令行中输入 >>mex -setup -v 搜索过程为:
Matlab2020b搜索编译器和SDK的过程(添加2022版配置文件后
可以看到,此时成功将Matlab的MEX 配置为使用 ‘Microsoft Visual C++ 2022 ©’ 以进行 C 语言编译。

在其他资料中有提到需要修改注册表或者增加系统环境变量等操作,但我操作完以上步骤后就已经配置成功了,我想的是可能系统自动帮我进行上述提到的一系列操作。
如果你的Matlab配置 Visual Studio失败,可以参考一下参考资料

三、验证M文件与C文件混合编译

  1. 首先,新建一个工程文件夹,新建一个.m文件保存在此文件夹中。
clc
clear all
close all

a = 1;
b = 5;
c = MyAdd(a, b);

disp(' ');
disp(['   MyC = ' num2str(c)]);

fprintf(['\n']);
fprintf(['   MyC = ' num2str(c) '\n']);

在此.m文件中有一个 c = MyAdd(a, b) 函数,Matlab中没有这个函数,自己也没有定义,因此是无法直接运行的。

  1. 打开VS2022,新建一个.c或者.cpp文件,命名需要与.m文件中所调用的函数名相同,即 MyAdd.cMyAdd.cpp均可。
/*=================================================================
 * mexfunction.c
 *
 * This example demonstrates how to use mexFunction.  It returns
 * the number of elements for each input argument, providing the
 * function is called with the same number of output arguments
 * as input arguments.


 * This is a MEX-file for MATLAB.
 * Copyright 1984-2018 The MathWorks, Inc.
 * All rights reserved.
 *=================================================================*/
#include "mex.h"
void add(double* x, double* y, double* z)
{
	*z = *x + *y;
}

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) {
    int i;
    double *A;
    double *B;
    double *C;
    /* Examine input (right-hand-side) arguments. */
    mexPrintf("\n%d input argument(s).", nrhs);
    for (i = 0; i < nrhs; i++) {
        mexPrintf("\n\tInput Arg %i is of type:\t%s ", i, mxGetClassName(prhs[i]));
    }
    A = mxGetPr(prhs[0]); //取得输入变量的指针
    B = mxGetPr(prhs[1]);
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); //创建输出矩阵
    C = mxGetPr(plhs[0]);
    add(A, B, C);
    //* C = (*A) + (*B) ;

    /* Examine output (left-hand-side) arguments. */
    mexPrintf("\n\n%d output argument(s).\n", nlhs);
    if (nlhs > nrhs)
        mexErrMsgIdAndTxt("MATLAB:mexfunction:inputOutputMismatch",
            "Cannot specify more outputs than inputs.\n");
}

此例程是根据 mexFunction.c 修改的,可以在Matlab官方文档中搜索 mexFunction 得到,更多内容请参见官方文档:

doc mex
  1. 在Matlab命令行中输入 >>mex MyAdd.cpp 对其进行编译;
    mex MyAdd.cpp
  2. 此时在Matlab中运行.m文件即可。
    运行.m文件

四、配置Cuda加速Matlab程序

在查找资料过程发现可以用 Cuda加速Matlab程序 (是我太菜了),同样也需要与Visual Studio版本对应的.xml配置文件,在Matlab的安装目录 …\MATLAB\R2020b\toolbox\parallel\gpu\extern\src\mex\win64 中,Matlab2020b中一共有三种版本的配置,分别是2015、2017和2019。
cuda的.xml配置文件
打开看了一下与 msvc2022.xmlmsvcpp2022.xml 很像,我想着是不是可以用同样的方法编一个.xml就可以了,由于我的台式机为A家显卡,应该是没办法试了,之后用笔记本尝试一下。

具体配置步骤和方法请参考参考资料。

总结

自己误打误撞试成功了,还是挺幸运的。另外,走了一遍整个流程对编写mexFunction也是很有帮助的,之后还需要进一步学习,不然看着团队的代码就头大,原理,原理不懂,代码,代码变量多得头晕。

参考资料

[1] Matlab2016及以上版本设置VS编译器
[2] 解决matlab遇到的“错误使用 mex未找到支持的编译器或 SDK。”
[3] 快速解决matlab出现错误使用mex,未找到支持的编译器或 SDK的提示
[4] 低版本MATLAB配置高版本Visual Studio进行C/C++编译
[5] 在Matlab中通过mex使用cuda的方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

低版本Matlab(2020b)与高版本Visual Studio(VS2022)实现M、C/C++混合编程(调试) 的相关文章

  • 将角度定量数据转换为定性图像

    我是一名晶体学家 试图从多达 5000 个文件中分析晶体方向 Matlab 能否转换表格中的角度值 如下所示 进入一个看起来像这样的表 这是一个基于 Lakesh 想法的更具体的例子 然而 这将处理任意数量的旋转 首先从中间有一条带的基本圆
  • 在 Matlab 中生成加权随机布尔矩阵

    我想生成一个5x5MatLab 中的矩阵仅由 1 和 0 组成 但是我希望能够设置任何值为 1 的可能性 我希望任何元素有 90 的机会为 1 而不是 0 然而我不希望总是有 90 的 1 和 10 的 0 我只是希望这种情况更有可能发生
  • 通过在 MATLAB 中填充当前值来扩展数组

    我有一个相当简单的问题 我只是想知道在 MATLAB 中是否有一种简单的方法可以做到这一点 即一个函数来完成此任务 而不是自己编写循环或其他东西 假设我有一个时间序列 其中 Time 是1 1 1000和数据是2 1 1 1000 我想通过
  • 分析 mex 函数

    我刚刚用 c 将 Matlab 程序重写为 mex 函数以加快速度 并取得了出色的结果 这个优化决策是一个非常非常好的主意 无需线程即可将速度提高 20 倍 它仍然让我很好奇 mex 函数将时间花在什么上 并希望找出可能的瓶颈 我正在寻找一
  • 从 Excel 读取字符串到 Matlab 中?

    我想从 Excel 文件中将字符串读入 Matlab ID xlsread data xlsx 1 D2 D4 D2 D4 范围内的单元格中包含字符串 当我尝试将字符串导入 Matlab 时 我得到的只是一个空列表 我能做什么来解决这个问题
  • 使用正则表达式清除工作区中的变量(例外)

    我想清除工作区中的所有变量 但有一些由正则表达式定义的例外 功能clear有一个附加选项 regexp clear regexp expr1 exprN清除与任何一个匹配的所有变量 列出的正则表达式 该选项仅清除变量 所以我正在寻找相反的东
  • 将 3D 矩阵与 2D 矩阵相乘

    假设我有一个AxBxC matrix X and a BxD matrix Y 是否有一种非循环方法可以将每个C AxB矩阵与Y 作为个人喜好 我希望我的代码尽可能简洁和可读 这是我会做的 尽管它不符合您的 无循环 要求 for m 1 C
  • 如何在 Matlab 中使用变化的输入/时间相关的输入函数求解 DAE?

    我正在使用 ode15i 求解器求解 DAE 问题 我有 8 个变量和 8 个方程 系统很复杂 到目前为止唯一可用的求解器是 ode15i 我使用过该指南 http se mathworks com help symbolic set up
  • 使用 MATLAB 读取 CSV 文件?

    我正在尝试使用 MATLAB 读取 csv 文件 这是我的代码 csvread out2 csv out2 csv 如下所示 03 09 2013 23 55 12 129 32 129 33 03 09 2013 23 55 52 129
  • 连接每第 n 行

    我在矩阵中得到了一个数据集 如下所示 从 Excel 导入 matrix Cat1 1 2 3 4 Cat2 9 10 11 12 Cat3 17 18 19 20 Cat1 5 6 7 8 Cat2 13 14 15 16 Cat3 21
  • 隐藏图中某些图形对象的 MATLAB 图例条目

    MATLAB 图例列出了绘图中的所有内容 包括您在绘图上放置的指南 绕过这个问题的软糖就是要做的 Plot Add legend Add guidelines 然而 MATLAB 将最新的行放在前面 这意味着指南将位于显示的数据之上 丑陋且
  • SPMD 与 Parfor

    我对 matlab 中的并行计算很陌生 我有一个创建分类器 SVM 的函数 我想用几个数据集来测试它 我有一个 2 核工作站 所以我想并行运行测试 有人可以向我解释一下以下之间的区别 dataset array dataset1 datas
  • Windows 上 Matlab 64 位版本的免费 SCM [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当 Matlab 安装为 64 位版本时 它只能使用 64 位源代码控制系统 是否有免费的源代码控制系统
  • 当 MATLAB 发生错误时如何继续循环?

    我正在使用函数将一些 dat 文件转换为 mat 文件 我在循环内调用此函数来转换多个文件 在某些情况下 我的 dat 文件已损坏 函数无法转换并发生错误 从而停止循环 现在我的问题是 是否有任何命令 当错误发生时 它应该跳过循环中的当前
  • 如何将 Simulink 编码器编译器版本设置为支持 C++11 的版本?

    我正在尝试将代码合并到 Simulink 及其嵌入式编码器中 该代码使用 C 11 扩展 跑步mex setup c 给出这个输出 mex setup c MEX configured to use Xcode Clang for C la
  • 如何在matlab中显示图像上的点?

    我有一些像素点 比如 p1 1 1 和 p2 1 10 等等 我想以任何颜色在图像上显示这些点 这个怎么做 MATLAB plot http www mathworks com help techdoc ref plot html文档非常全
  • MATLAB:解包函数

    我正在与 Mathworks 的某人讨论 unwrap http www mathworks com access helpdesk help techdoc ref unwrap html函数中对于 以外的跳跃容差有一个 bug 并且希望
  • 如何从 Matlab 在 vi​​rtualenv 中执行 Python 代码

    我正在创建一个用于研究的 Matlab 工具箱 我需要执行 Matlab 代码 但也需要执行 Python 代码 我想允许用户从 Matlab 执行 Python 代码 问题是 如果我立即执行此操作 我将必须在 Python 环境中安装所有
  • Google Chrome 的互联网历史记录脚本

    我并不是在寻找 最佳 或最有效的脚本来执行此操作 但我想知道是否存在一个脚本可以从 Google Chrome 中提取一天的互联网历史记录并将其记录到 txt 文件中 我更喜欢用 Python 或 MATLAB 编写 如果你们有不同的方法
  • 从彩色背景中提取黑色对象

    人眼很容易辨别black来自其他颜色 但是计算机呢 我在普通的A4纸上打印了一些色块 由于组成彩色图像有青色 品红色和黄色三种墨水 所以我设置每个块的颜色C 20 C 30 C 40 C 50 以及其余两种颜色是 0 这是我的源图像的第一列

随机推荐

  • 使用stm32解析富斯i6接收机(IBUS)

    文章目录 1 通信协议解析说明2 驱动程序设计3 实测4 使用串口空闲中断 43 DMA接收5 源码 1 通信协议解析说明 常见的官方遥控器大概如下所示 xff1a 常用的搭配接收机 xff1a 这里需要注意的是 xff1a i6是可以刷十
  • 编码电机PID调试(速度环|位置环|跟随)

    文章目录 1 编码电机认识2 上位机波形显示1 功能介绍2 协议说明 3 速度环调试验证4 位置环调试验证5 实现跟随效果 前面的文章中有讲过编码电机串级PID相关的知识 xff0c 以及一些PID的调试经验 xff0c 这里我最近正好又把
  • 树莓派安装ubuntu mate记录

    文章目录 1 系统下载1 ubuntu下载2 ubuntu mate下载 2 系统安装3 系统使用1 ubuntu系统2 ubuntu mate系统 这个算个失败的记录贴吧 xff0c 这个系统安装过程不太流畅 xff0c 使用起来也有很多
  • 平衡小车的一些常见问题总结

    文章目录 1 基本理论2 直立环速度环串级pid3 代码差异的解释4 转向环 1 基本理论 PID控制 pid控制值对偏差进行比例 xff0c 积分和微分的控制 xff0c 分别是三个部分 xff0c 对应为比例单元 xff0c 积分单元和
  • Ubuntu下tar命令使用详解 .tar解压、.tar压缩

    1 tar参数选项2 tar压缩命令3 tar解压缩命令4 解压安装5 tar bz2解压缩命令6 Linux压缩和解压 bz2文件 bzip2 Linux tar 命令 在Linux平台 xff0c tar是主要的打包工具 tar命令通常
  • 裸机开发之驱动开发

    一 驱动开发的基础理解 在计算中 xff0c 设备驱动程序是一种计算机程序 xff0c 用于操作或控制连接到计算机的特定类型的设备 驱动程序提供了与硬件设备的软件接口 xff0c 使操作系统和其他计算机程序可以访问硬件功能 xff0c 而无
  • STM32HAL库使用ESP8266模块

    ESP8266模块是一个可是实现蓝牙和WiFi一体的模块 xff0c ESP8266 是一个完整且自成体系的 WiFi 网络解决方案 xff0c 能够独立运行 xff0c 也可以作为 slave 搭载于其他 Host 运行 ESP8266模
  • 几种数字传感器介绍(一)————温湿度传感器(HDC1080)

    一 温湿度采集传感器 xff08 HDC1080 xff09 1 简要概述 HDC1080是一种集成温度传感器的数字湿度传感器 xff0c 具有出色的测量精度和超低的功耗 其具有14位测量分辨率 xff0c 相对湿度精度为 2 温度精度为
  • STM32F103xx / STM32F429VET6最小系统原理图

    STM32F429VET6核心板原理图 一 前言 先前使用过的是STM32F1系列 xff0c 只使用和绘制过STM32F103C8T6和STM32F103ZET6的板子 心血来潮想试一下STM32F4系列和F1系列在编程上有什么差别 xf
  • FreeRTOS - 多任务使用要点

    一 临界段应用 1 临界段作用 在程序访问资源时 xff0c 不希望被其他任务或者中断打断 xff0c 这段要执行的代码 xff0c 称为临界代码段 1 1不想被打断访问的资源 xff08 临界段保护 xff09 读取或者修改变量 xff0
  • 项目准备及自我介绍

    项目准备及自我介绍 1 自我介绍 面试官你好 xff0c 我叫XXX xff0c 就读于重庆邮电大学 xff1b 实验室是国家信息无障碍研发中心 xff1b 研究生期间 xff0c 参与两起机器人项目 xff0c 一是基于SLAM的清洁机器
  • 卸载重装Android Studio导入先前的版本,或者是误判SDK installed解决方法。(包含window,mac,Linux)

    我安装了几次Android Studio 之前一直不太稳定 xff0c 特别是想要导入别人的项目时 xff0c 版本不兼容真的会导致很多问题 尤其是他会下载gradle版本 xff0c 花费很长时间占用内存也就罢了 xff0c 更过分的是如
  • gcc编译过程

    gcc编译过程 文章目录 gcc编译过程1 预处理 Preproceessing 2 编译 Compilation 3 汇编 Assembly 4 链接 Linking 一般在windows下编译代码的时候是直接生成了可执行文件 xff0c
  • STM32串口printf调试输出(SSCOM V5.13.1)

    文章目录 1 原理图分析2 配置使能串口USART13 添加代码4 烧录连接显示5 浮点数输出 1 原理图分析 PC与CPU相互通信就是通过USB Type C接口和USB电平转换实现的 我们可以看到 xff0c CPU通过管脚USART1
  • CMakeLists文件的编译

    文章目录 CMakeLists的编译CMakeLists编译原理 文件路径 xff1a 编写CMakeLists txt CMakeLists常用命令 CmkeLists的基本步骤1 1 CMake版本1 2 软件包名称1 3 查找相关的C
  • 决策树--CART算法

    文章目录 1 Crat算法 分类树 1 1基尼系数1 2连续型特征处理1 3CART算法1 5 举例说明1 5 代码 2 回归树 1 Crat算法 分类树 1 1基尼系数 CART是基于基尼 Gini 系数最小化准则来进行特征选择 xff0
  • 深度学习——几种学习类型

    迁移学习 深度学习中 xff0c 最强大的理念之一就是 xff0c 有的时候神经网络可以从一个任务中习得知识 xff0c 并将这些知识应用到另一个独立的任务中 所以例如 xff0c 也许你已经训练好一个神经网络 xff0c 能够识别像猫这样
  • Ubuntu16.04无法更新apt,一直报错

    我是在VirtualBox里用的Ubuntu xff0c 安装好后一直无法更新apt Ubuntu版本是16 04 试过换各种源都失败了 xff0c 已经折磨我三天了 求求各位大佬帮我解答一下什么原因 图一是从系统设置里换源的问题 xff1
  • 用JS实现猜数字游戏

    实现目标 随机生成一个1到10的整数 xff0c 由你来猜 xff0c 直到猜对为止 实现效果图 实现方法 1 随机生成一个1到10的整数 使用Math random 方法 2 需要一直猜到正确为止 所以使用while循环更简单 3 核心算
  • 低版本Matlab(2020b)与高版本Visual Studio(VS2022)实现M、C/C++混合编程(调试)

    目录 前言一 构造编译器的配置文件到Matlab安装目录二 在Matlab中配置为使用 39 Microsoft Visual C 43 43 2022 C 39 以进行 C 语言编译三 验证M文件与C文件混合编译四 配置Cuda加速Mat