前言

这里是课程笔记。
这是一门好课,这门课非常细致。
事实上,不必深究MATLAB的语法细节。
略去了一些在数学建模中没有用处的章节和内容。

基本操作与矩阵输入

运算符

  • 运算符:+-*/^(乘方)、=(赋值)
  • 运算优先级
    • 同等优先级下从左向右
    • 优先级顺序(从高到低)
        1.括号()
        2.乘方^
        3.乘除法*/
        4.加减法+-

变量

变量名

  • 变量不需要预先声明
  • 变量名是大小写敏感的,且应当以字母开头

数据类型

数值变量类型

特殊的变量与常量

  • ans:存储运算结果
  • i, j:虚数单位
  • Inf:无穷大(例:1/0
  • eps2.2204e-016
  • NaN:非数(例:Inf/Inf
  • pi:圆周率

优先级

变量名优先级

(可通过iskeyword给出系统中所有预先定义好的关键字)

1
2
3
4
5
6
>> cos='This string.';
>> cos(8)

ans =

'r'

变量格式化输出format []

命令 效果 示例
short 显示小数点后4位(默认) 3.1416
long 显示小数点后15位(双精度),显示小数点后7位(单精度) 3.141592653589793
shortE 科学记数法显示小数点后4位 3.1416e+00
longE 科学记数法显示小数点后15位(双精度),科学记数法显示小数点后7位(单精度) 3.141592653589793e+00
bank 货币格式显示小数点后2位 3.14
hex 显示十六进制形式 400921fb54442d18
rat 显示有理数形式 355/113

命令行

函数嵌入

  • 函数可以嵌入到其他函数中,例如下面两段等价

    1
    sin(cos(pi))
    1
    2
    cos(pi)
    sin(ans)
  • 多行代码可以合并

特殊命令

  • 语句末尾加;将不显示运算结果
  • 使用显示历史命令
  • clc:清空命令窗口
  • clear:清除所有变量
  • clear <xxx>:清除变量<xxx>
  • who:显示所有变量名
  • whos:显示所有变量信息

矩阵

创建矩阵

  • []把矩阵内容括起来,用`或,隔开行内变量,用;`分隔每一行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    >> a = [1 2 3 4]

    a =

    1 2 3 4

    >> b = [1;2;3;4]

    b =

    1
    2
    3
    4

    >> [1 21 6; 5 17 9; 31 2 7]

    ans =

    1 21 6
    5 17 9
    31 2 7
  • [j:i:k]:使用冒号运算符:建立矩阵,其中i的缺省值为1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    >> B = 1:5

    B =

    1 2 3 4 5

    >> B = 1:2:5

    B =

    1 3 5

    >> B = [1:5; 2:3:15; -2:0.5:0]

    B =

    13

    1.000000000000000 2.000000000000000 3.000000000000000
    2.000000000000000 5.000000000000000 8.000000000000000
    -2.000000000000000 -1.500000000000000 -1.000000000000000

    45

    4.000000000000000 5.000000000000000
    11.000000000000000 14.000000000000000
    -0.500000000000000 0

    >> str = 'a':2:'z'

    str =

    'acegikmoqsuwy'
  • 合并原有矩阵

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    >> A = [1 2; 3 4]

    A =

    1 2
    3 4

    >> B = [5 6; 7 8]

    B =

    5 6
    7 8

    >> C = [A B]

    C =

    1 2 5 6
    3 4 7 8

矩阵索引

  • 矩阵元素按列存储,起始下标为1

  • 可以使用行列下标索引矩阵元素

  • 可以使用一维下标索引矩阵元素

  • :表示所有行或所有列

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    >> A = [1 21 6; 5 17 9; 31 2 7]

    A =

    1 21 6
    5 17 9
    31 2 7

    >> A(8)

    ans =

    9

    >> A([1 3 5])

    ans =

    1 31 17

    >> A([1 3; 1 3])

    ans =

    1 31
    1 31

    >> A(3, 2)

    ans =

    2

    >> A([1 3], [1 3])

    ans =

    1 6
    31 7

矩阵删除

使用空矩阵[]替换原有矩阵元素即完成删除操作

矩阵运算

运算符 操作 形式 例子
+ 矩阵与实数相加 A+b [6 3] + 2 = [8 5]
- 矩阵与实数相减 A-b [6 3] - 2 = [4 1]
+ 矩阵与矩阵对应位置相加 A+B [6 3] + [4 8] = [10 11]
- 矩阵与矩阵对应位置相减 A-B [6 3] - [4 8] = [2 -5]
* 矩阵与矩阵相乘 A*B [6 3] * [4 8]' = 48
.* 矩阵与矩阵对应位置相乘 A.*B [6 3] .* [4 8] = [24 24]
/ 矩阵与矩阵右除(等价于A*inv(B) A/B [6 3] / [4 8] = 0.6
\ 矩阵与矩阵左除(等价于inv(A)*B A\B [6 3] \ [4 8] = [0.06667 1.3333; 0 0]
./ 矩阵与矩阵对应位置右除 A./B [6 3] ./ [4 8] = [1.5 0.375]
.\ 矩阵与矩阵对应位置左除 A.\B [6 3] .\ [4 8] = [0.6667 2.6667]
^ 矩阵与向量乘方 A^b [1 2; 3 4]^3 = [37 54; 81 118]
.^ 矩阵与矩阵对应位置乘方 A.^B [1 2; 3 4].^[1 2; 3 4] = [1 4; 27 256]
' 矩阵的转置 A' [1 2; 3 4]' = [1 3; 2 4]

特殊矩阵

linspace(a,b,n)a为起始值,b为终止值,n为元素个数(缺省值为100
eye(n):得到一个n×n的单位矩阵
zeros(a,b):得到一个a×b的全0矩阵
ones(a,b):得到一个a×b的全1矩阵
diag(vector):得到一个以向量vector中元素为对角线的对角矩阵
rand(a,b):得到一个a×b(0,1)之间均匀分布的随机数矩阵

一些矩阵函数

max():每列最大值
sum():每列元素之和
mean():每列元素均值
sort():每列元素由小至大排序
sortrows():按照第一列元素由小到大排列行顺序
size():[行, 列]
length():列数
find():满足条件的一维索引
reshape():改变矩阵的尺寸

Exercise

1
cos(sqrt((1+2+3+4)^3/5))
1
sin(sqrt(pi))+log(tan(1))
1
2^(3.5*1.7)
1
exp(sin(10))
1
2
3
4
5
6
>> format rat
>> 3/13+4/14+5/15

ans =

232/273
1
2
3
4
5
6
>> format long
>> 3/13+4/14+5/15

ans =

0.849816849816850
1
2
3
4
5
6
7
>> A = [1 21 6; 5 17 9; 31 2 7];
>> A(4)=76;A(3,2)=0;A([1,2],[2,3])=0;A(3,:)=[]

A =

1 0 0
5 0 0

结构化程序与自定义函数

程序文件<filename>.m

  • 句首使用%作为注释
  • 段首使用%%作为段落划分

流程控制

(与C++差别不大)

  • ifelseifelse
  • for
  • switchcaseotherwise
  • trycatch
  • while
  • break
  • continue
  • end所有流程控制语句均以此为结束标志
  • pause
  • return

逻辑运算符

  • ~=:不等于
  • 其余与C++无异

预先分配内存

(预先分配内存可以节省程序运行时间。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tic
for ii = 1:2000
for jj = 1:2000
A(ii,jj) = ii + jj;
end
end
toc
% 输出“历时 2.997162 秒。”
tic
A = zeros(2000, 2000); % 预先为变量分配内存空间
for ii = 1:size(A,1)
for jj = 1:size(A,2)
A(ii,jj) = ii + jj;
end
end
toc
% 输出“历时 0.039027 秒。”

一些小技巧

  • 程序运行前使用clear all移除所有变量,使用close all关闭所有图表,使用clc清空命令窗口

  • 使用...进行换行

    1
    2
    A = [1 2 3 4 5 6; ...
    6 5 4 3 2 1];
  • 使用Ctrl + C强制终止正在运行的程序

函数文件<functionname>.m

函数样式(文件名应当与函数名一致)

内置的函数参数

  • inputname:输入变量名列表
  • mfilename:函数源代码文件名
  • nargin:输入变量个数
  • nargout:输出变量个数
  • varargin:可变长输入参数列表
  • varargout:可变长输出参数列表

函数句柄

使用函数句柄 = @(输入变量) 输出变量定义函数,之后可以通过函数句柄调用函数

Exercise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
n = 1;
sum=0;
while n<1000
sum=sum+n;
n=n+1;
end
disp(sum)
for n=1:2:10
a((n+1)/2)=2^n;
end
disp(a)
A=[0,-1,4;9,-14,25;-34,49,64];
B=zeros(3,3);
for i=1:9
B(i)=A(i);
end
for i=1:9
if B(i)<0
B(i)=i
end
end
disp(B)
function F2C()
while(1)
f = input('\nTemperature in F:');
if isempty(f)
break
end
c = (f-32)/1.8;
disp(strcat('→Temperature in C:',num2str(c)))
end

变量与文件读写

字符类型

  • 使用单引号对''构造字符串
  • 字符串在内存中是以矩阵形式存储的ASCII

结构体

结构体示例

元胞数组

使用{}定义元胞数组,它可以容纳各种数据类型的元素

文件存储与读取

.mat文件

save <filename>.mat <变量>:不写<变量>表示所有变量
save <filename>.mat <变量> -ascii:此种方式生成文件可读
load('<filename>.mat')
load('<filename>.mat','-ascii')

Excel文件

<变量名> = xlsread('<filename>.xlsx', <位置>)(其中<位置>可以省略,自动读取数字)
xlswrite('<filename>.xlsx', <variable>, <sheet>, <位置>)
<变量名1 变量名2> = xlsread('<filename>.xlsx', <位置>)<变量名2>为元胞数组,存储了标题

Exercise

1
2
s1 = 'I like the letter E';
s2 = s1(length(s1):-1:1)

绘图

plot()

plot(x,y,'str')x的缺省值为[1:length(y)]str见下表)
绘图样式

多张图表

  • hold on/off:多根图线显示于同一图片上
  • 使用figure画多个图表(分开)
    figure, plot(x, y1)
    figure, plot(x, y2)
  • subplot(m, n, 1);m×n个图表(序号按行)

标注信息

  • Legend('L1', ...):标注线条样式样例及名称'L1', ...
  • title():添加图表标题
  • <x/y>label():添加<x/y>轴标签
  • text(<x坐标>, <y坐标>, '$$ Latex公式 $$', 'Interpreter', 'latex'):使用LaTex构造公式(专门去学一下吧)
  • annotation('arrow', 'X', [横纵坐标], 'Y', [横纵坐标]):构造箭头

图表美化

改变坐标轴属性

  • 改变字体大小
    set(gca, 'FontSize', 25);
  • 改变刻度
    set(gca, 'XTick', 0:pi/2:2*pi);
  • 改变刻度标记
    set(gca, 'XTickLabel', 0:90:360);
    set(gca, 'FontName', 'symbol');
    set(gca, 'XTickLabel', {'0', 'p/2', 'p', '3p/2', '2p'});

改变线条属性

1
2
3
4
h = plot(x,y); 
set(h, 'LineStyle','-.', ...
'LineWidth', 7.0, ...
'Color', 'g');

Exercise

1
2
3
4
5
6
7
8
9
t = [1:0.01:2];
hold on
plot(t,t.^2,'k')
plot(t,sin(2*pi*t),'or')
legend('t^2','sin(2\pit)')
xlabel('Time (ms)')
ylabel('f(t)')
title('Mini Assignment #1')
hold off