MatLab之数组篇续

数组篇续


编写过程的一些注意事项

MATLAB的搜索路径

在MATLAB中,当输入一个变量名时,MATLAB会按照先看赋值——>内部函数——>程序文件(先看当前的文件夹下的,在看搜索路径中的),例如如果我们先给定义sin=[4 2 3],则此时的sin(1)=4,若要使用sin函数,则只能在右侧工作区将sin的赋值删除


MATLAB的数据类型

数据类型有整型、浮点型、复数型

(1)整型分有无符号,再分位数:8,16,32,64,格式为int8(),int16()等,无符号则为uint8(),要注意的是若类型转换时超出对应类型的最大值,则以其类型的最大值输出

1
2
3
4
5
6
>> x = int8(129)
x =
127
>> x = uint8(129)
x =
129

(2)浮点型由函数single()、double()转换

(3)复数型实部和虚部默认双精度型,虚数单位为 i 或 j ,要注意的是在输入时虚部与 i 之间可以不加乘号,在 i 被赋值时,加乘号则为乘以赋的值,不加则作为虚数单位,如下:

1
2
3
4
5
6
7
>> i = 2;
>> 2+2*i
ans =
6
>> 2+2i
ans =
2.0000 + 2.0000i

改变数值数据的输出格式

format命令格式:format 格式符,这会改变后面所有的输出格式

切记:format只改变了输出的格式,不影响数据的计算和存储,在MATLAB中数值默认为双精度型,且不加函数就无法在计算中被改变,毕竟数学计算的精确度重要性…


常用函数

注:函数对矩阵的运算是分别作用与矩阵的每一个元素上,最后得到一个矩阵,单个数其实就是1x1矩阵

  • 三角函数:分为以弧度为单位和以角度为单位,角度的在函数名后加个”d”,如sin(pi/2)=sind(90)=1

  • **abs函数:**用于求实数绝对值、复数的模、字符串的ASCII值

  • 求余和整除:求余函数为rem()或mod();由于数值都是默认浮点型,因此< / >无法直接做整除,一般情况下我们使用fix()函数取整来完成整除

  • 取素数:写作 isprime(x),是素数的为1,不是则为0,将每个元素都判完后,得到一个由0和1组成的矩阵,与x的阶数相同且对应

  • find函数:写作find(x),将矩阵x中的非0元素按照一定顺序组成一个新矩阵y,规则如下:

    ​ 1)若x为行向量,则新矩阵y也为行向量,从x中取出的数次序不变

    ​ 2)若x为列向量或普通矩阵,则以以元素单下标排序,得到一个列向量


矩阵中每个元素的标识

分为全下标(index)和单下标(linear index)

  • 全下标:即我们所学的(i ,j)元
  • 单下标:把二维数组所有列从左至右首尾相接连成的一个一维数组,每个元素的位置即单下标,也可称为序号

这个“标识”是MATLAB在对矩阵的每个元素进行操作时的顺序,例如reshape()函数,在重塑矩阵形状时就根据每个元素的单下标来进行排序,其实这个函数的运行过程肢解开就是先把一个矩阵给化为列向量,再依次填到新矩阵的位置上。

1
2
3
4
5
6
7
8
9
10
A =
6 3 7 0
7 6 0 0
7 1 2 8
>> reshape(A,4,3)
ans =
6 6 2
7 1 0
7 7 0
3 0 8

这里可以清楚的看到第一列6,7,7后是3,说明3是单下标第四位。


如何选中矩阵中的某部分

  • A为任意矩阵,则我们用A(m,n)来表示A的第m行第n列的元素
  • 用A(m)表示序号为m的元素
1
2
3
4
5
6
7
A =
0 7 1
3 3 6
1 5 2
>> A(2,3)
ans =
6

上面就选出了A中的第二行第三列的元素“6”,但我们如果要选中某一行(列)要如何操作呢,MATLAB中用冒号< : >表示选中所有行(列)

1
2
3
4
5
6
7
8
9
A =
5 4 0
9 1 7
0 9 8
>> A(:,2)
ans =
4
1
9

上面我们用< : >先选中所有行再选取第二列就得到我们想要的A的第二列,行同理。

1
2
3
4
5
6
7
A =
4 7 4
3 1 6
7 4 7
>> A(6)
ans =
4

上面我们看到用序号(单下标)的方式直接选出了(3,2)位置的“4”


字符串处理

字符串用单引号< ‘ ‘ >括起来,若字符串中有单引号则应该打两个

字符串矩阵组成

字符串矩阵只能包含字符型(char),得到char数组,若单打数字则会被转换为对应ASCII码值的字符

1
2
3
4
5
6
7
8
9
10
11
12
13
>> ['123456' ;'abcdef' ]
ans =
2×6 char 数组
'123456'
'abcdef'
>> ['123456' 65;'abcdef' 66]
ans =
2×7 char 数组
'123456A'
'abcdefB'
>> ans(2,4)
ans =
'd'

注意:字符串矩阵同样也要行列对齐,字符串内每个字符对应矩阵中相应位置元素

字符串操作函数

  • eval()——将字符串的单引号去掉,变为真实运算

    1
    2
    3
    4
    5
    6
    >> a='sind(90)'
    a =
    'sind(90)'
    >> eval(a)
    ans =
    1
  • abs()和double()——把字符串矩阵化成对应ASCII码值矩阵

  • char()——把ASCII码值矩阵转换为字符串矩阵

    1
    2
    3
    4
    5
    6
    7
    >> I='DSC';
    >> abs(I)
    ans =
    68 83 67
    >> char(ans+32)
    ans =
    'dsc'

字符串查找与替换

  • findstr(s1,s2):得到某一字符串在大字符串中的开始位置,一定是短的在长的中的位置

  • strrep(s1,s2,s3):把字符串s1的字符串s2换成s3

    1
    2
    3
    4
    5
    6
    7
    >> a='I am DSC';
    >> b=findstr(a,'DSC')
    b =
    6
    >> strrep(a,'DSC','dsc')
    ans =
    'I am dsc'

矩阵的修改

  • 部分替换:

    1
    2
    3
    A(2,3) = 4   		#某个元素的替换
    A(1,:) = [1 2 3] #某行(列)替换,元素个数不变
    A(:,1) = [] #删除某行(列)
  • 指定维数拼接:

    1
    2
    3
    cat(1,a,b)	#竖着拼
    cat(2,a,b) #横着拼
    cat(3,a,b) #三维拼接,按z轴拼,a在前层,b在后层

数据转换

MATLAB中用< _ _ _ _2_ _ _ _ >来表示数据转换,如num2str , 将数字转换成字符串 ; dec2hex,十进制变十六进制

1
2
3
4
5
6
7
8
A =
1 2 3 4
>> B = num2str(A)
B =
'1 2 3 4' #字符之间有两个空格
>> abs(B)
ans =
49 32 32 50 32 32 51 32 32 52

与线代相关的矩阵操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
diag(A)	% 对角阵
triu(A) % 只保留A的上三角部分
tril(A) % 下三角部分
A =
7 6 1
7 6 4
2 1 9
triu(A) =
7 6 1
0 6 4
0 0 9
inv(A) % 逆矩阵,前提要可逆
pinv(A) % 得到广义逆矩阵,A可逆时与inv()相同
det(A) % 行列式
rank(A) % 秩
rref(A) % 化为行最简形,可得到极大无关组

方阵特征值与二次型

1
2
3
4
5
6
7
8
9
10
11
% 特征值
f = poly(A) % 特征方程
eig(A) % 特征值
[P,D] = eig(A) % P:是特征向量组合,已单位化;
% D:对应特征值组成的对角阵
x = null(A) % Ax=0的基础解系,可以用于求(λE-A)的对应特征向量
trace(A) % 求迹
% 二次型标准化
[P,T] = schur(A) % A必为实对称阵,得到结果与eig相同
% 二次型正定判断
[R,flag] = chol(A) % 正定则flag=0