既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
元胞
元胞数组是对常规的数值数组的扩展, 其每一个元素称为一个元胞(cell), 每一个元胞中可以存储任意类型、任意尺寸的数据。与数值数组一样, 元胞数组维数不受限制, 可以是一维、 二维或更高维。元胞数组对元胞的索引方法也分单下标和全下标两种。对于元胞数组,元胞和元胞里的内容是两个不同范畴(或者说不同层次)的概念。
如果把元胞数组比着一个柜子,那么,元胞就是柜子上的抽屉,元胞里的内容则是抽屉里存放的东西。
1.元胞的创建
A(2,3) //寻访元胞(cell indexing)
A{2, 3} //寻访元胞中的内容(context addressing)
A(1)={[1 2 3]}; A(2)={'second cell'} //直接赋值法
cell(m,n) //创建m x n的元胞数组,每个元胞内容为空数组,n - n x n
2.一些函数
deal //将输入变量对应赋值给输出变量
cell //创建指定大小的元胞数组
celldisp //逐个显示元胞单元的数据
cellplot //用图形方式显示元胞数组的结构
num2cell //把数值数组转化为元胞数组
cell2struct //把元胞数组转换为结构体
iscell //测试某个对象是否为元胞数组
使用示例:
a=reshape(1:9, 3, 3);
b=sym('sin(3\*x)\*exp(-x)');
c='string';
d=10;
A=cell(2);
A(1,1)={a};
A{1,2}=b;
A{2,1}=c;
A(2,2)={d};
cellplot(A,'legend');
A_A=[A cell(2)]; %元胞数组扩展
A\_A(:,4)=[]; %删除第四列,成为2x3的元胞数组
结果:
结构体
结构体就不用赘述了,其他编程语言中经常用到。
student=struct('name','张三','age','matrix',[1 2]); //构造单个结构体
student=struct('name',{'张三','Tom'},'age',{20,19}, …
'matrix', {[1 2],[1 3;4 6]}) //构造结构体数组
//对于结构体数组,可以通过括号、下标索引来访问其内部数据,结构体与字段之间用点(.)连接。
student(1)
student(1).name
s='name';
student(1).(s)
//结构体的字段中也能存储结构体类型的数据,eg.
A=struct('location', 'Wuhan', 'time',…
struct('hour', '2', 'minute', 30, 'second',0))
6.绘图
这块内容请移驾:https://blog.csdn.net/Gou_Hailong/article/details/107619919
7.m文件
M文件是包含 MATLAB 代码的文件。 M文件按其内容和功能可分为脚本M文件和函数M文件这两大类。
脚本M文件是许多 MATLAB 代码按顺序组成的命令集合,不接受参数的输入和输出,与MATLAB工作区共享变量空间。脚本文件
一般用来实现一个相对独立的功能,比如对某个数据集进行某种分析、绘图,求解方程等等。
MATLAB的M-函数是由function语句引导的,其基本格式如下:
function [输出形参列表] = 函数名 (输入形参列表)
注释说明语句段,由%引导;
函数体语句
函数文件需要在 M-文件编辑器中编写。写完以后,按照当前的搜索路径保存。以后就可以随时调用这个函数了。好像函数名要和文件名一致。
- 一个 M 文件可以包含一个以上的函数
• 一个主函数( Primary Function)
• 其它则为子函数( Subfunctions)
• 子函数只能被同文件中的函数(主函数或子函数)调用,但不可被不同文件的其它函数调用 - 主函数与子函数的位置
• 主函数必需出现在最上方
• 其后接上任意数目的子函数
• 子函数的次序并无任何限制
8.Matlab控制流
- 顺序结构:按照程序中语句的排列顺序依次执行,直到程序最后一个语句
- 选择结构:根据给定的条件成立与否,分别执行不同的语句
- 循环结构:按照给定的条件,重复执行指定的语句
8.1 顺序结构
很简单,直接跳过。
8.2 选择结构
- if-else- end分支结构
- switch- case- end 结构
- try- catch- end结构
//选择结构-多分支
if expression1
commands1
elseif expression2
commands2
else
commands3
end
//switch根据表达式的取值不同,分别执行不同的语句
switch ex
case test1
Commands 1
case test2
Commands 2
case testk
Commands k
otherwise
Commands
end
//try是一种试探性执行语句
try
commands1
catch
command s2
end
eg:
//1.if
clear
n=input('输入n= )
if n>=90
chji='优秀’
elseif n>=80
chji='良好'
elseif n>=70
chji='中等’
elseif n>=60
chji='及格’
else
chji='不及格’
end
//2.switch
for month= 1:12
switch month
case {3,4,5}
season = 'Spring';
case {6,7,8}
season = 'Summer';
case {9,10,11}
season = "Autumn';
case {12,1.2}
season = Winter';
end
fprintf('Month %d ===> %s \n', month,season);
end
//3.try
a=[1 2 3 4];
i=5;
try
X = a(i);
catch
X = a(end);
end
lasterr
8.3 循环结构
- while - end循环结构
- for - end循环结构
//1.while - end
while expression
commands
end
//2.for
for x = array
commands(循环体)
end
eg
//1.while
sum_j= 0;
i=1;
while i <=10; .
sum\_ i= sum_ i +i;
i= i+1;
end;
//2.for
sum i = 0;
for i= 1:10;
sum_i=sum_i+i;
end
注意:
- (1)for循环不能用for循环内重新赋值循环变量n来终止,只能使用break语句。
- (2)在for循环内接受任何有效的MATLAB数组。
- (3)for循环可按需要嵌套。与其它的编程语言类似,for语句可以嵌套使用。
- (4)当有一个等效的数组方法来解给定的问题时,应避免用For循环。
- (5)为了提高处理的速度,在for循环(while循环)被执行之前,应预先分配数组。
说明:
- ① for循环与while循环的区别是,for语句的循环次数是确定的,而while语句的循环次数是不确定的。
- ② 一定要注意在循环结构体内设置“修改条件表达式的语句”,以免进入“死循环”
- ③ 一旦出现死循环,在命令窗用ctrl+C可使程序中止。
- ④ 注意程序的可读性。
其他命令:
命令 | 描述 |
---|---|
return | ●用于函数中,函数将在此处跳出,并返回该语句指定的值 ●用于 keyboard 状态下返回被 keyboard 中断的指令处继续向后执行程序 |
input | ●用于程序执行过程中要求用户想程序中输入数据 |
keyboard | ●这个命令在调试程序时非常有用,当执行到此命令, matlab将中断正在执行的程序,进入’用户控制状态’,可以在command window 中执行用户操作 |
pause | ● 程序执行途中暂停 |
break | ●直接跳出该层循环 |
continue | ●直接进入该层循环的下一-次迭代 |
error, warning,lasterr, lastwarn | … |
9.变量和函数
9.1 局部变量与全局变量
局部变量(Local Variables)
- 每一个函数在运算时,均占用个别的内存
- 此工作空间和MATLAB的基本工作空间或是其它函数的工作空间是互相独立的
- 不同空间的变量是完全独立,不会相互影响
- 不同工作空间的变量,称为「局部变量」 ( LocalVariables )
全局变量(Global Variables)
- 减少变数的传递,可用「全局变量」(Global Variables)
- 使用全局变量前,需先进行变量定义
function func
global X %全局变量定义
X=2
X=X+2;
fprintf('The value of X in "func" is %g.\n', X);
全局变量使用规则:
- 尽量少用全局变量:全局变量使程序的流程不透明,造成程序除错或维护的困难.
- 使用全局变量,请遵循下列两原则:使用前一定要定义;
使用全部大写或较长的变量名称,以资区别 - 检查工作空间的变量,输入whos global
- 清除所有工作空间的全局变量X,需使用 clear global X
9.2 函数文件
函数文件也是M文件的一种。可接受输入变量,并将结果送至输出变量;运算过程产生的变量都存放在函数本身的工作空间;不会和MATLAB基本工作空间的变量相互覆盖;函数适用于大型程序代码;使程序代码模块化( Modularized )并易于维护与改进。
//函数文件由function语句引导,其格式为:
function 输出形参表 = 函数名(输入形参表)
注释说明部分
函数体
end
/\*注:其中函数名的命名规则与变量名相同。输
入形参为函数的输入参数,输出形参为函数的
输出参数。当输出形参多于1个时,则应该用
方括号括起来。\*/
命名限制
- 函数名称和变量名称有相同的限制:只接受前31个字母( MATLAB 5.x)或前63个字母( MATLAB 6.x和7.x );以英文字母作为开头。
- 函数名称和文件名称不同:仍可依文件名称调用文件;函数名称将被忽略。建议函数名与文件名同名。
函数调用
//函数调用的一般格式是:
[输出实参表]=函数名(输入实参表)
调用以上函数,可输入:
>> vec= [15 3];
>> ave = func1(vec)
ave =
3
函数嵌套调用(递归调用)
eg:
//利用函数的递归调用,求n!
function f=factor(n)
if n<=1
f=1;
else
f=factor(n- 1)\*n;
end
return f;%返回
end
9.3 子函数
一个M文件可以包含一个以上的函数
- 一个主函数( Primary Function )
- 其它则为子函数( Subfunctions )
- 子函数只能被同文件中的函数(主函数或子函数)调用,但不可被不同文件的其它函数调用
主函数与子函数的位置
- 主函数必需出现在最上方
- 其后接上任意数目的子函数
- 子函数的次序并无任何限制
eg
//func5.m包含一个主函数及一个子函数
//子函数的功能是计算倒数向量
function out = func5(x)
recip = reciproc(x);
out = sum(recip);
% Definition for subfunctions
function output = reciproc(input)
output = 1./input;
调用此函数
>> func5([12 3])
ans =
1. 8333 ( 0.4167)
9.4 输入、输出变量
输入、输出变量是函数与主程序之间数据传递的载体。
function varargout = func(varargin)
/\*varargout 是输出变量-输出参数
func 是函数名
varargin 是输入变量-输入参数\*/
nargin //榆入变量个数,用于函数体内
nargout //榆入变量个数,用于函数体内
nargin('func') //荻取函数func所需的输入变量个数
nargout(' 'func') //获取函数func所 需的输出变量个数
varargin //可变长的输入变量列表(元胞数组)
varargout //可变长的输出变量列表(元胞数组)
nargin、nargout 决定函数实际输入输出变量的个数。与程序流控制指令配合,针对不同输入输出变量个数完成不同的任务。不能对nargin、nargout赋值。
eg
function [ave1, ave2] = func4(vector1, vector2)
if nargin == 1, %只有一个输入变量
ave1= sum(vector1)/length(vector1);
end
if nargin == 2, %有两个输出变数
ave1 = sum(vector1)/length(vector1);
ave2 = sum(vector2)/length(vector2);
end
可变长输入参数
function ave = func4(varargin) %计算向量的平均值
if nargin >0
for i= 1:nargin
ave(i)=mean(varargin{});
end
else
ave= NaN;
disp '没有输入参数'
end
function varargout = func4(varargin)%计算向量的平均值、标准偏差
if nargin < 1
disp '没有输入参数'
return
end
for i = 1:nargin
varargout{1}(i)=mean(varargin{i});
if nargout==2
varargout{2}(i)= std(varargin{i});
end
end
//函数调用:
a=[1 2 3];b=[4 5 6 7 8];
[ave, stdv]=func4(a,b);
[ave,stdv]=func4(a)
ave=func4(a);
ave=func4(a,b);
调试指令与图标:
Part.III 杂记 / 临时笔记
Chap.I 把一个字符串当作一个指令运行
这个真的超级 np!!(get于2020.10.30)
s1='aa';
eval([s1,'=3;']);
没错,就是如此简单,上述代码的运行结果就是在工作空间多了俩变量,一个变量叫s1='aa'
,另一个变量叫aa=3
。注意使用eval
时,传入变量的字符串最后一位一定要是;
,不是也没关系,就是会输出运算结果。
Chap.X 杂记
// 判断一个矩阵是否所有元素都是nan
all(isnan(tmp))
// 分割字符串,分割之后是元胞,并去掉首尾空格(空元胞)
tmp = strsplit(strtrim(lin),{' '});
// 类似于C语言的格式化输出
fprintf('我是%s\n',name);
// 将数值转换为字符串且保留小数点后四位
num2str(roundn(mupd,-4));
// 统计时间
头:tic;尾:toc
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
记
// 判断一个矩阵是否所有元素都是nan
all(isnan(tmp))
// 分割字符串,分割之后是元胞,并去掉首尾空格(空元胞)
tmp = strsplit(strtrim(lin),{' '});
// 类似于C语言的格式化输出
fprintf('我是%s\n',name);
// 将数值转换为字符串且保留小数点后四位
num2str(roundn(mupd,-4));
// 统计时间
头:tic;尾:toc
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
[外链图片转存中…(img-6UUJWMmf-1715640564252)]
[外链图片转存中…(img-0KRfyU5t-1715640564254)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!