Matlab数据类型
本篇介绍我在南农matlab课程上的所学,我对老师ppt上的内容重新进行了整理并且给出代码案例。主要内容在矩阵。如果真的想学matlab,我不认为有任何文档能够超过官方文档,请移步至官网,本篇说实话只是写出来给自己和学弟学妹作期末复习用的,没有任何学习价值。还是那句话,真想学明白,请看官方文档。
Matlab数据类型
- 数值
- 结构
- 元胞
- format
- 预定义变量
- 内存变量的管理
- 逻辑运算与关系运算
- 逻辑运算
- 关系运算
- 序列
- 矩阵
- 创建矩阵
- 特殊矩阵的创建
- 利用 M 文件或 TXT 文件建立矩阵
- 使用 `.m` 文件创建矩阵
- 使用 `.txt` 文件读取纯数据矩阵
- 矩阵切片
- MATLAB 中的矩阵切片(索引)操作
- 基本语法
- 矩阵运算
- 1. 基础算术运算符
- 2. 点运算符(逐元素操作)
- 3. 常用数学函数
- 4. 矩阵变换函数
- 5. 矩阵运算函数
- 6.向量内积/外积
- 7.其他函数
- 字符串
- 创建字符串以及字符串数组
- 字符函数
matlab默认显示运算结果,但在赋值语句后加分号只执行赋值操作
数值
双精度与单精度:double, single
符号整型与无符号整型:int8, unit8
实型与复型:real, imag
结构
structure
元胞
cell
% 注释
format
format 只影响输出格式不影响数据存储
代码 | 含义 |
---|---|
format | 显示小数点后4位 |
format long | 小数点后15位 |
format short e | 5位有效数字科学计数法 |
format long e | 16位有效数字科学计数法 |
format rat | 近似有理数 |
% 小数点后4位
>> format
>> pians =3.1416% 小数点后15位
>> format long
>> pians =3.141592653589793% 5位有效数字的科学计数法
>> format short e
>> pians =3.1416e+00% 16位有效数字的科学计数法
>> format long e
>> pians =3.141592653589793e+00% 近似有理数
>> format rat
>> pians =355/113
预定义变量
变量名 | 表示数值 |
---|---|
ans | 缺省变量名 |
pi | 圆周率 |
eps | 浮点运算的相对精度 |
inf | 正无穷 |
NaN | 不定值0/0 |
realmax/realmin | 最大/最小的浮点数 |
i,j | 虚数单位 |
nargin,nargout | 所用函数的输入/输出变量数目 |
>> 1ans =1>> pians =3.1416>> epsans =2.2204e-16>> infans =Inf>> NaNans =NaN>> realmaxans =1.7977e+308>> realminans =2.2251e-308>> ians =0.0000 + 1.0000i>> jans =0.0000 + 1.0000i
内存变量的管理
whos
, who
显示workspace中的变量名,clear
删除workspace中的所有变量
>> a=1,b=2a =1b =2>> who您的变量为:a b >> whosName Size Bytes Class Attributesa 1x1 8 double b 1x1 8 double>> clear
>> whos
>>
逻辑运算与关系运算
逻辑运算
运算符 | 含义 |
---|---|
& | 与 |
` | ` |
~ | 非 |
关系运算
运算符 | 含义 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
~= | 不等于 |
序列
% 从1开始到4结束每隔0.5取一个
>> 1:0.5:4ans =1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000% 从1开始到2结束一共有10个等差的数
>> linspace(1,2,10)ans =1.0000 1.1111 1.2222 1.3333 1.4444 1.5556 1.6667 1.7778 1.8889 2.0000% 从10^1开始到10^2结束一共有10个等比的数
>> logspace(1,2,10)ans =10.0000 12.9155 16.6810 21.5443 27.8256 35.9381 46.4159 59.9484 77.4264 100.0000
矩阵
matlab中的矩阵是按列存放的,也就是说你如果用序列创建矩阵,是一列一列依次填满的。
创建矩阵
方括号括起来表示矩阵,分号表示换行,同行元素间以空格或逗号隔开,矩阵元素可以是运算表达式
>> mat = [1 2 3 ; 4 5 6]mat =1 2 34 5 6
特殊矩阵的创建
函数 | 作用 |
---|---|
zeors(m,n) | 产生 m × n m\times n m×n零矩阵,方阵情况时可以省略第二个参数 |
zeros(size(A)) | 产生与矩阵A同样大小的零矩阵 |
eye(m,n) | 构建单位矩阵 |
ones(m,n) | 构建全1矩阵 |
randi([a, b], m, n) | 元素在[a, b]之间的 m × n m\times n m×n随机矩阵 |
>> zeros(3,4)ans =0 0 0 00 0 0 00 0 0 0>> eye(3,4)ans =1 0 0 00 1 0 00 0 1 0>> ones(3,4)ans =1 1 1 11 1 1 11 1 1 1>> randi([10,50], 5 ,5)ans =47 21 49 27 1115 32 49 47 4447 49 29 42 4835 49 42 49 3713 16 15 36 41
利用 M 文件或 TXT 文件建立矩阵
可以通过 .m
脚本文件或 .txt
文本文件创建较大、复杂的矩阵。这样做的好处是便于维护、复用或从外部导入数据。
使用 .m
文件创建矩阵
-
打开 MATLAB 自带的 Editor 或使用任意文本编辑器。
-
输入如下内容(定义一个矩阵
mymat
):% 文件名:mymatrix.m mymat = [1, 2, 3;4, 5, 6;7, 8, 9 ];
-
将文件保存为
mymatrix.m
,并确保保存在 MATLAB 当前工作目录中。>> mymatmymat =1 2 34 5 67 8 9
使用 .txt
文件读取纯数据矩阵
适用于数据文件中只包含纯数字(不含变量名)。
-
创建一个名为
mymatrix.txt
的文本文件,内容如下:1 2 3 4 5 6 7 8 9
-
在 MATLAB 中读取该文件内容为矩阵:
mymat = load('mymatrix.txt');
或使用更通用的函数:
mymat = readmatrix('mymatrix.txt');
矩阵切片
MATLAB 中的矩阵切片(索引)操作
矩阵的切片操作使用括号 ( , )
表示,其中:
- 前一部分表示 行的索引;
- 后一部分表示 列的索引;
- 可以使用数字、向量、冒号
:
、关键字end
等方式指定位置。
基本语法
A(i, j) % 取第 i 行第 j 列的元素
A(i, :) % 取第 i 行的所有列
A(:, j) % 取第 j 列的所有行
A(m:n, p:q) % 取第 m 到 n 行、第 p 到 q 列的子矩阵
A([1 3], [2 4]) % 取第 1、3 行 和第 2、4 列交叉形成的子矩阵
A(end, :) % 取最后一行的所有列
A(:, end-1:end) % 取最后两列的所有行
>> A = [1 2 3; 4 5 6; 7 8 9]A =1 2 34 5 67 8 9>> A(2, 3)ans =6>> A(1, :)ans =1 2 3>> A(:, 2)ans =258>> A(1:2, 2:3)ans =2 35 6>> A([1 3], [1 3])ans =1 37 9>> >> A(end, :)ans =7 8 9>> A(:, end-1:end)ans =2 35 68 9
矩阵运算
数的运算是矩阵运算的特例,所以一并包含在其中。
1. 基础算术运算符
运算符 | 含义 | 说明 |
---|---|---|
+ | 加法 | 元素逐项相加,要求维度一致 |
- | 减法 | 元素逐项相减,要求维度一致 |
* | 矩阵乘法 | 矩阵内积规则,A的列= B的行 |
/ | 右除 | A/B ≡ A * inv(B) |
\ | 左除 | A\B ≡ inv(A) * B |
^ | 矩阵幂 | A^n 为 n 次矩阵乘法 |
>> A = [1 2; 3 4], B = [5 6; 7 8]A =1 23 4B =5 67 8>> A + Bans =6 810 12>> A - Bans =-4 -4-4 -4>> A * Bans =19 2243 50>> A / Bans =3.0000 -2.00002.0000 -1.0000>> A / B * Bans =1 23 4>> A \ Bans =-3 -44 5>> A * (A \ B)ans =5 67 8>> A ^ 2ans =7 1015 22
2. 点运算符(逐元素操作)
运算符 | 含义 |
---|---|
.* | 元素乘法 |
./ | 元素右除 |
.\ | 元素左除 |
.^ | 元素幂 |
>> A = [1 2; 3 4], B = [5 6; 7 8]A =1 23 4B =5 67 8>> A .* Bans =5 1221 32>> A ./ Bans =0.2000 0.33330.4286 0.5000>> A .\ Bans =5.0000 3.00002.3333 2.0000>> A .^ 2ans =1 49 16
3. 常用数学函数
下述函数若作用于矩阵则是对每一元素进行的。
函数 | 说明 |
---|---|
sqrt(x) | 平方根 |
pow2(x) | 2的幂 |
log(x) | 自然对数 |
log2(x) | 2为底的对数 |
log10(x) | 10为底的对数 |
exp(x) | e为底的指数 |
sign(x) | 符号函数 |
mod(x,y) | 余数,x为负数时是向负数的余数 |
rem(x,y) | 余数,x为负数时是向正数的余数 |
round(x) | 四舍五入 |
floor(x) | 向下取整 |
ceil(x) | 向上取整 |
fix(x) | 向 0 方向取整 |
conj(x) | 复数共轭 |
real(x) | 复数实部 |
imag(x) | 复数虚部 |
abs(x) | 模 |
angle(x) | 相角 |
>> sqrt([4 9])ans =2 3>> pow2([1 2 3])ans =2 4 8>> log(exp(1))ans =1>> log2(8)ans =3>> log10(100)ans =2>> exp(1)ans =2.7183>> sign([-3 0 4])ans =-1 0 1>> mod(-7, 3)ans =2>> rem(-7, 3)ans =-1>> round(3.6)ans =4>> round(3.4)ans =3>> floor(3.6)ans =3>> ceil(3.2)ans =4>> fix(-3.7)ans =-3>> fix(3.7)ans =3>> conj(1+2i)ans =1.0000 - 2.0000i>> real(1+2i)ans =1>> imag(1+2i)ans =2>> abs(3+4i)ans =5>> angle(pi/4)ans =0
4. 矩阵变换函数
函数 | 说明 |
---|---|
transpose(A) 或 A.' | 非共轭转置 |
fliplr(A) | 左右翻转 |
flipud(A) | 上下翻转 |
flipdim(A,1) | 将矩阵按第一个维度进行翻转 |
rot90(A) | 旋转90度 |
diag(A) | 对角矩阵 |
rref(A) | 最简行阶梯形矩阵 |
tril(A) | 下三角矩阵 |
triu(A) | 上三角矩阵 |
reshape(A,m,n) | 将矩阵A重新排成 m × n m\times n m×n的矩阵 |
>> A = [1 2; 3 4]A =1 23 4>> transpose(A)ans =1 32 4>> A.'ans =1 32 4>> fliplr(A)ans =2 14 3>> flipud(A)ans =3 41 2>> flipdim(A, 1)ans =3 41 2>> flipdim(A, 2)ans =2 14 3>> rot90(A)ans =2 41 3>> diag(A)ans =14>> rref(A)ans =1 00 1>> tril(A)ans =1 03 4>> triu(A)ans =1 20 4>> reshape(A, 1, 4)ans =1 3 2 4
5. 矩阵运算函数
函数 | 含义 |
---|---|
det(A) | 行列式 |
inv(A) | 逆矩阵 |
rank(A) | 矩阵秩 |
trace(A) | 对角线元素之和 |
norm(A) | 矩阵范数 |
cond(A) | 矩阵条件数 |
[V,D]=eig(A) | 矩阵的特征值分解,V 表示特征向量,D 表示特征值 |
[Q,R]=qr(A) | 矩阵的QR分解 |
[L,U]=lu(A) | 矩阵的LU分解 |
>> det([1 2; 3 4])ans =-2>> inv([1 2; 3 4])ans =-2.0000 1.00001.5000 -0.5000>> rank([1 2; 2 4])ans =1>> trace([1 2; 3 4])ans =5>> norm([3 4])ans =5>> cond([1 2; 3 4])ans =14.9330>> [V,D] = eig([1 2; 3 4])V =-0.8246 -0.41600.5658 -0.9094D =-0.3723 00 5.3723>> [Q,R] = qr([1 2; 3 4])Q =-0.3162 -0.9487-0.9487 0.3162R =-3.1623 -4.42720 -0.6325>> [L,U] = lu([1 2; 3 4])L =0.3333 1.00001.0000 0U =3.0000 4.00000 0.6667
6.向量内积/外积
函数 | 主要作用 |
---|---|
dot | 点积 |
cross | 叉积 |
>> dot([1 2 3], [4 5 6])ans =32>> cross([1 2 3], [4 5 6])ans =-3 6 -3
7.其他函数
函数 | 主要作用 | 向量行为 | 矩阵行为(默认) |
---|---|---|---|
min/max | 极值 | 单值 | 每列最值 |
mean | 平均值 | 单值 | 每列均值 |
median | 中位数 | 单值 | 每列中位数 |
std | 标准差 | 单值 | 每列标准差 |
diff | 相邻差分 | 长度减1 | 每列差分 |
sort | 升序排序 | 排序向量 | 每列排序 |
sum | 求和 | 总和 | 每列求和 |
prod | 乘积 | 累乘 | 每列累乘 |
cumsum | 累加和 | 向量累加 | 每列累加 |
cumprod | 累乘积 | 向量累乘 | 每列累乘 |
length | 最大维长度 | 向量长度 | 二维矩阵为max(行,列) |
size | 维度信息 | [1,n] | [m,n] |
norm | 向量/矩阵范数 | L2 范数 | 谱范数(最大奇异值) |
>> A = reshape(1:16, 4, 4)A =1 5 9 132 6 10 143 7 11 154 8 12 16>> min(A)ans =1 5 9 13>> max(A)ans =4 8 12 16>> mean(A)ans =2.5000 6.5000 10.5000 14.5000>> median(A)ans =2.5000 6.5000 10.5000 14.5000>> std(A)ans =1.2910 1.2910 1.2910 1.2910>> diff(A)ans =1 1 1 11 1 1 11 1 1 1>> sort(A)ans =1 5 9 132 6 10 143 7 11 154 8 12 16>> sum(A)ans =10 26 42 58>> prod(A)ans =24 1680 11880 43680>> cumsum(A)ans =1 5 9 133 11 19 276 18 30 4210 26 42 58>> cumprod(A)ans =1 5 9 132 30 90 1826 210 990 273024 1680 11880 43680>> length(A)ans =4>> size(A)ans =4 4>> norm(A)ans =38.6227
字符串
创建字符串以及字符串数组
单引号将内容括起来表示一个字符串,以ASC2码存储。
% 创建字符串
a = 'ABC'
% 创建字符串数组,不可以使用单引号,否则输出会是字符串
>> a = ["hello" "word"]a = 1x2 string 数组"hello" "word">> a = ['hello', 'word']a ='helloword'
字符函数
函数 | 含义 |
---|---|
abs('ABC') | 返回字符串中每个字符的 ASCII 码(与 double 等价) |
double('ABC') | 返回字符串中每个字符的 ASCII 码 |
char([65 66 67]) | 将 ASCII 数字转换为对应字符,结果为 'ABC' |
int2str(123) | 将整数转换为字符串 '123' |
num2str(3.14) | 将数值(整数或浮点数)转换为字符串 '3.14' |
str2num('1.23 4.56') | 将字符串解析为数值向量 [1.23 4.56] |
strcat('ab', 'cd') | 字符串拼接,结果为 'abcd' ,自动去除尾部空格 |
strvcat('abc', 'defg') | 垂直拼接字符矩阵,按最大长度补空格 |
strcmp('abc','abc') | 比较字符串是否完全相同,返回 1 (true)或 0 (false) |
strncmp('abcdef','abcxyz',3) | 比较字符串前3个字符是否相同,返回逻辑值 |
strrep('cat','a','o') | 将字符串中的 'a' 替换为 'o' ,结果为 'cot' |
strmatch('he', ['hello','hero','hi']) | 返回所有以 'he' 开头的字符串索引 |
eval() | 将字符串理解为代码执行 |
>> abs('A')ans =65>> double('A')ans =65>> char(65)ans ='A'>> int2str(123)ans ='123'>> num2str(3.14)ans ='3.14'>> str2num('1.23 4.56')ans =1.2300 4.5600>> strcat('ab', 'cd')ans ='abcd'>> strcat('ab', 'cd ')ans ='abcd'>> strvcat('abc', 'defg')ans =2x4 char 数组'abc ''defg'>> strcmp('abc', 'abc')ans =logical1>> strcmp('abc', 'ab')ans =logical0>> strncmp('abcdef', 'abcxyz', 3)ans =logical1>> strncmp('abcdef', 'abcxyz', 4)ans =logical0>> strrep('cat', 'a', 'o')ans ='cot'>> strmatch('he', 'hi')ans =[]>> strmatch('he', 'he')ans =1>> strmatch('he', ["he" "him"; "s" "hem"])ans =14>> strmatch('he', ["hello";"hero";"hi"])ans =12>> eval("a=2")a =2