Matlab入门

本文最后更新于:2019年9月15日 晚上

概览:本文是Matlab的简易学习笔记,为了全国大学生数学建模竞赛做一些准备。

参看视频:https://www.bilibili.com/video/av14503445?from=search&seid=10560014714789112428

运算符与规则

1
+ - * / ^(次方)
  • ^ 的优先级高于其他几个

1
cos(((1+2+3+4)^3/5)^0.5)

1
sin(pi^0.5) + log(tan(1))

log函数

log 以10为底的函数:lg

log 以e为底的函数:ln

在matlab中以以e为底的对数以log函数表示,以10为底的对数用log10表示

embedding function

1
2
3
4
5
6
7
sin(cos(pi))

||

cos(pi)
sin(ans)
% 当程序比较复杂的时候将其中一部分的结果暂时放到variable(ans)中

变量 variable

matlab中变量不需要指定类型

1
2
3
4
变量名 = 数值
a = 10

'='是assignment operator,是将10指定给a这个变量
  • 变量区分大小写
  • 变量不能使用数字开头

命令行输入 who 可以查看当前的变量有哪些

输入 whos 可以查看当前的变量大小、类型等详细信息

一般默认的类型是double,8字节

特殊变量和关键字

  • 常量 e

    matlab中使用 exp(1) 来表示

  • ans

  • i , j 复数

  • Inf 无限大

  • eps 很小很小的数

  • NaN :not a number。例如:x = Inf / Inf

  • pi

matlab 数据类型

matlab Calling Priority

variable(高)

Built-in function

Subfunction

Private function(低)

当拿一个函数的名称作为变量名称时,会优先使用变量

display format

在命令行输入 format long 类似的改变显示格式

  • rat 表示分数计算

命令行

  • 分号 表示不会把计算结果显示出来
  • clc : 清除命令行
  • clear : 清除workspace的变量
  • who : 查看在workspace的变量
  • whos : 查看在workspace的变量信息
  • iskeyword : 打印关键字
  • format + 格式 : 改变显示格式

矩阵和向量 Array(Vector and Matrix)

行向量:

1
a = [1 2 3 4]

列向量

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

乘积

1
2
3
4
5
6
a * b = 30
b * a =
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16

输入矩阵: 空格隔开列,分号分隔行

1
2
3
4
5
6
>> A = [1 21 6; 5 17 9; 31 2 7]

A =
1 21 6
5 17 9
31 2 7

Array index

取出上述矩阵A的特定位置的元素

matlab下标从1开始

  • A(1,2) ——取出矩阵坐标为(1,2)位置的元素。第一行,第二列
  • A(4) ——从第一列数起对应的index值
  • A([1 3 5]) —— 取出第1、3、5个元素的值
  • A([1 3; 1 3]) ——取出第1、3个元素构成一个矩阵
  • A([1 3] , [1 3]) ——前面代表第1、3行,后面代表第1、3列,取出他们构成的交集,然后组成一个矩阵

矩阵值替换

1
A(2,1) = 31

Colon Operator

创建等差数列

1
2
3
4
5
6
7
8
9
10
11
12
%创建从1到100的等差数列
A = [1:100]
%或者 A = 1:100
%创建1,3,5,……,99
A = [1:2:99]

%可以创建矩阵
B = [1:5; 2:3:15; -2:0.5:0]

%可以和字符联合使用
strs = 'a':2:'z'
% acegikmoqsuwy

当然,当Colon Operator前后都无参数时表示这个矩阵全部的值

删除行或者列

1
2
3
4
5
%删除A的第二行
A(2,:) = []

%删除A的第二列
A(:,2) = []

增广矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
a = [1 2;3 4];
b = [9 8;7 6];
c = [a b]
c =
1 2 9 8
3 4 7 6

d = [a;b]
d =
1 2
3 4
9 8
7 6

矩阵运算

1
2
+ | - | * | / | ^ | .   ||
加 ||||乘方|每一项|转置|
1
2
3
4
5
6
7
8
9
10
11
12
%.* -- 点乘,表示矩阵A的每一项乘以矩阵B相对应的每一项
%同理./也是同一个意思

a = [1 2;3 4];
b = [9 8;7 6];

a.*b =
9 16
21 24

a./b -- a做被除数
a.\b -- a做除数

矩阵与实数做运算

1
2
3
4
5
6
A -- 表示矩阵, a -- 表示实数
A + a -- 矩阵的每一项都加上a
A / a 同理
A ./ a与A / a结果一样
A ^ a -- 表示a个A矩阵相乘
A .^ a -- 表示A矩阵内的每一项都是a的乘方

特殊的矩阵

1
2
3
4
5
6
7
8
9
10
11
eye(n) -- 创建n*n identity matrix
zeros(n1,n2) -- 创建n1*n2的值全为0的矩阵
ones(n1,n2) -- 创建n1*n2的值全为1的矩阵
diag() -- 创建对角线矩阵

diag([2 3 4])

ans =
2 0 0
0 3 0
0 0 4

矩阵的一些函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
A是一个矩阵
max(A) -- 得到每一列最大的数
max(max(A)) -- 得到这个矩阵最大的数
min() --同理

sum(A) -- 得到每一列的和
sum(sum(A)) -- 得到矩阵所有数值的和
mean(A) -- 得到整个列的平均值

sort(A) -- 对矩阵的每一列按照从小到大进行排序
sortrows(A) -- 对矩阵的行按照每行的第一个值从小到大进行排序
size(A) -- 获取矩阵的行列数
length(A) -- 指获取向量的长度
find(A==5) -- 找到矩阵中值为5的那个元素的index

程序

1
2
3
4
5
for i=1:10
x=linspace(0,10,101);
plot(x,sin(x+i));
print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end

当给一段程序的前面加上 %% 的符号的时候,就是把程序分成section,可以单独执行。

scripts – 指令

程序内的后面加上分号;就不会把结果显示在命令行里。

1
2
3
4
5
6
7
8
9
10
if,elseif,else
for
switch,case
while

break
continune
end
pause
return

换行

如果一行内容过多可以使用三个点隔开,表示换行。

1
2
a = [1 2 3 4 5;...
6 7 8 9 10]

逻辑判别式

boolean: 1为true,0为false。

1
2
3
~= 不等于
== 等于
%其余与C++的相同

if…elseif…else

1
2
3
4
5
6
a = 3;
if rem(a,2) == 0 %求余数
disp('a is even')
else
disp('a is odd') %奇数
end

switch

1
2
3
4
5
6
7
8
9
10
11
input_num = 1;
switch input_num
case -1
disp('negative 1');
case 0
disp('zero');
case 1
disp('positive 1');
otherwise
disp('other value');
end

while

1
2
3
4
5
6
n = 1;
while prod(1:n) < 1e100
% 1:n 会形成一个[1,2,...,n]的向量,而prod则是会将这些向量连乘起来
% 1e100 是指 1乘以10的100次方
n = n + 1;
end

for

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for variable=start:increment:end
commands
end
%%%%%%%%%%
for n=1:10
a(n) = 2^n;%a是一个列向量
end
disp(a)

%%%%%%%%%%%%%
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.052879 秒。
% 通过 tic toc

break

跳出循环

1
2
3
4
5
6
7
8
9
10
x = 2;k = 0;error = inf;
error_threshold = 1e-32;
while error > error_threshold
if k > 100
break
end
x = x - sin(x)/cos(x);
error = abs(x - pi);
k = k+1;
end

function – 函数

1
2
edit (which('mean.m'))
%就可以查看mean.m这个函数的实现

函数格式

1
2
function 输出结果 = 函数名(输入)
如果输出结果有多个值可以使用[a F]这种形式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function x = freebody(x0,v0,t)
%
x = x0 + v0.*t + 1/2*9.8*t.*t;
%注意是.*的形式,也就意味着可以传入向量。

%%%%%%
freebody(0,0,10)
ans =
490

freebody([0,1],[0,1],[10,20])

ans =
490 1981
1
2
3
4
5
6
7
8
9
function y = F2C()
while 1
TinF = input('pleasr input a temperature in F:');
if isempty(TinF)
break
end
y = 5*(TinF-32)/9;
fprintf('==>Tem in C = %f\n',y);
end

function handle

1
2
3
f = @(x) exp(-2*x);
x = 0:0.1:2;
plot(x,f(x));

方程式求根

symbolic variable

创建symbolic variable的方式有两种:sym或者syms

1
2
3
4
5
syms x
%或者
x=sym('x')

x+x+x = 3*x

solve()函数求解

例:y = x * sin(x) - x = 0

1
2
syms x
solve('x*sin(x) - x',x)

解多元方程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>> syms x y
>> eq1 = x -2*y -5;
>> eq2 = x + y -6;
>> A = solve(eq1,eq2,x,y)

>> A =
x: [1x1 sym]
y: [1x1 sym]

>> A.x

ans =

17/3

>> A.y

ans =

1/3

多个未知数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
% ax^2 - b = 0

syms x a b
solve('ax^2 - b')

ans =

b^(1/2)/a^(1/2)
-b^(1/2)/a^(1/2)

%%%%%%%%%%
%如果想要把b作为未知数求解的话
solve('ax^2 - b','b')

ans =

a*z^2

其他参考连接

matlab线性规划

matlab绘制曲线相交的交点

历年国赛