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];

image-20220117205719856

②冒号法

冒号一维矩阵 a = 开始:步长:结束,步长为1可省略

b = 1:1:10; % 1,2,...10

b = 1:10; %与上一个等价

image-20220117205701620

③函数生成(常用)

普通矩阵

linspace(开始,结束,元素个数); 等差生成指定元素数的一维矩阵,省略个数则生成100个

c = linspace(0,10,5);

image-20220117205750975

特殊矩阵

e = eye(4); %eye(维数)单位阵

image-20220117210056801

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);

image-20220117210636530

tril(矩阵,主对角线上方第k条斜线)

生成矩阵的下三角阵,triu上三角阵(最后面的\(l,u\)代表了\(low,up\)

tril_a = tril(a,1);

image-20220117210845684

加、减、乘、乘方

a + b; a - b; a * b; a ^ n;

点运算(对应元素的*,/,,^运算)

a.*b , a./b , a.\b , a.^b,a.*a

image-20220118202541624

逆矩阵

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) = []  %(:,列)替换列,为[]删除该列

image-20220117211904399

转置

T_a = a';

指定维数拼接

c1_a = cat(1,a,a); 垂直拼接

c2_a = cat(2,a,a); 水平拼接

image-20220117212035608

变维

rs_a = reshape(a,1,9); 元素个数不变,矩阵变为m*n

image-20220117212058572

矩阵信息获取

矩阵的行列数

[row_a, col_a] = size(a); [行数,列数]

image-20220118202647575

行列中最大的

len_a = length(a);

image-20220118202711446

多维数组(的创建)

直接法

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);

image-20220118203328796

dec2hex,将十进制转十六进制

image-20220118203542111

abs,double取ASCII码;char把ASCII转字符串

abs_str = abs('aAaA');

image-20220118203453450

第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 image-20220118204340011

plot(x, y)

xy为向量
plot(x, y1);  先绘制曲线

image-20220118204423896

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

坐标轴

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

图形保持

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

*二维特殊图形绘制

柱状图

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

三维曲面

三维网格

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

三维表面图

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
posted @ 2022-01-18 21:00  tsrigo  阅读(316)  评论(0编辑  收藏  举报