目录
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,可能有test
、gui_mainfcn
、pushbutton1_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