这是B站up主@glanny的视频"1小时Matlab速成教程"所整理和补充的笔记
视频链接在此:https://www.bilibili.com/video/BV1hE411Q7T4?t=1205
MATLAB入门(一)
生成矩阵
%直接法
a = [1,2,3;4,5,6;7,8,9];
%冒号一维矩阵 a = 开始 : 步长 : 结束,步长为1可省略
b = 1 : 1 : 10;
b = 1:10; %与上式等价
%函数生成
%linspace(开始,结束,元素个数),等差的生成指定元素个数的一维矩阵,省略个数时生成一百个
c = linspace(0,10,5);
%特殊矩阵
e = eye(4); %四维单位阵
z = zeros(1,4);%zeros(维数)全零阵,一行四列
o = onces(4,1);%ones(维数)全1阵
r = rand(4);%rand(维数)0~1分布随机阵
rn = randn(4);%randn(维数)0均值高斯分布随机阵
矩阵的运算
%diag的两种用法
%1
X = diag(v,k);%v为向量,X为矩阵,将以向量v的元素作为矩阵X的第k条对角线,当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。
>>v=[1,2];
>>X=diag(v,-1);
X=
0 0 0
1 0 0
0 2 0
%2
v = diag(X,k);%v为向量,X为矩阵,将矩阵X的第K条对角线元素作为向量v
tril_a = tril(a,1);%tril(矩阵,主对角线上方第k条斜线)生成矩阵的下三角阵,triu生成矩阵的上三角阵
%加、减、乘、乘方
a*a;%矩阵乘法
%点运算
% a.*b, a./b, a.\b, a.`b 对应元素的.* ./ .\ .`运算
a.*a;%对应元素相乘
%逆矩阵
pinv(a); %伪逆矩阵,当a不是方阵,求其广义逆矩阵,否则为逆矩阵
%特征值,特征向量
[v,D] = eig(a); %输出v为特征向量,D为特征值对角阵
%行列式
det(a);
%秩
rank(a);
%伴随
compan(a);
矩阵的修改
%部分替换
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(按顺序重新排列矩阵)
>>E = eye(2)
>>e = reshape(E,1,4)
e = 1 0 0 1
MATLAB中以列优先的方式存储数据
矩阵的信息获取
%矩阵的行列数
[row_a, col_a] = size(a); %[行数,列数]
%行列中最大的
len_a = length(a);
创建多维数组
%直接法
%以2x3x2三位数组为例
mul_1(:,:,1) = [1,2,3;4,5,6];
mul_1(:,:,2) = [6,5,4;3,2,1];
%扩展法
mul_2(:,:,2) = [3,4,5;6,7,8];%若不赋值第一页,则第一页全为零
%拼接法
mul_31 = [1,2,3;4,5,6];
mul_32 = [6,5,4;3,2,1];
mul_3 = cat(3,mul_31,mul_32); %把二者按照三维连接
字符串
%创建
str0 = 'Hello World'; %字符串用单引号引起
str1 = 'I''m a student';%字符串中的单引号写两遍
str3 = ['I' 'm' 'a' 'student'];%方括号连接多字符串
str4 = strcat(str0,str1);%连接字符串函数
str5 = strvcat(str0,str1);%连接多行字符串
str6 = double(str0);%取str0的ASCII值,也可以用abs函数
str7 = char(str6);% 把ASCII码转换为字符串
%操作
%比较
strcmp(str0,str1);%相等为1,否则为0
strncmp(str0,str1,3);%将比较前三个字符
strcmpi(str0,str1);%忽略大小写比较
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);%转大写
strjust(str0,'right');%将str0右对齐,还有left,center
strtrim(str0);%删除str0开头结尾空格
eval(str0);%将str0作为代码执行
%转换
str_b = num2str(b);%数字转字符串,其他如hex_a = dec2hex(13);
程序流程
%选择结构
if a>0
disp(x);
elseif a == 0
disp(a);
else
disp(a-1);
end
%switch-case-otherwise-end
switch a
case 0
disp('Wrong')
case 1
disp('Right')
otherwise %相当于default
disp('What?')
end
%try-catch
try
z == x*y;%不匹配的矩阵相乘
catch
z = x.*y; %若try出错,则执行此句
end
disp(z)
%循环
for i=0:1:10 %步长为负,则初值应当大于终值
disp(i)
end
while a>2
disp(a);
a = a-1;
end
%continue break return 从略
m文件
%脚本文件:没有输入输出参数,执行后变量结果返回工作空间,可直接运行
%以下是脚本文件,文件名假设为exp.m
clear %清理变量
i = 5;
disp(i*i);
%在命令行窗口输入脚本文件名即可调用该脚本
%函数文件:(函数名应当与文件名相同)
function [s,p] = circ(r)
%函数体,返回的参数将在此被直接赋值
s = pi*r*r;
p = 2*pi*r;
end
%以下是调用
[a,b] = cicr(5);
%函数文件可以包含子函数
function y = key(w)
if w==0
y = type0(w);
else
y = type1(w);
end
end
MATLAB绘图
%二维曲线绘制
%基本函数
%plot(y)
plot(y);%y为向量,纵坐标为y的值,横坐标自动为元素序号(角标+1)
figuer; %开启新绘图窗口,下一次绘图在新窗口
y = [y1',y2']; %行向量转置为列向量
plot(y);%当y为矩阵,按每列向量画出曲线,颜色自动区分
%plot(x,y)
%x,y为向量
plot(x,y1);%以x,y为坐标绘制
plot(x2,y1,x2,y2);%在同一个窗口绘制多条曲线
%图形格式设置
%线性 颜色和数据点
plot(x,y1,'b:o'); %蓝色 点线 圆圈
%b蓝 g青 r红 m紫 y黄 k黑 w白
%-实线 :点线 --虚线 -。点画线
%.实点 o圆圈 x叉 +十字 *星号 s方块
%坐标轴
plot(x,y1);
axis([-1*pi,3*pi,-1.5,1.5]);%规定横坐标范围
%图形修饰
%标题标签
title('title');%图像标题
xlabel('this is x');%x轴标记,同理还有ylable,zlabel
%图例设置
legend('one','two','best');%str顺序与uitu顺序一致,best指图例位置最佳化
%图形保持
plot(x,y1);
hold on; %将在原有窗口绘制下一个图形,且不会覆盖原有曲线
plot(x,y2);
hold off;
%分割图像
subplot(2,2,1); %分割成2x2区域,在第一块区域绘制下一个图形
plot(x,y1);%y1被绘制在4块区域中的第一块
plot(x,y2);%y2在第二块区域
%三维曲线曲面绘制
%三维曲线
x = 0:0.1:2*pi;
y = sin(x); z = cos(x);
plot3(x,y,'b-*');
%三维曲面
%三维网格
x = -5:0.1:5; %规定了x轴的采样点和范围
y = -4:0.1:4; %规定了y轴采样点和范围
[X,Y] = meshgrid(x,y); %得到了xoy面网格点
Z = X.^2+Y.^2;
mesh(X,Y,Z);%X,Y是meshgrid得到的网格点,Z是网格顶点
%三维表面图
x = -5:0.1:5;
y = -4:0.1:4;
[X,Y] = meshgrid(x,y);
Z = X.^2+Y.^2;
surf(X,Y,Z);