Matlab转C++代码入门————附带详细代码和示例

2023-05-16

文章目录

  • 1 转换
    • 1.1 转换例子
    • 1.2 详细转换过程
  • 2 注意事项
  • 3 实例

1 转换

一般Matlab中的代码,有一部分方法是无法转换成C++的,例如图像化UI、文件写出等接口。一般做转换的话,需要把业务逻辑从界面中抽取出来,去除与界面相关的代码,把需要显示的值,作为函数的返回值。

1.1 转换例子

例如下面的例子,可以从中提取主要的业务逻辑代码:

提取前的源代码:

function varargout = untitled(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @untitled_OpeningFcn, ...
                   'gui_OutputFcn',  @untitled_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function untitled_OpeningFcn(hObject, eventdata, handles, varargin)

set(handles.Dimension,'String',''); % 属性纬度
set(handles.Numbers,'String',''); % 对象个数
set(handles.Clusters,'String',''); % 训练准确率
set(handles.RecNum,'String',''); % 识别对象

handles.output = hObject;

guidata(hObject, handles);

function varargout = untitled_OutputFcn(hObject, eventdata, handles) 

varargout{1} = handles.output;
% 载入数据
function Load_Callback(hObject, eventdata, handles)
% 数据载入控制
global Myfig;
global Convfig;
global TrFig;
load('Fig.mat');
load('Oliver.mat');
bar = waitbar(0,'读取数据中...');
for i=1:100
    str=['训练中...',num2str(100*i/100),'%'];    % 百分比形式显示处理进程,不需要删掉这行代码就行
    waitbar(i/100,bar,str)                       % 更新进度条bar,配合bar使用
end
close(bar);  
Myfig = gRGB;
Convfig = gRGB1;
TrFig = gRGB2;
% data1 = Data1;
set(handles.Dimension,'String',num2str(size(FigData,2))); % 属性维度
set(handles.Numbers,'String',num2str(size(FigData,1))); % 对象个数
set(handles.Clusters,'String',[num2str(85.50),'%']);

function Exit_Callback(hObject, eventdata, handles)
delete(handles.figure1);
close all;

function Iteration_Callback(hObject, eventdata, handles)

function Dimension_Callback(hObject, eventdata, handles)

function Dimension_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function Numbers_Callback(hObject, eventdata, handles)

function Numbers_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function Clusters_Callback(hObject, eventdata, handles)

function Clusters_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
% 展示图片
function Perform_Callback(hObject, eventdata, handles)

cla reset
global Myfig;
global Convfig;
global TrFig;
Cope = get(handles.RecNum,'String');
   if isempty(Cope)
    pause(0.25);
    h=msgbox('请先选择识别对象(1-400)');
    uiwait(h,5);
   else
    TotG=uint8(Convfig{str2num(Cope)}); % 原始模型
    axes(handles.Net);
    imshow(TotG)
    hold on
    axes(handles.ObjFunction);
    TotG1=uint8(Myfig{str2num(Cope)}); % 改进模型
    imshow(TotG1)
    axes(handles.axes4);
    TotG2=uint8(TrFig{str2num(Cope)}); % 待检测模型
    imshow(TotG2)
    hold off
   end

function RecNum_Callback(hObject, eventdata, handles)

function RecNum_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

提取后的代码:

function [TotG, TotG1, TotG2]=t2(Cope)

oliver = coder.load('Oliver.mat'); 

Myfig = oliver.gRGB;
Convfig = oliver.gRGB1;
TrFig = oliver.gRGB2;

TotG=uint8(Convfig{Cope});
TotG1=uint8(Myfig{Cope});
TotG2=uint8(TrFig{Cope});

用于测试的示例代码:

clear all;
clc;
close all;

[TotG, TotG1, TotG2]=dealImage(3);

1.2 详细转换过程

这里转换用的MATLAB Coder,转换过程如下:

  • 1,使用如下功能进行转换;
    在这里插入图片描述
  • 2,输入需要被转换的方法(如果该方法,还调用了其他方法,也只用填写这个主方法即可);
    在这里插入图片描述
  • 3,输入测试用例方法(自动检测的数据类型,需要根据需要更改);

在这里插入图片描述
例如在另一个例子中,如果使用了自动检测的,就会爆出如下的错误:

在这里插入图片描述
这是改写前的数据类型:

在这里插入图片描述
这是改写后的数据类型:
在这里插入图片描述

  • 4,检测生成的c++代码;
    在这里插入图片描述
    5,选择生成的类型、语言、工具链,,Mores Setting可以设置配置的硬件;

在这里插入图片描述

2 注意事项

用于生成c++代码的matlab代码,要需要做一些改写。例如,预先定义变量。

这是原始版本:

indexc = find(Label==iii(1));
indexc = indexc(c);

Result1{1} = 'rank 1';
for i=2:length(indexc)+1
    Result1{i}=data1{indexc(i-1)};
end

这是改写后的版本:

Result1 = cell(dataSize,1);
dataSize=size(data,1);
    
for i=1:dataSize
   Result1{i}='000';
end

Result1{1} = 'rank 1';
for i=2:length(indexc)+1
   Result1{i}=data1{indexc(i-1)};
end

在这里插入图片描述

用生成c++代码时,用到的一些Matlab方法

在这里插入图片描述

在这里插入图片描述

3 实例

图像显示

矩阵信息显示

后续补充

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

Matlab转C++代码入门————附带详细代码和示例 的相关文章

  • 比较元胞数组中的字符串

    我试图在单词列表中找到最常见的单词 到目前为止 这是我的代码 uniWords unique lower words for i 1 length words for j 1 length uniWords if uniWords j lo
  • 如何使用Matlab提高PSD的分辨率

    我有音频信号 我用 Matlab 读取该信号 并使用 pwelch 获取其 PSD 这是我正在使用的代码 x Fs audioread audioFile wav x x 1 mono xPSD f pwelch x hamming 512
  • 如何在 R 或 MATLAB 中为散点图创建阴影误差条“框”

    我想在 R 或 MATLAB 中创建一个简单的散点图 涉及两个变量 x 和 y 它们有与之相关的错误 epsilon x 和 epsilon y 然而 我不是添加误差线 而是希望在每个 x y 对周围创建一个 阴影框 其中框的高度范围从 y
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • 如何获取活动对象 MATLAB GUI 的句柄

    我正在尝试使用 MATLAB GUI 创建日历 我有两个Edit Text对象 edittext1 and edittext2 我想做这个 我把光标放在edittext1然后在日历中选择日期 它会进入文本字段edittext1 同样对于ed
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • MATLAB:比较两个不同长度的数组

    我有两个长度不同的数组 由于采样率不同 需要比较 我想对较大的数组进行下采样以匹配较小的数组的长度 但是该因子不是整数而是小数 举个例子 a 1 1 375 1 75 2 125 2 5 2 875 3 25 b 1 2 3 有什么方法可以
  • 傅里叶变换定理 matlab

    我目前正在尝试理解二维傅里叶位移定理 根据我到目前为止所了解到的情况 图像空间中的平移会导致相位差异 但不会导致频率空间中的幅度差异 我试图用一个小例子来演示这一点 但它只适用于行的移位 而不适用于列的移位 这是一个小演示 我只在这里显示幅
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • 在 Matlab 中显示有理数

    我有两个整数 m n 它们一起形成 m n 形式的有理数 现在我只想以这种理性的形式在 Matlab 中显示它们 我可以通过这样做来做到这一点 char sym m n 所以 如果 例如m 1 n 2 Matlab将显示1 2 然而 如果m
  • 在 MATLAB 中定义其他中缀运算符

    有没有办法在 MATLAB 中定义额外的中缀运算符 具体来说 我想定义两个中缀运算符 gt and lt gt 这些符号是理想的 但如果需要 它可以是单个字符 它调用函数implies and iff以同样的方式 calls and and
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • 定义自定义 Mupad 程序的一般相对搜索路径

    假设我有一个 mupad 笔记本myMupadNotebook mn在路径上 C projectFolder ABC abc 它调用程序MyMupadProcedure mu它位于 C DEF GHI 现在我有一个 Matlab 脚本mai
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 如何为已编译的 MATLAB 创建安装程序并要求用户接受我们的许可条款?

    我正在 MATLAB 中编写程序分发给 Windows 用户 我使用 MATLAB 编译器和 MATLAB r2014a 版本来创建程序 我可以使用 MATLAB 应用程序编译器创建 Windows 安装程序 并且它的工作效果可以接受 但是
  • getappdata 在 MATLAB 中返回空矩阵

    我有一段代码 我在其中使用setappdata然后我使用以下方式调用数据getappdata即使它不为空 它也会返回一个空矩阵 我的一段简化代码如下 function edit1 Callback hObject eventdata han
  • 在 Matlab 的命令窗口中获取旧式帮助

    问题的简短版本 在最新版本的 Matlab 中 我在 Windows 上的 R2014b 和 R2015a 中看到过 当您键入help foo你得到一个简要描述 简介函数及其签名 例如 输入help bsxfun产生类似这样的东西 只有更好

随机推荐