当前位置: 首页 > news >正文

开箱报告,Simulink Toolbox库模块使用指南(六)——S-Fuction模块(TLC)

文章目录

前言

Target Language Compiler(TLC)

C MEX S-Function模块

编写TLC文件

生成代码

Tips

分析和应用

总结


前言

     见《开箱报告,Simulink Toolbox库模块使用指南(一)——powergui模块》

     见《开箱报告,Simulink Toolbox库模块使用指南(二)——MATLAB Fuction模块》

     见《开箱报告,Simulink Toolbox库模块使用指南(三)——Simscape 电路仿真模块》

     见《开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块》

     见《开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)》

Target Language CompilerTLC

        目标语言编译器(Target Language Compiler)代码生成器的重要组成部分。Mathworks官方Help对该部分内容的说明如下所示。

        在使用Simulink自动生成代码时,Library中自带的模块可以顺利的生成代码,但是如果用户在Model中用到了自己开发的C MEX S-Function模块,Simulink就不知道这个模块如何生成代码了。TLC文件的作用就是,告诉Simulink自己想把C MEX S-Function模块生成一些什么样的代码,以及如何与Model中的其他内容互联融合。TLC及模型代码的生成过程如下图所示:

        本文继续以DFT算法为例,介绍如何编写一个TLC文件,将C MEX S-Function模块生成代码

C MEX S-Function模块

        DFT算法的原理讲解和C MEX S-Function模块的开发在上一篇文章中已经完成了,见 《开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)》。到这里仅仅是在Simulink中仿真时可以使用这样一个算法模块,本文是要把他生成C代码。由于算法中涉及了4个状态变量,对应到C语言中就要定义一组全局变量,这在TLC文件中实现会稍微麻烦一些。为了简化该过程,让大家更好地理解TLC,笔者对原有的C MEX S-Function模块进行了一些调整,将全局变量的定义放到了模块外面。如下图所示:

        DFT_CMexSfunc.c中对应代码的调整如下:

//增加一个输入端口
if (!ssSetNumInputPorts(S, 2)) return;
ssSetInputPortWidth(S, 0, 1);
ssSetInputPortWidth(S, 1, 4); //新增的输入端口有4个信号//增加一个输出端口
if (!ssSetNumOutputPorts(S, 2)) return; 
ssSetOutputPortWidth(S, 0, 1);
ssSetOutputPortWidth(S, 1, 4); //新增的输处端口有4个信号

        DFT_CMexSfunc.c调整后需要用mex命令重新编译,如下图所示:

编写TLC文件

        在Model的Workspace文件夹下,新建一个DFT_CMexSfunc.tlc文件,编写tlc代码。写好后的完整内容如下,各部分代码的解释,以注释形式标注在对应位置。

%implements "DFT_CMexSfunc" "C"//与C MEX S-Function模块相对应%% Function: Outputs
%function Outputs(block, system) Output//定义一个输出函数%assign u = LibBlockInputSignal(0,"","",0)//获取输入信号
%assign u_count = LibBlockInputSignal(1,"","",0)
%assign u_t = LibBlockInputSignal(1,"","",1)
%assign u_cos_integ = LibBlockInputSignal(1,"","",2)
%assign u_sin_integ = LibBlockInputSignal(1,"","",3)%assign y = LibBlockOutputSignal(0,"","",0) //获取输出信号
%assign y_count = LibBlockOutputSignal(1,"","",0)
%assign y_t = LibBlockOutputSignal(1,"","",1)
%assign y_cos_integ = LibBlockOutputSignal(1,"","",2)
%assign y_sin_integ = LibBlockOutputSignal(1,"","",3)/%下面是要为C MEX S-Function模块生成的代码%/
if(%<u_count> < 5e3)//为了降低TLC复杂度,将常量L的值5e3直接写出来
{  %<y_cos_integ> = %<u_cos_integ> + %<u>*cos(2*3.14 * 50*%<u_t>);//将常量Freq的值50直接写出来%<y_sin_integ> = %<u_sin_integ> + %<u>*sin(2*3.14 * 50*%<u_t>);%<y_t> = %<u_t> + 1/10e3; //将常量Fs的值10e3直接写出来%<y_count> = %<u_count> + 1;
}
else if(%<u_count> == 5e3)
{%<y> = sqrt((%<u_cos_integ>/L*2)^2 + (%<u_sin_integ>/L*2)^2); //将过程变量real和imag用对应公式直接写出来%<y_count> = %<u_count> + 1;//避免无效运行消耗资源
}
else
{}%endfunction//结束函数定义

        DFT_CMexSfunc.tlc文件保存在对应的路径下即可,不需要做额外的编译操作。

生成代码

        C MEX S-Function模块调整后对应的完整模型如下:

        点击代码生成按钮,可以看到如下过程提示:

        点击打开报告按钮,可以看到如下生成报告:

        点击左侧的sfucdemo.c超链接,可以看到如下生成的代码,其中30行到140行是该模型主要功能的代码,40行到53行是与我们C MEX S-Function模块直接相关的代码。

File: sfucdemo.c
1	/*
2	 * sfucdemo.c
3	 *
4	 * Code generation for model "sfucdemo".
5	 *
6	 * Model version              : 1.45
7	 * Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
8	 * C source code generated on : Sun Sep 10 14:44:22 2023
9	 *
10	 * Target selection: grt.tlc
11	 * Note: GRT includes extra infrastructure and instrumentation for prototyping
12	 * Embedded hardware selection: Intel->x86-64 (Windows64)
13	 * Code generation objectives: Unspecified
14	 * Validation result: Not run
15	 */
16	
17	#include "sfucdemo.h"
18	#include "sfucdemo_private.h"
19	
20	/* Block signals (default storage) */
21	B_sfucdemo_T sfucdemo_B;
22	
23	/* Block states (default storage) */
24	DW_sfucdemo_T sfucdemo_DW;
25	
26	/* Real-time model */
27	static RT_MODEL_sfucdemo_T sfucdemo_M_;
28	RT_MODEL_sfucdemo_T *const sfucdemo_M = &sfucdemo_M_;
29	
30	/* Model step function */
31	void sfucdemo_step(void)
32	{
33	  /* Selector: '<Root>/Selector2' incorporates:
34	   *  Constant: '<Root>/Constant2'
35	   *  UnitDelay: '<S1>/Output'
36	   */
37	  sfucdemo_B.Selector2 =
38	    sfucdemo_ConstP.Constant2_Value[sfucdemo_DW.Output_DSTATE];
39	
40	  /* S-Function (DFT_CMexSfunc): '<Root>/S-Function3' */
41	  if (sfucdemo_B.Memory[0] < 5e3) {
42	    sfucdemo_B.SFunction3_o2[2] = sfucdemo_B.Memory[2] + sfucdemo_B.Selector2*
43	      cos(2*3.14 * 50*sfucdemo_B.Memory[1]);
44	    sfucdemo_B.SFunction3_o2[3] = sfucdemo_B.Memory[3] + sfucdemo_B.Selector2*
45	      sin(2*3.14 * 50*sfucdemo_B.Memory[1]);
46	    sfucdemo_B.SFunction3_o2[1] = sfucdemo_B.Memory[1] + 1/10e3;
47	    sfucdemo_B.SFunction3_o2[0] = sfucdemo_B.Memory[0] + 1;
48	  } else if (sfucdemo_B.Memory[0] == 5e3) {
49	    sfucdemo_B.SFunction3_o1 = sqrt((sfucdemo_B.Memory[2]/L*2)^2 +
50	      (sfucdemo_B.Memory[3]/L*2)^2);
51	    sfucdemo_B.SFunction3_o2[0] = sfucdemo_B.Memory[0] + 1;
52	  } else {
53	  }
54	
55	  /* Selector: '<Root>/Selector3' incorporates:
56	   *  Constant: '<Root>/Constant3'
57	   *  UnitDelay: '<S1>/Output'
58	   */
59	  sfucdemo_B.Selector3 =
60	    sfucdemo_ConstP.Constant3_Value[sfucdemo_DW.Output_DSTATE];
61	
62	  /* S-Function (DFT_CMexSfunc): '<Root>/S-Function4' */
63	  if (sfucdemo_B.Memory1[0] < 5e3) {
64	    sfucdemo_B.SFunction4_o2[2] = sfucdemo_B.Memory1[2] + sfucdemo_B.Selector3*
65	      cos(2*3.14 * 50*sfucdemo_B.Memory1[1]);
66	    sfucdemo_B.SFunction4_o2[3] = sfucdemo_B.Memory1[3] + sfucdemo_B.Selector3*
67	      sin(2*3.14 * 50*sfucdemo_B.Memory1[1]);
68	    sfucdemo_B.SFunction4_o2[1] = sfucdemo_B.Memory1[1] + 1/10e3;
69	    sfucdemo_B.SFunction4_o2[0] = sfucdemo_B.Memory1[0] + 1;
70	  } else if (sfucdemo_B.Memory1[0] == 5e3) {
71	    sfucdemo_B.SFunction4_o1 = sqrt((sfucdemo_B.Memory1[2]/L*2)^2 +
72	      (sfucdemo_B.Memory1[3]/L*2)^2);
73	    sfucdemo_B.SFunction4_o2[0] = sfucdemo_B.Memory1[0] + 1;
74	  } else {
75	  }
76	
77	  /* Switch: '<S3>/FixPt Switch' incorporates:
78	   *  Constant: '<S2>/FixPt Constant'
79	   *  Sum: '<S2>/FixPt Sum1'
80	   *  UnitDelay: '<S1>/Output'
81	   */
82	  if ((uint16_T)(sfucdemo_DW.Output_DSTATE + 1U) > 4999) {
83	    /* Update for UnitDelay: '<S1>/Output' incorporates:
84	     *  Constant: '<S3>/Constant'
85	     */
86	    sfucdemo_DW.Output_DSTATE = 0U;
87	  } else {
88	    /* Update for UnitDelay: '<S1>/Output' */
89	    sfucdemo_DW.Output_DSTATE++;
90	  }
91	
92	  /* End of Switch: '<S3>/FixPt Switch' */
93	
94	  /* Memory: '<Root>/Memory' */
95	  sfucdemo_B.Memory[0] = sfucdemo_DW.Memory_PreviousInput[0];
96	
97	  /* Memory: '<Root>/Memory1' */
98	  sfucdemo_B.Memory1[0] = sfucdemo_DW.Memory1_PreviousInput[0];
99	
100	  /* Update for Memory: '<Root>/Memory' */
101	  sfucdemo_DW.Memory_PreviousInput[0] = sfucdemo_B.SFunction3_o2[0];
102	
103	  /* Update for Memory: '<Root>/Memory1' */
104	  sfucdemo_DW.Memory1_PreviousInput[0] = sfucdemo_B.SFunction4_o2[0];
105	
106	  /* Memory: '<Root>/Memory' */
107	  sfucdemo_B.Memory[1] = sfucdemo_DW.Memory_PreviousInput[1];
108	
109	  /* Memory: '<Root>/Memory1' */
110	  sfucdemo_B.Memory1[1] = sfucdemo_DW.Memory1_PreviousInput[1];
111	
112	  /* Update for Memory: '<Root>/Memory' */
113	  sfucdemo_DW.Memory_PreviousInput[1] = sfucdemo_B.SFunction3_o2[1];
114	
115	  /* Update for Memory: '<Root>/Memory1' */
116	  sfucdemo_DW.Memory1_PreviousInput[1] = sfucdemo_B.SFunction4_o2[1];
117	
118	  /* Memory: '<Root>/Memory' */
119	  sfucdemo_B.Memory[2] = sfucdemo_DW.Memory_PreviousInput[2];
120	
121	  /* Memory: '<Root>/Memory1' */
122	  sfucdemo_B.Memory1[2] = sfucdemo_DW.Memory1_PreviousInput[2];
123	
124	  /* Update for Memory: '<Root>/Memory' */
125	  sfucdemo_DW.Memory_PreviousInput[2] = sfucdemo_B.SFunction3_o2[2];
126	
127	  /* Update for Memory: '<Root>/Memory1' */
128	  sfucdemo_DW.Memory1_PreviousInput[2] = sfucdemo_B.SFunction4_o2[2];
129	
130	  /* Memory: '<Root>/Memory' */
131	  sfucdemo_B.Memory[3] = sfucdemo_DW.Memory_PreviousInput[3];
132	
133	  /* Memory: '<Root>/Memory1' */
134	  sfucdemo_B.Memory1[3] = sfucdemo_DW.Memory1_PreviousInput[3];
135	
136	  /* Update for Memory: '<Root>/Memory' */
137	  sfucdemo_DW.Memory_PreviousInput[3] = sfucdemo_B.SFunction3_o2[3];
138	
139	  /* Update for Memory: '<Root>/Memory1' */
140	  sfucdemo_DW.Memory1_PreviousInput[3] = sfucdemo_B.SFunction4_o2[3];
141	
142	  /* Matfile logging */
143	  rt_UpdateTXYLogVars(sfucdemo_M->rtwLogInfo, (&sfucdemo_M->Timing.taskTime0));
144	
145	  /* signal main to stop simulation */
146	  {                                    /* Sample time: [0.001s, 0.0s] */
147	    if ((rtmGetTFinal(sfucdemo_M)!=-1) &&
148	        !((rtmGetTFinal(sfucdemo_M)-sfucdemo_M->Timing.taskTime0) >
149	          sfucdemo_M->Timing.taskTime0 * (DBL_EPSILON))) {
150	      rtmSetErrorStatus(sfucdemo_M, "Simulation finished");
151	    }
152	  }
153	
154	  /* Update absolute time for base rate */
155	  /* The "clockTick0" counts the number of times the code of this task has
156	   * been executed. The absolute time is the multiplication of "clockTick0"
157	   * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
158	   * overflow during the application lifespan selected.
159	   * Timer of this task consists of two 32 bit unsigned integers.
160	   * The two integers represent the low bits Timing.clockTick0 and the high bits
161	   * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
162	   */
163	  if (!(++sfucdemo_M->Timing.clockTick0)) {
164	    ++sfucdemo_M->Timing.clockTickH0;
165	  }
166	
167	  sfucdemo_M->Timing.taskTime0 = sfucdemo_M->Timing.clockTick0 *
168	    sfucdemo_M->Timing.stepSize0 + sfucdemo_M->Timing.clockTickH0 *
169	    sfucdemo_M->Timing.stepSize0 * 4294967296.0;
170	}
171	
172	/* Model initialize function */
173	void sfucdemo_initialize(void)
174	{
175	  /* Registration code */
176	
177	  /* initialize non-finites */
178	  rt_InitInfAndNaN(sizeof(real_T));
179	
180	  /* initialize real-time model */
181	  (void) memset((void *)sfucdemo_M, 0,
182	                sizeof(RT_MODEL_sfucdemo_T));
183	  rtmSetTFinal(sfucdemo_M, 10.0);
184	  sfucdemo_M->Timing.stepSize0 = 0.001;
185	
186	  /* Setup for data logging */
187	  {
188	    static RTWLogInfo rt_DataLoggingInfo;
189	    rt_DataLoggingInfo.loggingInterval = NULL;
190	    sfucdemo_M->rtwLogInfo = &rt_DataLoggingInfo;
191	  }
192	
193	  /* Setup for data logging */
194	  {
195	    rtliSetLogXSignalInfo(sfucdemo_M->rtwLogInfo, (NULL));
196	    rtliSetLogXSignalPtrs(sfucdemo_M->rtwLogInfo, (NULL));
197	    rtliSetLogT(sfucdemo_M->rtwLogInfo, "tout");
198	    rtliSetLogX(sfucdemo_M->rtwLogInfo, "");
199	    rtliSetLogXFinal(sfucdemo_M->rtwLogInfo, "");
200	    rtliSetLogVarNameModifier(sfucdemo_M->rtwLogInfo, "rt_");
201	    rtliSetLogFormat(sfucdemo_M->rtwLogInfo, 0);
202	    rtliSetLogMaxRows(sfucdemo_M->rtwLogInfo, 0);
203	    rtliSetLogDecimation(sfucdemo_M->rtwLogInfo, 1);
204	    rtliSetLogY(sfucdemo_M->rtwLogInfo, "");
205	    rtliSetLogYSignalInfo(sfucdemo_M->rtwLogInfo, (NULL));
206	    rtliSetLogYSignalPtrs(sfucdemo_M->rtwLogInfo, (NULL));
207	  }
208	
209	  /* block I/O */
210	  (void) memset(((void *) &sfucdemo_B), 0,
211	                sizeof(B_sfucdemo_T));
212	
213	  /* states (dwork) */
214	  (void) memset((void *)&sfucdemo_DW, 0,
215	                sizeof(DW_sfucdemo_T));
216	
217	  /* Matfile logging */
218	  rt_StartDataLoggingWithStartTime(sfucdemo_M->rtwLogInfo, 0.0, rtmGetTFinal
219	    (sfucdemo_M), sfucdemo_M->Timing.stepSize0, (&rtmGetErrorStatus(sfucdemo_M)));
220	
221	  /* InitializeConditions for UnitDelay: '<S1>/Output' */
222	  sfucdemo_DW.Output_DSTATE = 0U;
223	
224	  /* InitializeConditions for Memory: '<Root>/Memory' */
225	  sfucdemo_DW.Memory_PreviousInput[0] = 0.0;
226	
227	  /* InitializeConditions for Memory: '<Root>/Memory1' */
228	  sfucdemo_DW.Memory1_PreviousInput[0] = 0.0;
229	
230	  /* InitializeConditions for Memory: '<Root>/Memory' */
231	  sfucdemo_DW.Memory_PreviousInput[1] = 0.0;
232	
233	  /* InitializeConditions for Memory: '<Root>/Memory1' */
234	  sfucdemo_DW.Memory1_PreviousInput[1] = 0.0;
235	
236	  /* InitializeConditions for Memory: '<Root>/Memory' */
237	  sfucdemo_DW.Memory_PreviousInput[2] = 0.0;
238	
239	  /* InitializeConditions for Memory: '<Root>/Memory1' */
240	  sfucdemo_DW.Memory1_PreviousInput[2] = 0.0;
241	
242	  /* InitializeConditions for Memory: '<Root>/Memory' */
243	  sfucdemo_DW.Memory_PreviousInput[3] = 0.0;
244	
245	  /* InitializeConditions for Memory: '<Root>/Memory1' */
246	  sfucdemo_DW.Memory1_PreviousInput[3] = 0.0;
247	}
248	
249	/* Model terminate function */
250	void sfucdemo_terminate(void)
251	{
252	  /* (no terminate code required) */
253	}
254	

        人工检查上述自动生成的C代码,可以实现该Simulink模型设计的功能。

        至此,可以证明该TLC文件可以较好地生成C MEX S-Fuction模块的自动代码。

Tips

        TLC的特殊性在于,它本身是一种编程语言,具有文本类编程语言的大部分特点,同时它要实现的功能又是控制C或C++另一种文本语言代码的生成,所以TLC的开发必须熟练掌握它特有的语法结构,常见的一些基础语法如下。

        1、%,TLC指令开始的标志符。

        2、%implements,一个模块的TLC文件要执行的第一条指令,不可省略。

        3、%function,声明一个函数,要配合%endfunction使用。

        4、%assign,创建变量。

        5、函数LibBlockInputSignal(portIdx, "","",sigIdx),返回模块的输入信号,portIdx和sigIdx都从0开始计数。

        6、函数LibBlockOutputSignal(portIdx, "","",sigIdx),返回模块的输出信号。

        7、函数LibBlockParameterValue(param, elIdx),返回模块的参数值。

        8、<>,TLC表达式的开始和结束。

        9、%%和/%   %/,注释。

分析和应用

        本文上述内容中看到,TLC实现了C MEX S-Fuction模块的代码生成,但是进一步仔细研究发现,Library中自带的模块的代码生成也是由TLC实现的,甚至生成代码的总体结构也是由TLC实现的,这些模块的TLC文件就存放在Matlab的系统路径ProgramFiles\Matlab2020b\rtw\c\tlc下。

        所以说Simulink的自动代码生成过程,并不是完全固定死的,当我们有特定需求时,可以通过调整TLC文件的内容来实现的。这样就给了代码开发工程师们在代码生成方面的灵活度和自由度,为Simulink的自动代码生成提供了无限可能。

总结

        以上就是本人在使用TLC时,一些个人理解和分析的总结,首先介绍了TLC的背景知识,然后展示它的使用方法,最后分析了该模块的特点和适用场景。

        后续还会分享另外几个最近总结的Simulink Toolbox库模块,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。


        版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

相关文章:

开箱报告,Simulink Toolbox库模块使用指南(六)——S-Fuction模块(TLC)

文章目录 前言 Target Language Compiler&#xff08;TLC&#xff09; C MEX S-Function模块 编写TLC文件 生成代码 Tips 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;一&#xff09;——powergui模块》 见《开箱报告&am…...

Kafka详解

目录 一、消息系统 1、点对点的消息系统 2、发布-订阅消息系统 二、Apache Kafka 简介 三、Apache Kafka基本原理 3.1 分布式和分区&#xff08;distributed、partitioned&#xff09; 3.2 副本&#xff08;replicated &#xff09; 3.3 整体数据流程 3.4 消息传送机制…...

rabbitmq+springboot实现幂等性操作

文章目录 1.场景描述 1.1 场景11.2 场景2 2.原理3.实战开发 3.1 建表3.2 集成mybatis-plus3.3 集成RabbitMq 3.3.1 安装mq3.3.2 springBoot集成mq 3.4 具体实现 3.4.1 mq配置类3.4.2 生产者3.4.3 消费者 1.场景描述 消息中间件是分布式系统常用的组件&#xff0c;无论是异…...

ubuntu server 更改时区:上海

1. 打开终端&#xff0c;在命令行中以超级用户或具有sudo权限的用户身份运行以下命令&#xff1a; sudo dpkg-reconfigure tzdata 这会打开一个对话框&#xff0c;用于选择系统的时区设置。 2. 在对话框中&#xff0c;使用上下箭头键在地区列表中选择"Asia"&#x…...

java 整合 swagger-ui 步骤

1.在xml 中添加Swagger 相关依赖 <!-- springfox-swagger2 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!-- springfox-swa…...

介绍两款生成神经网络架构示意图的工具:NN-SVG和PlotNeuralNet

对于神经网络架构的可视化是很有意义的&#xff0c;可以在很大程度上帮助到我们清晰直观地了解到整个架构&#xff0c;我们在前面的 PyTorch的ONNX结合MNIST手写数字数据集的应用(.pth和.onnx的转换与onnx运行时) 有介绍&#xff0c;可以将模型架构文件(常见的格式都可以)在线上…...

iOS IdiotAVplayer实现视频分片缓存

文章目录 IdiotAVplayer 实现视频切片缓存一 iOS视频边下边播原理一 分片下载的实现1 分片下载的思路2 IdiotAVplayer 实现架构 三 IdiotAVplayer 代码解析IdiotPlayerIdiotResourceLoaderIdiotDownLoader IdiotAVplayer 实现视频切片缓存 一 iOS视频边下边播原理 初始化AVUR…...

SpringBootWeb请求-响应

HTTP请求 前后端分离 在这种模式下&#xff0c;前端技术人员基于"接口文档"&#xff0c;开发前端程序&#xff1b;后端技术人员也基于"接口文档"&#xff0c;开发后端程序。 由于前后端分离&#xff0c;对我们后端技术人员来讲&#xff0c;在开发过程中&a…...

List集合详解

目录 1、集合是什么&#xff1f; 1.1、集合与集合之间的关系 2、List集合的特点 3、遍历集合的三种方式 3.1、foreach(增强佛如循环遍历) 3.2、for循环遍历 3.3、迭代器遍历 4、LinkedList和ArrayList的区别 4.1、为什么ArrayList查询会快一些&#xff1f; 4.2、为什么LinkedLi…...

投稿指南【NO.12_8】【极易投中】核心期刊投稿(组合机床与自动化加工技术)

近期有不少同学咨询投稿期刊的问题&#xff0c;大部分院校的研究生都有发学术论文的要求&#xff0c;少部分要求高的甚至需要SCI或者多篇核心期刊论文才可以毕业&#xff0c;但是核心期刊要求论文质量高且审稿周期长&#xff0c;所以本博客梳理一些计算机特别是人工智能相关的期…...

解决git无法上传大文件(50MB)

解决方法 使用LFS解决GitHub无法上传大于50MB的文件 LFS简介 Git LFS&#xff08;Large File Storage&#xff09;是 Git 的一个扩展&#xff0c;用于管理大型文件&#xff0c;如二进制文件、图像、音频和视频文件等。它的主要目的是解决 Git 对大型二进制文件的版本控制和存…...

用递归实现字符串逆序(不使用库函数)

文章目录 前言一、题目要求二、解题步骤1.大概框架2.如何反向排列&#xff1f;3.模拟实现strlen4.实现反向排列5.递归实现反向排列 总结 前言 嗨&#xff0c;亲爱的读者们&#xff01;我是艾老虎尤&#xff0c;今天&#xff0c;我们将探索一个题目&#xff0c;这个题目对新手非…...

初学python(一)

一、python的背景和前景 二、 python的一些小事项 1、在Java、C中&#xff0c;2 / 3 0&#xff0c;也就是整数 / 整数 整数&#xff0c;会把小数部分舍掉。而在python中2 / 3 0.66666.... 不会舍掉小数部分。 在编程语言中&#xff0c;浮点数遵循IEEE754标准&#xff0c;不…...

Excel VSTO开发8 -相关控件

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 8 相关控件 在VSTO开发中&#xff0c;Ribbon&#xff08;或称为Ribbon UI&#xff09;是指Office应用程序中的那个位于顶部的带有选…...

华为数据管理——《华为数据之道》

数据分析与开发 元数据是描述数据的数据&#xff0c;用于打破业务和IT之间的语言障碍&#xff0c;帮助业务更好地理解数据。 元数据是数据中台的重要的基础设施&#xff0c;元数据治理贯彻数据产生、加工、消费的全过程&#xff0c;沉淀了数据资产&#xff0c;搭建了技术和业务…...

Flink CDC 菜鸟教程 -环境篇

本教程将介绍如何使用 Flink CDC 来实现这个需求, 在 Flink SQL CLI 中进行,只涉及 SQL,无需一行 Java/Scala 代码,也无需安装 IDE。 系统的整体架构如下图所示: 环境篇 1、 准备一台Linux 2、准备教程所需要的组件 下载 flink-1.13.2 并将其解压至目录 flink-1.13.2 …...

【线上问题】linux部署docker应用docker-compose启动报端口占用问题(感觉上没有被占用)

目录 一、问题说明二、排查过程 一、问题说明 1.linux服务器使用的不是root用户权限 2.docker应用服务没有关闭的情况下&#xff0c;做了些重装docker&#xff0c;重启docker等操作 3.docker-compose up -d然后docker logs查看日志报端口被占用 4.netstat -ntpl | grep 端口 也…...

解决虚拟机克隆后IP和命名冲突问题

目录 解决IP冲突问题 解决命名冲突 解决IP冲突问题 克隆后的虚拟机和硬件地址和ip和我们原虚拟机的相同&#xff0c;我们需要重新生成硬件地址和定义ip&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;进入 /etc/sysconfig/network-scripts/ifcfg-ens33 配置文件…...

分享一个python基于数据可视化的智慧社区服务平台源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1…...

[密码学入门]凯撒密码

单表代换 单表&#xff1a;英文26字母的顺序 代换&#xff1a;替换为别的字母并保证解密的唯一性 假如我们让加密方式为所有字母顺序移动3位 import stringstring.ascii_lowercase abcdefghijklmnopqrstuvwxyz b3 加密算法y(xb)mod26 解密算法为x(y-b)mod26 密钥空间26 …...

博客之QQ登录功能(一)

流程图 上图spring social 封装了1-8步需要的工作 1、新建包和书写配置文件 public class QQProperties {//App唯一标 识private String appId "100550231";private String appSecret "69b6ab57b22f3c2fe6a6149274e3295e";//QQ供应商private String…...

Redis多机数据库实现

Redis多机数据库实现 为《Redis设计与实现》笔记 复制 客户端可以使用SLAVEOF命令将指定服务器设置为该服务器的主服务器 127.0.0.1:12345> SLAVEOF 127.0.0.1 6379127.0.0.1:6379将被设置为127.0.0.1:123456的主服务器 旧版复制功能的实现 Redis的复制功能分为同步&a…...

Leangoo领歌 -敏捷任务管理软件,任务管理更轻松更透明

​任务管理&#xff0c;简单易懂&#xff0c;就是对任务进行管理。那怎么可以更好进行任务管理呢&#xff1f;怎么样样可以让任务进度可视化&#xff0c;一目了然呢&#xff1f;有效的管理可以让我们事半功倍。 接下来我们看一下如何借助任务管理软件高效的做任务管理。 首先…...

go的iris框架进行本地资源映射到服务端

我这里使用的是HandleDirapi,有其他的请补充 package mainimport ("github.com/kataras/iris/v12" )type Hello struct{Status int json:"status"Message string json:"message" }func main(){app : iris.New()//第一个api:相当于首页app.Get(&q…...

代码随想录day46|139. 单词拆分

139. 单词拆分 class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:dp [False]*(len(s)1)dp[0]Truefor i in range(len(s)1):for j in wordDict:if i>len(j) and (s[i-len(j):i] in wordDict) and dp[i-len(j)]:dp[i] Truereturn dp[len(s)]多…...

MATLAB实现函数拟合

目录 一.理论知识 1.拟合与插值的区别 2.几何意义 3.误差分析 二.操作实现 1.数据准备 2.使用cftool——拟合工具箱 三.函数拟合典例 四.代码扩展 一.理论知识 1.拟合与插值的区别 通俗的说&#xff0c;插值的本质是根据现有离散点的信息创建出更多的离散点&#xf…...

vue优化首屏加载时间优化-cdn引入第三方包

前言 为什么要进行首屏加载优化&#xff0c;因为随着我们静态资源和第三方包和代码增加&#xff0c;压缩之后包会越来越大 随着网络的影响&#xff0c;在我们第一输入url请求资源时候&#xff0c;网络阻塞&#xff0c;加载时间长&#xff0c;用户体验不好 仔细观察后就会发现…...

lv4 嵌入式开发-3 标准IO的读写

目录 1 标准I/O – 读写流 2 标准I/O – 按字符输入 3 标准I/O – 按字符输出 4 标准I/O – 思考和练习 5 标准I/O – 按行输入 6 标准I/O – 按行输出 7 标准I/O – 思考和练习 1 标准I/O – 读写流 流支持不同的读写方式: 读写一个字符&#xff1a;fgetc()/fputc()一…...

iOS UIDevice设备信息

识别设备和操作系统 //获得共享设备实例 open class var current: UIDevice { get }//识别设备的名称 open var name: String { get } // e.g. "My iPhone"//设备类型 open var model: String { get } // e.g. "iPhone", "iPod touch"//本地化设…...

SLAM ORB-SLAM2(2)编译安装

SLAM ORB-SLAM2(2)编译安装 1. 软件包依赖安装2. 依赖安装2.1. Eigen2.2. Pangolin2.3. OpenCV3. ORB-SLAM23.1. 源码下载3.2. 文件修改3.3. 扩大交换空间3.4. 编译1. 软件包依赖安装 以一个纯净的ubuntu20.04桌面版为例 1.首先设置软件源为清华源 2.安装必要依赖 sudo ap…...

网站建设免费视频教程/百度快照推广排名

河南农业大学C语言第1章.ppt第1章 C语言基础知识 1&#xff0e;1 C语言概述 1&#xff0e;2 简单C程序与上机步骤 1&#xff0e;3 数据类型 1&#xff0e;4 常量与变量 1&#xff0e;5 运算符和表达式 1.1 C语言概述 1.1.1 C语言的发展 1.1.2 C语言的特点 1.1.3 C程序的执行 1.…...

品牌网站建设完善大蝌蚪/微博推广费用一般多少

在前面文章《矩阵的四个基本子空间》中提到&#xff1a; 一个秩为r&#xff0c;m*n的矩阵A中&#xff0c;其行空间和列空间的维数为r&#xff0c;零空间和左零空间的维数分别为n-r&#xff0c;m-r&#xff0c;并且有行空间与零空间正交&#xff0c;列空间与左零空间正交。“掌握…...

出版社网站建设/seo对各类网站的作用

总部位于纽约的“世界经济论坛”12日发布的《2010&#xff0d;2011全球信息技术(IT)报告》指出&#xff0c; 调查显示&#xff0c;就网民每日或每周在互联网上发言频度而言&#xff0c;中国网民在全球是最勤奋的。报告称&#xff0c;在回答是否每日或每周都会在互联网上发言的问…...

ngrok做网站服务器/win10最强优化软件

我在Saas平台封装了调度组件&#xff0c;基于quartz框架&#xff0c;mongobd做持久化&#xff0c;用来做延时提醒、每日定时计算授权数、延时删除关联数据等。有组员使用时有误&#xff0c;这里记录一下 问题&#xff1a;测试环境服务重启&#xff0c;删除某个调度任务失败&am…...

代运营网站/新网站秒收录技术

不知道别人的习惯是如何的,就我个人来说,写程序一般不是有性能问题,很少主动去使用多线程程序。除了主动去优化的场景&#xff0c;直观地认为多线程还是比较麻烦&#xff0c;可能涉及到同步问题&#xff0c;而且一个线程挂了&#xff0c;连累整个进程挂掉。除了可能快点外&…...

seo如何提高网站排名/营销效果分析怎么写

购买产品链接请点击“阅读原文”https://yao.jk.cn/index.html#/yao-item/263856/0?channelCodeduojin&promoCodeMERCENARY5279360301...