1小时Matlab速成笔记(前30min)
改编自:glanny https://www.bilibili.com/read/cv7966685 原出处:1小时Matlab速成教程
本文没有对原文进行删改,调整了部分排版,补充了课上的一些口头笔记。
md源文件
链接:https://pan.baidu.com/s/1YrDjPs3XoEzULR2N9un4Nw?pwd=ln2a
提取码:ln2a
ps: 每一句代码后面的分号的作用是阻断输出,可适当去掉
Matlab 基础(前30min)
第1部分:变量定义和基本运算
矩阵
生成矩阵
①直接法
a = [1,2,3;4,5,6;7,8,9];
②冒号法
冒号一维矩阵 a = 开始:步长:结束,步长为1可省略
b = 1:1:10; % 1,2,...10
b = 1:10; %与上一个等价
③函数生成(常用)
普通矩阵
linspace(开始,结束,元素个数); 等差生成指定元素数的一维矩阵,省略个数则生成100个
c = linspace(0,10,5);
特殊矩阵
e = eye(4); %eye(维数)单位阵
![image-20220117210056801](https://s2.loli.net/2022/01/17/1HbrjsN6z7hKcim.png)
z = zeros(1,4); % zeros(维数)全零阵
o = ones(4,1); % ones(维数)全1阵
r = rand(4); % rand(维数)0~1分布随机阵
rn = randn(4); % randn(维数)0均值Gaussian分布随机阵
矩阵运算
diag(行向量,主对角线上方第k条斜线)
用行向量生成对角阵
diag_a = diag(a,1);
tril(矩阵,主对角线上方第k条斜线)
生成矩阵的下三角阵,triu上三角阵(最后面的\(l,u\)代表了\(low,up\))
tril_a = tril(a,1);
加、减、乘、乘方
a + b; a - b; a * b; a ^ n;
点运算(对应元素的*,/,,^运算)
a.*b , a./b , a.\b , a.^b,a.*a
逆矩阵
pinv(a)
伪逆矩阵,当a不是方阵,求广义逆矩阵;当a是可逆方阵,结果与逆矩阵相同
特征值,特征向量
[v,D] = eig(a);
输出v为特征向量,D为特征值对角阵
行列式
det(a)
秩
rank(a)
伴随
compan(b)
矩阵的修改
部分替换
chg_a = a
chg_a(2,3) = 4 %(行,列)元素替换
chg_a(1,:) = [2,2,2] %(行,:)替换行,为[]删除该行
chg_a(:,1) = [] %(:,列)替换列,为[]删除该列
转置
T_a = a';
指定维数拼接
c1_a = cat(1,a,a);
垂直拼接
c2_a = cat(2,a,a);
水平拼接
变维
rs_a = reshape(a,1,9);
元素个数不变,矩阵变为m*n
矩阵信息获取
矩阵的行列数
[row_a, col_a] = size(a);
[行数,列数]
行列中最大的
len_a = length(a);
多维数组(的创建)
直接法
mul_1(:,:,1) = [1,2,3;2,3,4];
mul_1(:,:,2) = [3,4,5;4,5,6];
*扩展法
mul_2 = [1,2,3;2,3,4];
mul_2(:,:,2) = [3,4,5;4,5,6];
若不赋值第一页,第一页全为0
cat法 (常用)
mul_31 = [1,2,3;2,3,4];
mul_32 = [3,4,5;4,5,6];
mul_3 = cat(3,mul_31,mul_32); %把a1a2按照“3”维连接
*字符串
创建
str0 = 'hello world'; %单引号引起
str1 = 'I''m a student'; %字符串中单引号写两遍
str3 = ['I''m' 'a' 'student']; %方括号链接多字符串
str4 = strcat(str0, str1); %strcat连接字符串函数
str5 = strvcat(str0, str1); %strvcat连接产生多行字符串
str6 = double(str0); %取str0的ASCII值,也可用abs函数
str7 = char(str6); %把ASCII转为字符串
操作
比较
strcmp(str0, str1); %相等为1,不等为0
strncmp(str0, str1, 3); %比较前3个是否相等(n)
strcmpi(str0, str1); %忽略大小写比较(i)
strncmpi(str0, str1, 3); %忽略大小写比较前3个是否相等
查找替换
strfind(str0, str1); %在str0找到str1的位置
strmatch(str1, str0); %在str0字符串数组中找到str1开头的行数
strtok(str0); %截取str0第一个分隔符(空格,tab,回车)前的部分
strrep(str0, str1, str2); %在str0中用str2替换str1
其他
upper(str0); %转大写,lower转小写
strjust(str0, 'right'); %将str0右对齐,left左对齐,center中间对齐
strtrim(str0); %删除str0开头结尾空格
eval(str0); %将str0作为代码执行
转换
___2___ -->
如num2str
,将数字转字符串;
str_b = num2str(b);
dec2hex
,将十进制转十六进制
abs,double
取ASCII码;char把ASCII转字符串
abs_str = abs('aAaA');
第2部分:程序结构
选择结构
if-elseif-else-end
if a>0
disp(x);
elseif a==0
disp(a);
else
disp(a-1);
end
三点值得注意:
- 没有大括号,小括号
- ifelse之间没有空格
- 结尾是end
switch-case-otherwise-end
switch a
case 0
disp(a);
case 1
disp(a+1);
otherwise
disp('aaa');
end
try - catch (matlab独有)
try
z = x*y;
catch
z = x.*y; %若try出错,则执行此行
end
disp(z);
循环结构
for 循环变量=初值:步长:终值 - end
for i=0:1:10 步长为负,则初值大于终值
disp(i); 循环体内不可对循环变量做修改
end
while-end
while a>2
disp(a);
a = a-1;
end
程序控制
continue
跳过当次循环剩下语句,进入下一循环
break
跳出当前循环
return
跳出程序并返回
m文件
脚本文件
没有输入输出参数,执行后变量结果返回工作空间,可直接运行
以下是脚本文件,文件名假设为exp.m
**********************************************
clear
r = 5;
s = pi*r*r;
p = 2*pi*r;
disp(s)
disp(p)
**********************************************
以下是调用
**********************************************
exp
**********************************************
函数文件
以function开头,有输入输出,变量为局部变量不返回工作空间,需要调用
以下是函数文件
**********************************************
function [s, p] = circ(r)
%文件命名应与函数名一致,系统找文件名circ.m
%CIRC 计算圆面积和周长 简单说明
%参数:输入参数r:圆半径;输出参数s:圆面积,p:周长 详细说明
s = pi*r*r;
p = 2*pi*r;
end
**********************************************
以下是调用
**********************************************
[a, b] = circ(5); %返回为多个参数时,若写a = circ(5)则保留第一个返回值
**********************************************
*以下是带子函数的函数文件
**********************************************
function y = key(w) %主函数放第一个,函数名为key
if w==0
y = type0(w); %调用子函数type0
else
y = type1(w);
end
end
function y0 = type0(a) %子函数,各子函数之间顺序无所谓
y0 = a+1;
end
function y1 = type1(a)
y1 = a+4;
end
**********************************************
*函数输入输出参数可以不定
nargin:输入参数个数,nargout:输出参数个数
varargin:输入参数内容的元胞数组,varargout:输出参数
以下是函数文件
**********************************************
function varargout = idk(varargin)
x = length(varargin);
varargout{1} = x;
varargout{2} = x+1;
end
**********************************************
第3部分:图像绘制
初始条件
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
二维曲线绘制
基本函数
plot(y)
%y为向量
plot(y1); %纵坐标为y的值;横坐标自动为元素序号(角标+1),此处为1~9
%y为矩阵
figure; %开启新绘图窗口,下一次绘图在新窗口
y = [y1', y2'];
plot(y); %当y为矩阵,按每一列画出曲线,颜色自动区分
![image-20220118204202891](https://s2.loli.net/2022/01/18/JxaVoDvkXL3Pcdi.png)
![image-20220118204340011](https://s2.loli.net/2022/01/18/JWUpM4ubQ9zKNxO.png)
plot(x, y)
xy为向量
plot(x, y1);
先绘制曲线
![image-20220118204423896](https://s2.loli.net/2022/01/18/H8vlMfmCg1p5OZq.png)
plot(x1, y1, x2, y2...)
plot(x, y1, x, y2);
在同一个窗口同一坐标轴绘制多条曲线
线性图形格式设置
线形颜色数据点
plot(x, y1, 'b:o');
蓝色 点线 圆圈
\(b蓝 g绿 r红 c青 m紫 y黄 k黑 w白\)
\(-实线 :点线 --虚线 -.点画线\)
$ .实点 o圆圈 x叉 +十字 *星号 s方块 d钻石 v下三角 ^上三角 <左三角 >右三角 p五角星 h六角星$
![image-20220118204511093](https://s2.loli.net/2022/01/18/JmvLeToiEab76zk.png)
坐标轴
plot(x, y1);
axis([-1*pi, 3*pi, -1.5, 1.5]);
规定横纵坐标范围
图形修饰
标题标签
title('a title');
%图像标题
xlabel('this is x');
%x轴标记,同理还有ylabel,zlabel
图例设置
legend('hahaha', 'location', 'best');
str的顺序与绘图顺序一致; 'best'指图例位置最佳化,还有其他位置
![image-20220118204729728](https://s2.loli.net/2022/01/18/yPWl36g1Exs2j8t.png)
图形保持
plot(x, y1);
hold on; %在原有窗口y1曲线上增加绘制下一个图形
plot(x, y2); %y2在同一窗口内被绘制
hold off;
分割绘制
subplot(2, 2, 1); %分割成2x2区域,在第一块区域绘制下一个图形
plot(x, y1); %y1被绘制在4块区域的第一块
subplot(2, 2, 2); %分割方法相同,区域改变
plot(x, y2); %y2在第二块区域
![image-20220118205019530](https://s2.loli.net/2022/01/18/oucnyjmXSeVi4wU.png)
*二维特殊图形绘制
柱状图
bar(x, y, width, '参数');
x横坐标向量,m个元素;
y为向量时,每个x画一竖条共m条,矩阵mxn时,每个x画n条;
width宽度默认0.8,超过1各条会重叠;
参数有grouped分组式,stacked堆栈式; 默认grouped
bar垂直柱状图,barh水平柱状图,bar3三维柱状图,barh3水平三维柱状图(三维多一个参数detached, 且为默认)
饼形图
pie(x, explode, 'lable');
x为向量显示每个元素占总和百分比, 为矩阵显示每个元素占所有总和百分比
explode向量与x同长度,为1表示该元素被分离突出显示,默认全0不分离
pie3绘制三维饼图
直方图
hist(y, n);
y为向量,把横坐标分为n段绘制
hist(y, x);
x为向量,用于指定每段中间值, 若取N = hist(y, x), N为每段元素个数
离散数据图
stairs(x, y, 'b-o');
阶梯图,参数同plot
stem(x, y, 'fill');
火柴杆图,参数fill是填充火柴杆,或定义线形
candle(HI, LO, CL, OP);
蜡烛图:HI为最高价格向量,LO为最低价格向量,CL为收盘价格向量,OP为开盘价格向量
向量图
compass(u, v, 'b-o');
罗盘图横坐标u纵坐标v
compass(Z, 'b-o');
罗盘图复向量Z
feather(u, v, 'b-o');
羽毛图横坐标u纵坐标v
feather(Z, 'b-o');
羽毛图复向量Z
quiver(x, y, u, v);
以(x, y)为起点(u, v)为终点向量场图
极坐标图
polar(theta, rho, 'b-o');
极角theta, 半径rho
theta = -pi:0.01:pi;
rho = sin(theta);
polar(theta, rho, 'b')
对数坐标图
semilogx(x1, y1, 'b-o');
把x轴对数刻度表示, semilogy是y轴对数刻度表示,loglog是两个坐标都用对数表示
双纵坐标
plotyy(x1, y1, x2, y2, 'fun1', 'fun2');
fun规定了两条条线的绘制方式,如plot,semilogx,semilogy,loglog,stem等
函数绘图
f = 'sin(2*x)';
ezplot(f, [0, 2*pi]);
绘制f并规定横坐标范围,也有[xmin, xmax, ymin, ymax]
x = '2*cos(t)';
y = '4*sin(t)';
ezplot(x, y);
绘制x(t),y(t)在[0, 2*pi]图像, 也可以在最后用[tmin, tmax]规定t的范围
三维曲线曲面绘制
三维曲线
x = 0:0.1:2*pi;
y = sin(x);
z = cos(x);plot3(x, y, z, 'b-*');
![image-20220118205308151](https://s2.loli.net/2022/01/18/78yGR3stVn2YMuH.png)
三维曲面
三维网格
x = -5:0.1:5; %规定了x轴采样点,也规定了x轴范围
y = -4:0.1:4; %规定了y轴采样点,也规定了y轴范围
[X, Y] = meshgrid(x, y); %得到了xoy面网格点
Z = X.^2+Y.^2;
mesh(X, Y, Z) %XY是meshgrid得到的网格点,Z是网格顶点,c是用色矩阵可省略
![image-20220118205400525](https://s2.loli.net/2022/01/18/jvzLqwJl2ukDUZP.png)
三维表面图
x = -5:0.1:5;
y = -4:0.1:4;
[X, Y] = meshgrid(x, y);
Z = X.^2+Y.^2; %以上部分同上
surf(X, Y, Z); %与上一个类似
![image-20220118205435748](https://s2.loli.net/2022/01/18/z2wphsumJFc7Gy4.png)