0%

matlab

内容大部分来自MATLAB介绍_w3cschool只是cv一下方便自己查阅

基础内容

常用运算符和特殊字符

运算符 目的
+ 加;加法运算符
- 减;减法运算符
* 标量和矩阵乘法运算符
.* 数组乘法运算符
^ 标量和矩阵求幂运算符
.^ 数组求幂运算符
\ 矩阵左除
/ 矩阵右除
.\ 阵列左除
./ 阵列右除
: 向量生成;子阵提取
( ) 下标运算;参数定义
[ ] 矩阵生成
. 点乘运算,常与其他运算符联合使用
续行标志;行连续运算符
, 分行符(该行结果不显示)
; 语句结束;分行符(该行结果显示)
% 注释标志
_ 引用符号和转置运算符
._ 非共轭转置运算符
= 赋值运算符

特殊变量和常量

Name Meaning
ans 默认的变量名,以应答最近依次操作运算结果
eps 浮点数的相对误差
i,j 虚数单位,定义为 i2 = j2 = -1
Inf 代表无穷大
NaN 代表不定值(不是数字)
pi 圆周率

matlab命名变量

  • 名称为字母开头,后可接任意数量的下划线、字母、数字
  • 区分大小写

保存工作进度

MATLAB使用save命令保存工作区中的所有变量,然后作为一个扩展名为.mat的文件,在当前目录中。

1
2
save myfile
load myfile

变量

显示已使用的变量

1
2
3
who
whos
clear %删除所有(或指定)的变量%

延伸行

  • 使用...将当前行延伸至下一行
1
2
3
4
5
initial_velocity = 0;
acceleration = 9.8;
time = 20;
final_velocity = initial_velocity ...
+ acceleration * time

格式命令

命令 作用
format short 显示4位小数
format long 显示16位小数
format bank 显示两位小数
format rat 显示有理表达式
format + 正数
  • 在命令后加e则会显示对应的指数形式

创建矩阵

1
m = [1 2 3; 4 5 6; 7 8 9]

结果:

1
2
3
4
5
m =

1 2 3
4 5 6
7 8 9

同理可创建行、列向量。

相关命令

向量、矩阵相关

命令 作用/目的
cat 连接数组
find 查找非零元素的索引
length 计算元素数量
linspace 创建间隔向量
logspace 创建对数间隔向量
max 返回最大元素
min 返回最小元素
prod 计算数组元素的连乘积
reshape 重新调整矩阵的行数、列数、维数
size 计算数组大小
sort 排序每个列
sum 每列相加
eye 创建一个单位矩阵
ones 生成全1矩阵
zeros 生成零矩阵
cross 计算矩阵交叉乘积
dot 计算矩阵点积
det 计算数组的行列式
inv 计算矩阵的逆
pinv 计算矩阵的伪逆
rank 计算矩阵的秩
rref 将矩阵化成行最简形
cell 创建单元数组
celldisp 显示单元数组
cellplot 显示单元数组的图形表示
num2cell 将数值阵列转化为异质阵列
deal 匹配输入和输出列表
iscell 判断是否为元胞类型

绘图

命令 作用/目的
axis 人工选择坐标轴尺寸
fplot 智能绘图功能
grid 显示网格线
plot 生成XY图
print 打印或绘图到文件
title 把文字置于顶部
xlabel 将文本标签添加到x轴
ylabel 将文本标签添加到y轴
axes 创建轴对象
close 关闭当前的绘图
close all 关闭所有绘图
figure 打开一个新的图形窗口
gtext 通过鼠标在指定位置放注文
hold 保持当前图形
legend 鼠标放置图例
refresh 重新绘制当前图形窗口
set 指定对象的属性,如轴
subplot 在子窗口中创建图
text 在图上做标记
bar 创建条形图
loglog 创建双对数图
polar 创建极坐标图像
semilogx 创建半对数图(对数横坐标)
semilogy 创建半对数图(对数纵坐标)
stairs 创建阶梯图
stem 创建针状图

数据类型

常用的数据类型

数据类型 描述
int8 8位有符号整数
uint8 8位无符号整数
int16 16位有符号整数
uint16 16位无符号整数
int32 32位有符号整数
uint32 32位无符号整数
int64 64位有符号整数
uint64 64位无符号整数
single 单精度数值数据
double 双精度数值数据
logical 逻辑值为10,分别代表truefalse
char 字符数据(字符串作为字符向量存储)
  • 但是用法和C不同,matlab中用法类似于函数(matlab的变量不用任何定义语句)

    1
    2
    3
    4
    5
    6
    str = 'Hello World!'
    n = 2345
    d = double(n)
    un = uint32(789.50)
    rn = 5678.92347
    c = int32(rn)

数据类型确认函数

函数 描述说明
is 检测状态
isa 确定输入是否是指定类的对象
iscell 确定输入是单元格数组
iscellstr 确定输入是字符串的单元格数组
ischar 确定项目是否是字符数组
isfield 确定输入是否是结构数组字段
isfloat 确定输入是否为浮点数组
ishghandle 确定是否用于处理图形对象句柄
isinteger 确定输入是否为整数数组
isjava 确定输入是否为Java对象
islogical 确定输入是否为逻辑数组
isnumeric 确定输入是否是数字数组
isobject 确定输入是否为MATLAB对象
isreal 检查输入是否为实数数组
isscalar 确定输入是否为标量
isstr 确定输入是否是字符数组
isstruct 确定输入是否是结构数组
isvector 确定输入是否为向量
class 确定对象的类
validateattributes 检查数组的有效性
whos 在工作区中列出变量,其大小和类型

运算符

位运算

函数 目的/作用
bitand(a, b) 当a、b是一个或数个无符号整数或无符号整数数组,返回参数a和b位和,
bitcmp(a) a的补码
bitget(a,pos) 在指定位置pos中获取位,在整数数组a中
bitor(a, b) 对数a和b按位或
bitset(a, pos) a的集合点在一个特定的位置pos
bitshift(a, k) 返回一个移到左K位,相当于乘以2K。K负值对应的位权转移或除以2\ K\ 向负无穷舍入到最近的整数。任何溢出位都被截断。
bitxor(a, b) 对数a和b按位异或
swapbytes 交换字节顺序

集合运算

函数 描述
intersect(A,B) 设置两个数组的交集;返回A和B所共有的值。返回的值按排序顺序排列。
intersect(A,B,’rows’) 将A和B的每一行作为单个实体处理,并返回A和B的公共行。返回的矩阵的行按排序顺序排列。
ismember(A,B) 返回与A大小相同的数组,包含1(true),其中A的元素在其他地方的B中找到,它返回0(false)。
ismember(A,B,’rows’) 将A和B的每一行作为单个实体处理,并返回一个包含1(true)的向量,其中矩阵A的行也是B的行;否则,它返回0(false)。
issorted(A) 如果A的元素按排序顺序返回逻辑1(true),否则返回逻辑0(false)。输入A可以是向量,也可以是N-by-1或1-by-N的字符串数组。如果A和sort(A)的输出相等,则A被认为是排序的。
issorted(A, ‘rows’) 如果二维矩阵A的行按排序顺序返回逻辑1(真),否则返回逻辑0(假)。 如果A和排序(A)的输出相等,则认为矩阵A被排序。
setdiff(A,B) 设置两个数组的差值;返回不在B中的值。返回数组中的值按排序顺序排列。
setdiff(A,B,’rows’) 将每一行A和B行作为单个实体处理,并返回一个不在B中的行。返回的矩阵的行按排序顺序排列。“行”选项不支持单元格数组。
setxor 设置两个数组的异或
union 设置两个数组的并集
unique 数组中唯一的值

语句

条件判断

1
2
3
4
if (...)
.....;
.....;
end
1
2
3
4
5
6
7
switch(...)
case .. %无冒号
....;
....;
case ..
.... %单行可以不加分号
end
  • 其他用法与C基本相同
  • end后不须跟分号(即使后面还有语句)

循环

1
2
3
4
while()
...;
...;
end

for循环

for循环有三种用法:

  • initval:endval 默认步长为+1,递增

    1
    2
    3
    4
    for a = 10:20 
    ...;
    ...;
    end
  • initval:step:endval step可自定义步长

    1
    2
    3
    4
    for a = 1.0: -0.1: 0.0
    ...;
    ...;
    end
  • 索引数组

    1
    2
    3
    4
    for a = [24,18,17,23,28]
    ...;
    ...;
    end

向量

元素索引

1
2
3
rv = [1 2 3 4 5 6 7 8 9];
sub_rv = rv(3:7)
rv(1)

向量转置

1
2
r = [ 1 2 3 4 ];
tr = r';

求向量的模

1
2
3
4
v = [1: 2: 20];
sv = v.* v;
dp = sum(sv);
mag = sqrt(dp);

向量点积

若要求取向量的点积,不能直接使用运算符求得,需使用函数dot(a,b)

1
2
3
v1 = [2 3 4];
v2 = [1 2 3];
dp = dot(v1, v2);
  • *号用于运算矩阵乘法,而.*用于数组的乘法(数组的乘法有一套自己的算法)

矩阵

矩阵索引

  • 第m行,第n列的一个元素

    1
    mx(m,n);
  • 第m列的所有元素

    1
    2
    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
    v = a(:,4) %第4列的所有元素,并返回一个列向量
    1
    2
    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
    a(:, 2:3) %第2-3列的所有元素

注:索引从1开始,而不是0

删除行或列

1
2
a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a( 4 , : ) = []

除法

1
2
3
4
a = [ 1 2 3 ; 4 5 6; 7 8 9];
b = [ 7 5 6 ; 2 0 8; 5 7 1];
c = a / b %a右乘b的逆矩阵(inv(b))
d = a \ b %b左乘a的逆矩阵
  • 必须为方阵,因为只有方阵才有逆矩阵

行列式

1
2
a = [ 1 2 3; 2 3 4; 1 2 5]
det(a)
  • 行列式一定为方阵
  • 转置不改变行列式的值

多维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
a = [7 9 5; 6 1 9; 4 3 2];
a(:, :, 2)= [ 1 2 3; 4 5 6; 7 8 9];

结果:
a(:,:,1) =
7 9 5
6 1 9
4 3 2

a(:,:,2) =
1 2 3
4 5 6
7 8 9

或使用cat函数:

1
b = cat(3,a,[ 1 2 3; 4 5 6; 7 8 9]); %维度+要串联的阵列

单元阵列

单元阵列的阵列中每个单元格可以存储不同的维度和数据类型的数组的索引单元格

1
C = cell(dim1,...,dimN) %dim 是一个标量整数或整数向量,指定单元格阵列C的尺寸
1
2
3
4
5
6
7
c = cell(2, 5);
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};

结果:
c =
'Red' 'Blue' 'Green' 'Yellow' 'White'
[ 1] [ 2] [ 3] [ 4] [ 5]

单元阵列索引

可以使用大括号或小括号索引,索引方法与前相同

函数

一般函数格式

1
2
3
4
function [out1,out2,...] = fun_name(in1,in2,...)
%帮助文本
...
end

匿名函数

1
2
power = @(x, n) x.^n;
result1 = power(7, 3)

绘图

1
plot(x, y), xlabel('x'), ylabel('Sin(x)'), title('Sin(x) Graph'),

绘制多条曲线

1
2
3
4
5
x = [-10 : 0.01: 10];
y = 3*x.^4 + 2 * x.^3 + 7 * x.^2 + 2 * x + 9;
g = 5 * x.^3 + 9 * x + 2;
plot(x, y, 'r', x, g, 'g') % 'r','g'代表曲线颜色
legend('y(x)','g(x)');

设置轴刻度

1
axis ( [xmin xmax ymin ymax] )

绘制多个图像

1
subplot(a,b,c);
  • a:总行
  • b:总列
  • c:第几图

例如生成2*2个图像,第二行第一个图则为subplot(2,2,3);

代数

声明一个代数

1
syms x 

解代数方程

1
solve(x^2 -7*x + 12 == 0);

或:

1
2
eq='x^2 -7*x + 12 == 0';
result=solve(eq);

若要单独显示各个根:

1
2
3
4
disp(result(1));
disp(result(2));
disp(result(3));
disp(result(4));
  • 我的matlab必须手动打印结果,不知道为什么

多项式

当计算一个一元多次项时,可以使用行向量表示,例如:

方程 P(x) = x^4 + 7x^3 - 5x + 9 可以表示为:

1
p = [1 7 0 -5 9];

求解:

1
polyval(p,4) %计算当x=4时多项式的值

还可以通过输入矩阵的方式计算多个值:

1
2
3
4
5
6
7
8
9
10
p = [1 7 0  -5 9];
X = [1 2 -3 4; 2 -5 6 3; 3 1 0 2; 5 -7 3 8];
polyval(p, X);

%结果:
ans =
2307 -1769 -939 4499
2314 -2376 -249 4695
2256 -1892 -549 4310
4570 -4532 -1062 9269

使用多项式的曲线拟合

当我们要对离散点拟合一条曲线时,可以使用polyfit函数,该函数的作用是通过最小二乘法的方式拟合出一条曲线的多项式

1
2
x = [1 2 3 4 5 6]; y = [5.5 43.1 128 290.7 498.4 978.67]; 
p = polyfit(x,y,5)

此时p为一个多项式,可以使用polyval在坐标集上拟合出该曲线

1
2
3
x2 = 1:0.1:6;          
y2 = polyval(p,x2);
plot(x,y,'o',x2,y2)