matlab 全局符号变量,优化全局变量使用 - MATLAB Simulink Example - MathWorks 中国

article/2025/9/12 14:01:53

示例模型

在模型 matlab:rtwdemo_optimize_global_ebf 中,Assignment 模块将来自 Inport 模块和 Constant 模块的值赋给输出信号。输出信号馈入 Gain 模块中。

8c7e536036e10041ce828b4afeb20467.png

model = 'rtwdemo_optimize_global_ebf';

load_system('rtwdemo_optimize_global_ebf')

生成代码但不进行优化

在 Configuration Parameters 对话框中,验证是否选择了 Signal storage reuse 参数。

在 Configuration Parameters 对话框中,对于 Optimize global access parameter,选择 None 或在 MATLAB 命令行窗口中输入以下命令:

set_param('rtwdemo_optimize_global_ebf','GlobalVariableUsage','None');

在您的系统临时文件夹中,为编译和检查过程创建一个文件夹:

currentDir = pwd;

[~,cgDir] = rtwdemodir();

编译模型。

rtwbuild(model);

### Starting build procedure for: rtwdemo_optimize_global_ebf

### Successful completion of build procedure for: rtwdemo_optimize_global_ebf

Build Summary

Top model targets built:

Model Action Rebuild Reason

============================================================================================================

rtwdemo_optimize_global_ebf Code generated and compiled Code generation information file does not exist.

1 of 1 models built (0 models already up to date)

Build duration: 0h 0m 43.311s

查看生成的代码而不进行优化。这是 rtwdemo_optimize_global_ebf.c 的一部分。

cfile = fullfile(cgDir,'rtwdemo_optimize_global_ebf_ert_rtw',...

'rtwdemo_optimize_global_ebf.c');

rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);

/* Model step function */

void rtwdemo_optimize_global_ebf_step(void)

{

real_T rtb_Assignment[5];

int32_T i;

/* SignalConversion generated from: '/Assignment' incorporates:

* Constant: '/Constant'

*/

for (i = 0; i < 5; i++) {

rtb_Assignment[i] = rtCP_Constant_Value[i];

}

/* End of SignalConversion generated from: '/Assignment' */

/* Assignment: '/Assignment' incorporates:

* Inport: '/In1'

*/

rtb_Assignment[1] = rtU.In1;

/* Outport: '/Out1' incorporates:

* Gain: '/Gain'

*/

for (i = 0; i < 5; i++) {

rtY.Out1[i] = 2.0 * rtb_Assignment[i];

}

/* End of Outport: '/Out1' */

}

该代码为本地向量 rtb_Assignment 赋值。最后一条语句将局部向量 rtb_Assignment 中的值复制到全局向量 rtY.Out1。更少的全局变量引用会提高执行速度。该代码对全局变量引用使用的指令多于对局部变量引用使用的指令。

在 Static Code Metrics Report 中,检查 Global Variables 部分。

在 Code Generation Report 窗口中,选择 Static Code Metrics Report。

向下滚动到 Global Variables 部分。

选择每个变量前的 [+] 符号以展开它。

b79e3a4540403c9ad08360d9d3cfdec2.png

对全局变量的读写总次数为 2。

生成代码并进行优化

在 Configuration Parameters 对话框中,对于 Optimize global access parameter,选择 Use global to hold temporary results,或在 MATLAB 命令行窗口中输入以下命令:

set_param('rtwdemo_optimize_global_ebf',...

'GlobalVariableUsage','Use global to hold temporary results');

编译模型。

rtwbuild(model);

### Starting build procedure for: rtwdemo_optimize_global_ebf

### Successful completion of build procedure for: rtwdemo_optimize_global_ebf

Build Summary

Top model targets built:

Model Action Rebuild Reason

===========================================================================================

rtwdemo_optimize_global_ebf Code generated and compiled Generated code was out of date.

1 of 1 models built (0 models already up to date)

Build duration: 0h 0m 18.399s

查看优化后的生成代码。这是 rtwdemo_optimize_global_ebf.c 的一部分。

cfile = fullfile(cgDir,'rtwdemo_optimize_global_ebf_ert_rtw',...

'rtwdemo_optimize_global_ebf.c');

rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);

/* Model step function */

void rtwdemo_optimize_global_ebf_step(void)

{

int32_T i;

/* SignalConversion generated from: '/Assignment' incorporates:

* Constant: '/Constant'

*/

for (i = 0; i < 5; i++) {

rtY.Out1[i] = rtCP_Constant_Value[i];

}

/* End of SignalConversion generated from: '/Assignment' */

/* Assignment: '/Assignment' incorporates:

* Inport: '/In1'

*/

rtY.Out1[1] = rtU.In1;

/* Outport: '/Out1' incorporates:

* Gain: '/Gain'

*/

for (i = 0; i < 5; i++) {

rtY.Out1[i] *= 2.0;

}

/* End of Outport: '/Out1' */

}

该代码在不使用局部变量的情况下为全局向量 rtY.Out1 赋值。这种赋值可改善 ROM 和 RAM 消耗量,减少数据副本数。代码将值置于每个赋值操作的目标变量中,而不是在最后复制值。在 Static Code Metrics Report 中,检查 Global Variables 部分。

53e658e241ebe69dce81718ab9c0b716.png

由于使用全局变量保存局部结果,全局变量的读写总次数从 2 增加到 5。这种优化通过重用全局变量来减少数据副本数。

关闭代码生成报告。

rtwdemoclean;

cd(currentDir)


http://chatgpt.dhexx.cn/article/FV4BMpbZ.shtml

相关文章

20220117 matlab 全局变量调试

要在外部和里面都定义global才行貌似 global f1function parameter_inpu__() global f1 f11;endglobal f1 b1 f_temp test1__(); dynamic_e()function parameter_inpu__() global f1 f11;endfunction test1__() global f1 b1 b1f1;endfunction dynamic_e() global f_temp f_te…

matlab变量全局化,matlab全局变量global

matlab global定义全局变量的问题 我写了matlab的一个主函数,放在一个M文件中,然后在这个主函数中调用其可以,前提是两个函数共用变量均需用global声明 例子: 保存f.m内容如下: function f(a,b) global x y; x=a; y=b; 保存g.m内容如下: function [out]=g global x y; ou…

matlab 编程之全局变量(global)和永久变量(persistent)

一、global 官方解释&#xff1a; help globalglobal Define global variable.global X Y Z defines X, Y, and Z as global in scope.Ordinarily, each MATLAB function has itsown local variables, which are separate from those of other functions,and from those of th…

Matlab之全局变量

通过返回修改后的输入参数&#xff0c;可以实现函数内部对Matlab工作空间变量的修改。而另一种殊途同归的方法则是使用全局变量。 声明全局变量需要用到global关键词&#xff0c;语法格式为‘global variable’ 通过全局变量可以实现Matlab工作空间变量空间和多个函数的函数空间…

JavaScript 原型链和继承面试题

JavaScript 原型链和继承问题 JavaScript 中没有类的概念的&#xff0c;主要通过原型链来实现继承。通常情况下&#xff0c;继承意味着复制操作&#xff0c;然而 JavaScript默认并不会复制对象的属性&#xff0c;相反&#xff0c;JavaScript只是在两个对象之间创建一个关联&am…

11、原型链、原型继承和Class继承

11.1 原型 每个函数都有一个prototype&#xff08;原型&#xff09;属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象&#xff0c;这个对象&#xff08;函数.prototype&#xff09;的用途是包含可以由特定类型的所有实例共享的属性和方法 11.2 原型链 基本思想就是…

原型链和原型继承

什么是原型链&#xff1f; 每一个对象都有自己的原型对象&#xff0c;而原型对象也属于对象也会有自己的原型对象&#xff0c;依次类推就会形成链式结构&#xff0c;然后就构成了原型链&#xff0c;所有对象的原型链最终都会指向object.prototype&#xff0c;而最终object.pro…

关于原型、原型链和原型继承的理解

# 个人理解 原型&#xff1a; prototype首先是只作用于函数的属性&#xff0c;无法直接用于对象或变量。 每个函数中都自带一个__proto__属性(可以存储继承对象中的prototype属性--- p.__proto__ Person.prototype)。 在实例化对象(构造函数)时&#xff0c;寻找某个属性(如dem…

js原型和原型链以及原型继承

目录 一、原型 二、原型链 三、原型链继承 一、原型 原型是Javascript中的继承的基础&#xff0c;JavaScript的继承主要依靠原型链来实现的。 原型 ​ 在JavaScript中&#xff0c;我们创建一个函数A(就是声明一个函数), 就会为该函数创建一个prototype属性。而且也会在内存…

原型、原型链和原型继承

原型继承 编程中对象继承&#xff0c;有类继承和原型继承&#xff1a; 类继承形式上就是&#xff0c;extends 关键字&#xff0c;继承之后&#xff0c;子类就会拥有父类的属性和方法&#xff0c;如下&#xff1a; // 以下是 ES6 class 语法&#xff0c;语法上同类继承一样&a…

【JS继承】JS继承之原型链继承

自我介绍&#xff1a;大家好&#xff0c;我是吉帅振的网络日志&#xff1b;微信公众号&#xff1a;吉帅振的网络日志&#xff1b;前端开发工程师&#xff0c;工作4年&#xff0c;去过上海、北京&#xff0c;经历创业公司&#xff0c;进过大厂&#xff0c;现在郑州敲代码。 JS继…

原型链以及继承的几种方式

原型链以及继承的几种方式 学习原型链前需要了解原型链继承的几种方式 学习原型链前需要了解 只要创建一个新函数&#xff0c;就会根据特定的规则为该函数创建一个 prototype 属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象。这个对象的用途是包含可以由特定类型…

深入JS原型、原型链和继承

文章目录 一、原型的理解1.对象的原型2.函数的原型3.constructor 二、原型链1.概念和理解2.原型链中最顶层的原型 三、继承1.原型链继承&#xff1a;2.借用构造函数继承&#xff1a; 一、原型的理解 1.对象的原型 JavaScript当中每个对象都有一个特殊的内置属性[[prototype]]…

原型链与继承

目录 原型链 继承 Javascript为什么没有方法签名&#xff1f; 原型链继承 构造函数继承 组合继承 原型式继承 寄生继承 寄生组合继承 原型链 原型链是一种原型对象和实例对象的关系&#xff0c;通过属性__proto__进行联系。 继承 继承是一种允许我们在已有的类的基…

JS原型链和继承

JS原型链和继承 认识对象的原型 [[Get]]&#xff1a;JS的存取描述符——get方法&#xff0c;在获取对象属性时会自动调用 JavaScript当中每个对象都有一个特殊的内置属性[[prototype]]&#xff0c;这个特殊的属性指向另外一个对象 [[prototype]]指向的对象&#xff1a; 当我…

JS原型链继承

再讲述JS原型链继承之前&#xff0c;我希望大家能够先理解 《函数&#xff0c;函数原型和函数实例之间的关系》&#xff0c;这样有助于大家理解JS原型链继承的原理,下面先看一张图吧&#xff0c;咱们看图说话&#xff1a; 如果大家看完了 《函数&#xff0c;函数原型和函数实…

原型链和继承的六种实现方式

一省&#xff1a;HTML 12. img标签的alt和title有什么不同&#xff1f; alt&#xff1a; 当图片加载不出来的时候&#xff0c;就会在图片未显示的地方出现一段 alt 设置的属性内容。浏览器的搜索引擎可以通过 alt 属性的文字描述来获取图片。 title&#xff1a; title是鼠…

原型,原型链,原型的继承

原型的作用? 1.节省内存空间 2.实现数据共享(继承) 什么是原型? 任何一个函数都有propotype属性,它本身是一个对象,我们称之为原型 构造函数,实例化对象与原型之间的关系? 1.任何一个函数都有prototype属性,它本身是一个对象,我们称之为原型 2.构造函数也是函数,也都…

JS原型、原型链和7种继承方法【白话文讲解】

前言 在学习JS原型、原型链和继承之前&#xff0c;我们必须先弄懂三个W&#xff0c;也就是我们常说的“学习三问” 学习三问&#xff1a; 1.它是什么&#xff1f;&#xff08;What&#xff09; 2. 为什么用它&#xff1f;&#xff08;Why&#xff09; 3. 什么时候用它&#xff…

原型链与常用继承方法

原型链:当访问一个对象的属性时&#xff0c;如果该对象内部不存在这个属性&#xff0c;就会去该对象的__proto__ 上&#xff08;也就是它构造函数的prototype&#xff09;查找 。该构造函数的prototype上也有一个自己的__proto__ 属性&#xff0c;然后继续向上查找&#xff0c;…