1.数值数据类型的分类
single表示单精度浮点型
>> class(4)
ans =
'double'//整数的数据类型为double,即双精度浮点型
>> class(single(4))//强制转换数据类型为single
ans =
'single'
复型数据
即复数,包括实部和虚部两部分。实部和虚部默认双精度浮点型,虚数单位用i或j表示。
real函数:求复数的实部
imag函数:求复数的虚部
>> real(6+5i)
ans =
6
>> imag(6+5i)
ans =
5
2.format命令
format命令只会影响数据的输出格式,并不影响数据的计算和存储
format命令的格式为:
f
o
r
m
a
t
+
格
式
符
(
如
l
o
n
g
,
s
h
o
r
t
)
format+格式符(如long,short)
format+格式符(如long,short)
>> format long //格式符为long
>> 50/3
ans =
16.666666666666668
>> 30/4
ans =
7.500000000000000
//会发现long的输出形式会保留很多位小数
>> format//再输入format表示恢复到默认输出状态
>> 30/4
ans =
7.5000
>> 50/3
ans =
16.6667
//Matlab在默认状态下只输出4位小数
3.常用数学函数
exp函数:计算en
>> A = [1,2;3,4;5,6]//一个3行2列的矩阵
A =
1 2
3 4
5 6
>> B = exp(A)
B = //B也是一个3行2列的矩阵
1.0e+02 *
0.027182818284590 0.073890560989307
0.200855369231877 0.545981500331442
1.484131591025766 4.034287934927351
三角函数
三角函数在Matlab中默认是以弧度值为单位的,若要以角度值为单位,则要在函数名称后加上"d"以示区别
>> sin(pi/2)
ans =
1
>> sind(90)//加上"d"表示以角度值为单位
ans =
1
abs函数
abs函数可以求实数的绝对值,复数的模,字符串的ASCII码值
>> abs(-9)
ans =
9
>> abs(6+2i)
ans =
6.3246
>> abs('abc')
ans =
97 98 99
取整函数round fix ceil floor
round:四舍五入取整
fix:向靠近0的方向取整
ceil:向较大的取整,即向上取整
floor:向较小的取整,即向下取整
>> round(-3.5)
ans =
-4
>> fix(-3.9)
ans =
-3
>> ceil(-3.9)
ans =
-3
>> floor(-3.4)
ans =
-4
取余函数rem(num1,num2)
取余函数的计算为:num1/num2的余数
>> rem(20,3)
ans =
2
4.函数应用举例
求一个千位数字的个位十位百位千位数字
原理:不断前移小数点并舍弃小数点后的小数(用floor函数向下取整)然后除以10取余
>> m = 4456;
>> m1 = rem(m,10);//个位
>> m2 = rem(floor(m/10),10);//十位
>> m3 = rem(floor(m/100),10);//百位
>> m4 = floor(m/1000);//千位
m1 =
6
>> m2
m2 =
5
>> m3
m3 =
4
>> m4
m4 =
4
求[1, 100]间所有素数
Matlab有专门查找素数的isprime函数,若为素数,函数返回值为1;若不为素数,函数的返回值为0
>> isprime(1)
ans =
logical
0
>> isprime(2)
ans =
logical
1
要将返回值不为0的数即素数全部找出来,还需要一个专门用来查找非零数的find函数。find函数不仅能找到非零的数,并且在向量和矩阵中还能找到该非0元素的位置。
>> find(0)
ans =
[]
>> find(-1)
ans =
1
由于find函数通常作用在向量或者矩阵中,所以我们要初始化一个向量,例如下面这样:
>> x = 1:10
x =
1 2 3 4 5 6 7 8 9 10
最后的程序如下:
>> x = 1:100;//初始化一个向量x,取值从1到100的整数
>> k = isprime(x);//查找1到100的素数
>> k1 = find(k);//将所有素数的位置找到
>> p = x(k1)//位置对应的向量元素即为素数
p =
1 至 15 列
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
16 至 25 列
53 59 61 67 71 73 79 83 89 97
5.Matlab变量的管理
Matlab变量我们可以在工作区右键点击变量来对其进行删除或者改变其值、重命名等操作。
如果某些变量我们要多次利用,可以将其保存到内存变量文件中,其扩展名为.mat,也叫MAT文件
比如有两个变量a和m,我想下次重新打开Matlab时直接调用者两个变量,就可以先将他们保存进一个MAT变量中
>> save madata a m //madata是自己命名的一个MAT文件,执行save命令即可将这两个变量存储进该文件中
当下次重新打开Matlab后,输入load madata
回车即可加载a和m变量
最后强调一下Matlab中变量命名的规范:以字母开头,后接字母、数字或下划线字符序列。
6.矩阵的建立
利用已建好的矩阵建立更大的矩阵
要注意的是,构成大矩阵的小矩阵,其行数和列数必须相同
>> A = [12,11,10;1,2,3];//2行3列
>> B = [1,2,3;4,5,6]; //同样也是2行3列
>> C = [A,B;B,A]
C =
12 11 10 1 2 3
1 2 3 4 5 6
1 2 3 12 11 10
4 5 6 1 2 3
利用实部矩阵和虚部矩阵构成复数矩阵
同样,实部矩阵和虚部矩阵的行数列数也要必须相同
>> B = [1,2,3;4,5,6]; //2行3列
>> C = [2,3,4;5,6,7]; //同样也是2行3列
>> A = C + i * B
A =
2.0000 + 1.0000i 3.0000 + 2.0000i 4.0000 + 3.0000i
5.0000 + 4.0000i 6.0000 + 5.0000i 7.0000 + 6.0000i
7.向量的建立
向量是特殊的矩阵,向量可以被看做是1行多列的矩阵
冒号表达式
e
1
:
e
2
:
e
3
e1 : e2 : e3
e1:e2:e3
e1为初始值,e3为终止值,e2为步长(即相邻两元素的差值)
e2可以省略不写,如果省略则Matlab默认步长为1
>> 1:5 //省略e2,默认步长为1
ans =
1 2 3 4 5
>> 1:1:5
ans =
1 2 3 4 5
linspace函数
Matlab中专门有函数来表示向量,即linspace函数。其格式为:
l
i
n
s
p
a
c
e
(
a
,
b
,
n
)
linspace(a, b, n)
linspace(a,b,n)
a为第一个元素,b为最后一个元素,n为元素总数
n也可以默认不写,但默认不写Matlab默认元素总数为100个
>> linspace(0, pi, 5)
ans =
0 0.7854 1.5708 2.3562 3.1416
8.结构矩阵和单元矩阵
结构矩阵
由结构数据构成的矩阵叫结构矩阵。结构矩阵中的每个元素a(1) a(2) a(3)可以有多个不同值类型的成员x1 x2 x3,这样 “1元素——多成员” 就是一个结构数据类型,也可以说每个元素就是一个结构数据类型。
就好比有多个学生a(1) a(2) a(3),每个学生都有姓名x1、学号x2、班级x3等信息,在这里学生就是矩阵里的元素,学生的不同信息就是元素的成员。
结构矩阵格式为:
结
构
矩
阵
元
素
.
成
员
名
=
表
达
式
结构矩阵元素.成员名 = 表达式
结构矩阵元素.成员名=表达式
>> a(1).x1 = 10; a(1).x2 = 'liu'; a(1).x3 = [11,21;23,45];
>> a(2).x1 = 12; a(2).x2 = 'lou'; a(2).x3 = [21,31;13,35];
>> a(3).x1 = 13; a(3).x2 = 'yat'; a(3).x3 = [10,9;12,31]
a =
包含以下字段的 1×3 struct 数组:
x1
x2
x3
单元矩阵
单元矩阵和一般矩阵类似,只是要用大括号括起来
>> load('matlab.mat')
>> b = {12,'a',[1,2;3,4];10,'b',[2,3;4,5];8,'c',[0,1;2,3]}
b =
3×3 cell 数组
{[12]} {'a'} {2×2 double}
{[10]} {'b'} {2×2 double}
{[ 8]} {'c'} {2×2 double}
9.矩阵元素的引用
矩阵元素引用的基本格式为:
A
(
d
)
或
A
(
i
,
j
)
A(d)或A(i,j)
A(d)或A(i,j)
A(d) | A(i,j) | |
---|---|---|
表示内容 | A矩阵中的单个元素 | A矩阵中的单个元素或A的子矩阵 |
符号内容 | 只能为数字 | 可以为数字,可以为冒号表达式或者[,]表达式 |
符号含义 | 矩阵元素的序号 | i:矩阵元素的行号或者子矩阵包括的行号;j:矩阵元素的列号或者子矩阵包括的列号 |
相互转换 | d转i, j:int2sub函数[ | i, j转d:sub2ind函数 |
A(d)的表示类型
Matlab中存储矩阵是按照“先列后行”的顺序,从上往下存储的。
A =
2 3 4 0 0 0
5 6 7 0 0 10
>> A(5)
ans =
4 //矩阵中第5个元素是4,位于第1行第3列
但通常情况下Matlab代码如果要表示矩阵的行和列,通常是“行在前,列在后”,这与Matlab存储矩阵的顺序相反,所以要实现行列数向序号的转换,需要调用sub2ind函数。
D = sub2ind(size(A), I, J)
sub2ind函数的格式为:
D
=
s
u
b
2
i
n
d
(
s
i
z
e
(
A
)
,
I
,
J
)
D = sub2ind(size(A), I, J)
D=sub2ind(size(A),I,J)
I、J、D为矩阵。I矩阵中所有的元素为矩阵A中某些元素的行下标;J矩阵中所有的元素为矩阵A中某些元素的列下标。
矩阵D的行数和列数取决于矩阵I和矩阵J的行列数,所以矩阵I,矩阵J的行列数必须相同。
A =
2 3 4 0 0 0
5 6 7 0 0 10
>> D = sub2ind(size(A),[1;2],[3;4]/*第1行第3列的元素,
与第2行第4列的元素。*/)
D =
5
8
//I,J矩阵均为两行一列,所以D矩阵也为两行一列
A(i, j)的表示类型
(1)i, j为数字
如果i或者j大于原来矩阵的行数和列数,那么Matlab将自动扩展原来的矩阵,并将扩展后没有赋值的元素设置为0
>> A = [1,2,3;4,5,6];
>> A(4,5) = 10 //矩阵A只有2行3列
A =
1 2 3 0 0
4 5 6 0 0
0 0 0 0 0
0 0 0 0 10
//除了原来的2行3列和赋值的A(4,5),其余都为0
(2)i, j为冒号表达式或[,]表达式
冒号表达式
m:n表示从第m行(列)到第n行(列),取所有元素
m:w:n表示从第m行(列)到第n行(列),取每隔w-1行(列)的所有元素
:表示取所有行(列)的元素
>> A = [1,2,3,4;5,6,7,8;9,0,0,0];
>> A(1:3, :)
ans =
1 2 3 4
5 6 7 8
9 0 0 0
>> A(1:2:3,2:4)
ans =
2 3 4
0 0 0
[,]表达式
[m,n]表示取第m行(列)和第n行(列)的所有元素
>> A = [1,2,3,4;5,6,7,8;9,0,0,0];
>> A(1:2:3,[2,4])
ans =
2 4
0 0
end运算符
end放在行就表示最后一行;放在列就表示最后一列
>> A = [1,2,3,4;5,6,7,8;9,0,0,0];
>> A(end,:)//最后一行的所有元素
ans =
9 0 0 0
>> A([1,3],2:end)//第1行和第3行中,第2列到最后一列的所有元素
ans =
2 3 4
0 0 0
(3)[I, J] = int2sub(S, D)
有时候需要把A(i, j)转化为A(d)格式,这时候就需要调用int2sub函数。int2sub函数的格式为:
[
I
,
J
]
=
i
n
t
2
s
u
b
(
S
,
D
)
[I, J] = int2sub(S, D)
[I,J]=int2sub(S,D)
D为某元素的序号
当S为具体的矩阵时:
>> A = [1,2,3,4;5,6,7,8;9,0,0,0];
>> [I,J] = ind2sub(size(A),7)//矩阵A中第7个元素
I =
1
J =
3
//第7个元素位于第1行第3列
当S为没有具体元素的矩阵时:
>> [I,J] = ind2sub([3,3],[1,3,5])
//[3,3]表示该矩阵为一个3行3列的矩阵,但没有具体元素
//[1,3,5]分别表示该[3,3]矩阵中第1、第3、第5个元素
I =
1 3 2
J =
1 1 2
//第1、第3、第5个元素分别位于矩阵的:第1行第1列;第3行第1列;第2行第2列
利用空矩阵"[]"删除元素
我们可以将矩阵中的元素赋值为空矩阵"[]",即可删除该元素。赋值为空矩阵的操作也叫空赋值。
值得注意的是,空赋值至少要有一个冒号索引。例如A(:,[2,3]) = [],等号左边的式子有一个冒号表达式。
>> A = [1,2,3,4;5,6,7,8;9,0,0,0];
>> A([1,3],4) = []
空赋值只能具有一个非冒号索引。
>> A(:,[1,3]) = []//空赋值有一个冒号索引
A =
2 4
6 8
0 0
>> A(:,1:1:3) = []//空赋值有2个冒号索引
A =
4
8
改变矩阵的形状
B = reshape(A, m, n)
在矩阵总元素保持不变的情况下,将矩阵A重新排列成m行n列的矩阵。改变后矩阵中元素的序号仍然不变。
A =
2 4
6 8
0 0
>> B = reshape(A, 2, 3)//重新排列成2行3列的矩阵
B =
2 0 8
6 4 0
//改变后矩阵中元素的序号不变,比如元素“8”在矩阵A和矩阵B的序号都是5
B = A(😃 😃😃😃😃
A(:)即把矩阵A中所有元素堆叠起来,成为一个列向量
A =
2 4
6 8
0 0
>> B = A(:)
B =
2
6
0
4
8
0