基本运算及字符串处理
6.MATLAB基本运算
l 算术运算
l 关系运算
l 逻辑运算
针对矩阵而言的,也有针对矩阵元素的运算。
1.算术运算
(1)基本算术运算
基本算术运算符:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)。
l MATLAB的算术运算是在矩阵意义下进行的。
l 单个数据的算术运算只是矩阵运算的一种特例
加减运算
l 若两矩阵同型,则运算时两矩阵的相应元素相加减。
l 若两矩阵不同型,则MATLAB将给出错误信息。
l 一个标量也可以和矩阵进行加减运算,这时把标量和矩阵的每一个元素进行加减运算。
乘法运算
l 矩阵A和B进行乘法运算,要求A的列数与B的行数相等,此时则称A、B矩阵是可乘的,或称A和B两矩阵维数和大小相容。
l 如果两者的维数或大小不相容,则将给出错误信息,提示用户两个矩阵是不可乘的。
除法运算
在MATLAB中,有两种矩阵除法运算:右除/和左除\。表示两种不同的除数矩阵和被除数矩阵。
如果A矩阵是非奇异方阵,则B/A等效于B*inv(A)【A矩阵的逆右乘B矩阵】,A\B等效于inv(A)*B【A矩阵的逆左乘B矩阵】。
>> A=[1,2,3;4,2,6;7,4,9];
>> B=[4,3,2;7,5,1;12,7,92];
>> C1=B/A
C1 = -0.1667 -3.3333 2.5000
-0.8333 -7.6667 5.5000
12.8333 63.6667 -36.5000
>> C2=A\B
C2 = 0.5000 -0.5000 44.5000
1.0000 0.0000 46.0000
0.5000 1.1667 -44.8333
结果不相同,对于含有标量的运算,除法运算结果相同。
>> 3/4
ans = 0.7500
>> 4\3
ans = 0.7500
>> a=[10.5,25]
a = 10.5000 25.0000
>> a/5
ans = 2.1000 5.0000
>> 5\a
ans = 2.1000 5.0000
乘方运算
一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量。
>> A=[1,2,3;4,5,6;7,8,0];
>> A^2
ans = 30 36 15
66 81 42
39 54 69
(2)点运算
l 点运算符:.*、./、.\和.^。
l 两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵同型。
>> A=[1,2,3;4,5,6;7,8,9];
>> B=[-1,0,1;1,-1,0;0,1,1];
>> C=A.*B //两个矩阵对应元素做乘法运算
C = -1 0 3
4 -5 0
0 8 9
>> D=A*B //矩阵意义下的乘法运算。
D = 1 1 4
1 1 10
1 1 16
例1 当x=0.1、0.4、0.7、1时,分别求y=sin x cos x的值。
x=0.1:0.3:1;
y=sin(x).*cos(x) //必须为点乘运算 x为向量,sinxcosx为通长度的向量
2.关系运算 通常用来表示条件
l 关系运算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)。
l 当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。
>> 3>4
ans = 0
>> x=5 //赋值
x = 5
>> x==5 //关系运算
ans = 1
l 当参与比较的量是两个同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成。
l 当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成。
例2 建立3阶方阵A,判断A的元素是否为偶数。
>> A =[24,35,13;22,63,23;39,47,80]
A = 24 35 13
22 63 23
39 47 80
>> P=rem(A,2)==0 //每个元素除以2的余数矩阵
P = 1 0 0
1 0 0
0 0 1
3.逻辑运算
逻辑运算符:&(与)、|(或)和~(非)。
设参与逻辑运算的是两个标量a和b,那么运算规则为:
l a&b a、b全为非零时,运算结果为1,否则为0。
l a|b a、b中只要有一个为非零时,运算结果为1 。
l ~a 当a为零时,运算结果为1;当a为非零时,运算结果为0。、
例:
>> 3<4 & 6>5
ans = 1
>> ~(9==1)
ans = 1
>> ~9==1
ans = 0
算数优先级问题:算数运算的优先级最高,逻辑运算优先级最低,但逻辑非运算是单目运算,他的优先级比双目运算要高。
l 若参与逻辑运算的是两个同型矩阵,那么将对矩阵相同位置上的元素按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由1或0组成。
l 若参与逻辑运算的一个是标量,一个是矩阵,那么将在标量与矩阵中的每个元素之间按标量规则逐个进行运算,最终运算结果是一个与矩阵同型的矩阵,其元素由1或0组成
例3 水仙花数是指各位数字的立方之和等于该数本身的三位正整数。求全部水仙花数。
m=100:999;
m1=rem(m,10); //个位
m2=rem(fix(m/10),10); //十位
m3=fix(m/100); //百位
k=find(m==m1.*m1.*m1+m2.*m2.*m2+m3.*m3.*m3) //序号
k =
54 271 272 308
s=m(k)
s =
153 370 371 407
1.7字符串处理
分为数值型数据和字符型数据(字符串数据)
l 字符串的表示
l 字符串的操作
1.字符串的表示
在MATLAB中,字符串是用单引号括起来的字符序列。
>> xm='Central South University'
>> xm(1:3) //一个字符串当做行向量,每个元素对应一个字符。取1-3个字符
ans = Cen
若字符串中的字符含有单引号,则该单引号字符要用两个单引号来表示。
>> 'I''m a teacher.'
ans = I'm a teacher.
建立多行字符串,形成字符串矩阵。
>> ch=['abcdef';'123456'];
>> ch(2,3) //第二行第三列的元素
ans = 3
例题:
建立一个字符串向量,然后对该向量做如下处理: ① 取第1~5个字符组成的子字符串。 ② 将字符串倒过来重新排列。 ③ 将字符串中的小写字母变成相应的大写字母,其余字符不变。 ④ 统计字符串中小写字母的个数。
>> ch='ABc123d4e56Fg9';
>> subch=ch(1:5)
subch = ABc12
>> revch=ch(end:-1:1) //步长为-1,最后一个字符到第一个字符
revch = 9gF65e4d321cBA
>> k=find(ch>='a'&ch<='z') //find找字母位置
k = 3 7 9 13
>> ch(k)=ch(k)-('a'-'A') //小写转大写差32 k为向量
ch = ABC123D4E56FG9
>> length(k) //统计向量k的个数
ans = 4
2.字符串的操作
(1) 字符串的执行
字符串的内容作为对应的matlab命令来执行。
>> t=pi;
>> m='[t,sin(t),cos(t)]';
>> y=eval(m) //调用eval函数 向量赋给变量y
y = 3.1416 0.0000 -1.0000
2)字符串与数值之间的转换
abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵。
char函数可以把ASCII码矩阵转换为字符串矩阵。
>> s1='MATLAB';
>> a=abs(s1)
a = 77 65 84 76 65 66
>> char(a+32)
ans = matlab
(3)字符串的比较
字符串的比较有两种方法:利用关系运算符或字符串比较函数。
l 关系运算符比较:两个字符串里的每个字符依次按ASCII值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0。 (两个字符串拥有相同的长度时)
>> 'www0'>='W123'
ans = 1 1 1 0
l 字符串比较函数用于判断字符串是否相等,有4种比较方式,函数如下:
strcmp(s1,s2):用来比较字符串s1和s2是否相等,如果相等,返回结果为1,否则 返回0。
strncmp(s1,s2,n):用来比较两个字符串前n个字符是否相等,如果相等,返回1,否则返回0。
strcmpi(s1,s2):在忽略字母大小写前提下,比较字符串s1和s2是否相等,如果相 等,返回1,否则返回0。
strncmpi(s1,s2,n):在忽略字符串大小写前提下,比较两个字符串前n个字符是否相等,如果相等,返回1,否则返回0。
>> strcmp('www0', 'w123')
ans = 0
>> strncmpi('Www0','w123',1)
ans = 1
(4)字符串的查找与替换
findstr(s1,s2):返回短字符串在长字符串中的开始位置。
strrep(s1,s2,s3):将字符串s1中的所有子字符串s2替换为字符串s3。
>> p=findstr('This is a test!','is')
p = 3 6
>> p=findstr('is','This is a test!')
p = 3 6
>> result=strrep('This is a test!','test','class')
result = This is a class!