Matlab教程笔记:第二章(下)

"Matlab语言基础"

Posted by jhljx on June 2, 2016

目录

Matlab的字符串及其运算
Matlab字符串函数和二维字符串
Matlab绘图入门
Matlab绘图属性的控制
图形窗口菜单及其对数坐标
Reference

Matlab的字符串及其运算

Matlab中的字符串用单引号引起来,实质上字符串为字符数组,单个元素为字符。Matlab中的字符为ASCII编码

字符串可以用单引号和数组法两种方法生成。例如:

  • str1 = 'hello world'
  • str2 = ['h' 'e' 'l' 'l' 'o ' 'w' 'o' 'r' 'l' 'd']
  • str3 = 'I''m a student',字符串中两个单引号表示一个引号,一个成对的引号中间部分为字符串的内容

Matlab中还有一些字符串处理函数,常见的几个函数如下:

  • abs(c)实际上是返回一个数组中每个元素的绝对值,因为Matlab中的字符为ASCII编码,所以可以把字符c看成是整数,因此可以用该函数来得到字符对应的ASCII码的值。这个视频教程里老师讲的abs函数是吧字符转成其ASCII码的函数并不太准确,它不是字符特有的函数。
  • num2str(N)可以把N转换成字符串
  • double()函数为强制转换函数,表示将其他形式的数组中元素转换成double精度,也可以用来间接得到字符的ASCII码的值
  • char(N)函数可以用来把数字N转成对应的char字符
  • str2num(str)可以把字符串转换成数字
  • upper(c)将小写字母c转换成大写字母
  • lower(c)将大写字母c转换成小写字母

我们也可以用前面的冒号表达式通过数组法来生成字符串,比如:str5=['a':'z']表示从字符a到z的字符串。

Matlab字符串函数和二维字符串

常见的字符串函数如下所示:

  • strcmp(str1,str2)函数用来比较两个字符串是否相同,如果相同返回1,不相同返回0。这和C语言中的strcmp函数有所不同
  • strncmp(str1,str2,N)函数用来比较两个字符串中前N个字符是否相同
  • findstr(str1,str2)函数表示在第一个字符串中查找第二个字符串,返回第二个字符串在第一个字符串中的所有位置的数组,如果没有找到,返回空数组。
  • strcat(str1,str2)函数是字符串拼接函数,返回值是两个字符串的拼接结果。 也可以用[str1,str2]来通过矩阵的形式进行拼接。strcat(str1,str2’)将str2转置以后和str1拼接,这样会将str2的每一个字符分别放在str1的末尾,进而形成字符串数组。
      >> str1 = 'I am a boy'
      >> str2 = 'I am a girl'
      >> strcat(str1,str2')
      %结果如下:
      ans =
    	
          I am a boyI
          I am a boy
          I am a boya
          I am a boym
          I am a boy
          I am a boya
          I am a boy
          I am a boyg
          I am a boyi
          I am a boyr
          I am a boyl
      %如果按照下面的矩阵方式进行拼接则会出错
      >> [str1,str2']
      ??? Error using ==> horzcat
      CAI argument dimensions are not consistent.
      %说明str1和str2的维数不一致
  • disp(str)函数可以用来输出字符串,也可以输出数字。

下面是生成二维字符串方法,例如:

>> ['I am a boy';'I am a girl']
??? Error using ==> vertcat
CAI argument dimensions are not consistent.

%在boy后面加上一个空格,保证维数相同
>> ['I am a boy ';'I am a girl']

ans = 
	
    I am a boy
    I am a girl

但是这样通过加空格的方式来生成二维字符串数组很麻烦,下面几个函数就可以地生成二维字符矩阵。

  • strvcat(str1,str2)函数可以对字符串进行拼接变成字符矩阵
  • str2mat(str1,str2)函数也可以把字符串拼接成字符矩阵

两者的区别在与str2mat函数对应空字符串将会产生一个空行,而strvcat函数则会忽略空字符串。(str2mat函数会在未来的发布版本中被移除,用char函数来替代)。例如:

>> str2mat(str1,'',str2)

ans =

I am a boy 
%有空行
I am a girl

>> strvcat(str1,'',str2)

ans = 

I am a boy %没有空行
I am a girl

Matlab绘图入门

最简单的绘图命令plot函数。

步长越小,生成的点越多,以点来采集数据并对点进行连线。步长较长的时候会出现一个一个的折线,使得曲线不够平滑;步长太小则会增加内存占用,导致运算速度变慢。一般情况下步长选0.01或0.001较为合适。

>> x=0:0.01:2*pi;
%0~2pi的向量,步长为0.01
>> y1=sin(x);
>> plot(x,y1);

这个代码生成的函数图像如下所示。
如果要给x轴加上相应的提示文字,可以加上xlabel命令。例如:

>> xlabel('x轴')
>> ylabel('y轴')

如何给图像加上网格,可以用grid on命令,用grid off命令关闭网格。 如果第一次用了grid on命令,后续用grid命令即可实现关闭网格。

插入关于图的说明,使用legend命令,legend(string1,string2,string3,...)在当前绘图中加入图例。比如:

legend('正弦函数')

生成的函数图像如下。 使用plot函数来在一张图中绘制多条曲线。

>> y2=cos(x)
>> plot(x,y2)
>> hold on
>> plot(x,y1)


通过hold on命令可以使得多个曲线出现在同一张图上。也可以用plot(x,y1,x,y2)显示两条曲线。这样会用不同颜色显示不同的曲线。legend函数最好放在plot之后,这样图例的颜色才能和曲线的颜色一致,不过这个函数放前面也可以,只是颜色可能不太对应。

  • hold on使得当前轴及图形保持不被刷新,准备接受此后图形的绘制,实现多图的共存
  • hold off使当前轴及图形不存在被刷新的性质,新图出现时取消原图

      >>legend('正弦曲线','余弦曲线')
      %可以为各自曲线添加图例,并用不同颜色区分开

Matlab绘图属性的控制

在Matlab命令行中输入edit命令可以打开Matlab调试器,在Editor中写入所有的绘图命令,然后执行会比较方便。clear命令可以清空工作空间。

clc命令可以用来清除命令窗口的内容,不管开启多少个应用程序,命令窗口只有一个,所以无论是在脚本m文件或者函数m文件调用时,clc命令都会清除命令窗口的内容。

clear命令可以用来清除工作空间的内容。MATLAB有个基本的工作空间,用base标识,此外,当打开一个Matlab文件时,可能会产生很多工作空间。每一个函数对应一个工作空间

网上对于工作空间的一个通俗的解释就是存储变量的地方

例如,一个图形用户界面程序test,可能有testgui_mainfcnpushbutton1_callback等工作空间。这时,如果调用clear命令时,需要注意了:

如果在pushbutton1_callback函数内调用clear,则只删除pushbutton1_callback工作空间内的内容。clear对其它工作空间,如base工作空间,是不起作用的。

如果用户想在pushbutton1_callback中调用clear命令来删除基本工作空间中的内容,可以使用evalin命令。

evalin命令是在指定的工作空间中执行Matlab语句的。其中之一的调用格式为:evalin(ws, expression)。ws为工作空间的名字,如'base',expression为Matlab语句。使用evalin('base','clear');就可以删除基本工作空间中的数据了。

我们可以在文件中写用如下代码来绘制图像:

x=0:0.01:2*pi;
y1=sin(x);
y2=cos(x);
plot(x,y1,x,y2);
legend('正弦曲线','余弦曲线');
xlabel('自变量');
ylabel('因变量');
grid on;
axis auto;

注意:文件名不要用plot这样的系统预定义变量命名,否则有可能出现一些错误。
axis auto表示按照默认的比例来控制坐标轴比例。此外,可以通过矩阵的形式来控制坐标轴的范围。比如:

axis([0 2*pi -1 1])

参数中为一个包含四个元素的行向量,前两个元素表示x的取值范围,后两个元素表示y的取值范围。

axis equal命令保证x的范围和y的范围相同,使得整个窗口为正方形。

plot函数还有一些变形,plot(X1,Y1,LineSpec,...,Xn,Yn,LineSpec),其中LineSpec来指定线型,可以指定线宽,指定标志点颜色,形状,大小等。

plot(x,y1,'-r',x,y2,'oy')

-表示默认的实心直线,r表示红色,o表示线型为圆形,y表示颜色为黄色。

x=0:0.5:2*pi;
y1=sin(x);
y2=cos(x);
plot(x,y1,'-r',x,y2,'ob');
legend('正弦曲线','余弦曲线');
xlabel('自变量');
ylabel('因变量');
grid on;
axis([0 2*pi -1 1]);
hold off;

这里修改了x的步长为0.5,为了保证图线变得稀疏,'ob'表示线型为圆圈,颜色为蓝色。'o-b'表示数据点为圆圈,用直线连接数据点,颜色为蓝色。其他关于LineSpec的变化可以查看Matlab帮助文档。

老师的代码里加上了hold off,然后我想,这里hold off有用吗??貌似并没有什么卵用。然后去掉了,把程序改成了这样。

x=0:0.1:2*pi;
y1=sin(x);
y2=cos(x);
plot(x,y1,'-r',x,y2,'ob');
legend('正弦曲线','余弦曲线');
xlabel('自变量');
ylabel('因变量');
grid on;
axis([0 2*pi -1 1]);

图像如下:
顺带把x的步长改成了0.1,发现y2曲线本来就是一堆离散的点构成的,hold off命令显得很多余,使用了plot(x,y1,x,y2)这种写法就保证了y1和y2两条曲线可以共存,而不会出现一个覆盖另一个的情形。

图形窗口菜单及其对数坐标

如果我们在文件中写了如下的语句:

x=10^(0:0.01:10);

则会出现下面的错误:

???Error using ==> mpower
Inputs must be a scalar and a square matrix.

错误提示为:输入必须为标量或者一个方矩阵。

(这个错误是指10^后面这个必须为标量或方矩阵吗?需要试一试)

因此把修改成下面的样子就可以了,一定要注意.运算符的用法,避免程序出现错误。

x=10.^(0:0.01:10);
y=0:0.1:10;
plot(x,y)

这样仍然会出现错误。

???Error using ==> plot
Vectors must be the same lengths.

Error in ==> xxx(表示文件名) at 3
plot(x,y)

这说明x和y变化的步长不相同。因此,将y=0:0.1:10改成y=0:0.01:10即可。

这样x的坐标太长了,图像看起来不太协调。通过以下几个函数可以对图像的坐标刻度进行调整。

  • semilogx(x,y)函数会将x轴先取对数,然后以对数的刻度作为x的刻度,然后绘制图像,因而绘制以后的图像为一条直线。即将x轴变成对数坐标。
  • semilogy(x,y)函数可以将y轴变成对数坐标。
  • loglog(x,y)是全对数坐标系,以10为底,x和y轴都取对数。

下面是一个本章小结的例子:温度转换
(感觉这个小结有点水啊==):

设计一个Matlab程序,读取华氏温度的输入,输出开尔文温度。
转换公式为:T(开尔文)=(5/9*T(摄氏度)-32.0)+273.15
代码如下:

%注释:temp conversion
tem_f = input('please input a Fah temperature');  
tem_k=((5/9)*tem_f-32)+273.15;  
fprintf('%6.2f in Fah temp, %6.2f in Kel temp',tem_f,tem_k)

fprintf函数表示格式化输出,函数形式为fprintf(format,A,...)

其中,%d%i表示以整数格式输出,%f表示以固定点输出浮点数,%e表示以指数形式(科学计数法)输出浮点数。比如:%6.2f表示整数部分保留6位有效数字,小数部分保留2位有效数字

Reference

hold on和hold off函数

http://blog.sina.com.cn/s/blog_7cbc9c930101082m.html

clr和clear命令的使用

http://www.ilovematlab.cn/thread-77061-1-1.html