MatLab讲义 2002年9月版
其中:
x,y,z :决定“网格”的位置,分别是(1*n)、(1*m)和(1*p)向量 X,Y,Z :三维网格坐标,它们都是(n*m)*p维数组
V :在网线节点上的三元函数值数组,维数也为(n*m)*p
xi,i,zi :分别决定垂直于x,y,z轴切面的位置向量。它们的维数可以不同。当取0维空阵时,表示没有切面存在。
切片上的函数值的大小可以用色轴上对应的颜色表示。V数组中的最大有限值和最小有限值定义了色轴的范围。又由于切片的位置可以任意设置,因此slice通过三维坐标点上的色彩变化把图形的表现能力扩展到四维
-(x^2+y^2+z^2)
例:函数R=xe的四维表现图.
x=-2:0.1:2; y=-2:0.25:2; z=-2:0.25:2; n=length(x); [X,Y,Z]=meshgrid(x,y,z); V=X.*exp(-X.^2-Y.^2-Z.^2);
xi=[-0.7,0.7]; yi=0.5; zi=-0.5; slice(X,Y,Z,V,xi,yi,zi);
xlabel(?x?);ylabel(?y?);zlabel(?z?);hold on colorbar(?horiz?) %表明颜色与数组的关系 view([30 45])
3.17 颜色板
(1)数字图象是指将一幅二维的图象表示成一个数值矩阵,矩阵的元素解释为像素的颜色值,为了显示由矩阵表示的数字图像。将矩阵的每个元素对应到当前色谱的某个行标号,并取该行的颜色值作为图像相应点的颜色。
(2)颜色板map是一个m*3的矩阵,其每行的值在0.0-1.0之间,分别表示红、绿、蓝三种颜色,颜色板的每一行定义了一种颜色(对应于RGB三元色)。
(3)两维数组可以用image的形式显示出来,数组中的每一个元素(i,j)的值表示该点的颜色或亮度,image用来显求图象,包括装入调色板,生成二维图象。image(X)表示求生成矩阵X所表求的图像。
(4)colormap(map)将颜色板设置成map。 colormap颜色板矩阵 简单颜色 常用函数查找表函数 红 绿 兰 颜色 函数名称 说明 0 0 0 黑 bone 蓝色调灰色 1 1 1 白 cool 青和品红浓淡色 1 0 0 红 copper 线性变化纯铜色调 0 1 0 绿 flag 红白蓝黑交错色 0 1 1 青兰 gray 线性灰度 hot 黑红黄白色 hsv 带饱和值的颜色查找表 jet 颜色查找表的一种变体 pink 淡粉红色 prism 光谱色 colormap(?default?) 将颜色板设置成缺省值.
Colorbar 在当前的图形上显求一个水平的或的直的颜色标尺. cmap=colormap 得到当前使用的颜色板矩阵.
colormap(hsv(128))产生128种颜色的hsv颜色板。hsv的颜色从红、黄、绿、青、兰、洋红再回到红,循环变化。
在MAYLAB中,图像由一个数据矩阵和一个颜色查找表矩阵组成,根据矩阵数据与像素颜色关系的不同,可以将图像分为三种,索引图像、亮度图像和真彩图像。索引图像是将数据矩阵的元素视为颜色查找表的索引;亮度图像的数据矩阵的元素为一个亮度值,该值线性对应于颜色查找表的索引;真彩图像的数据矩阵是一个m*n*3的三维矩阵,第三维表示每一个像素点的RGB三色,而不用颜色查找表。
demo目录中有一个名为durer.mat的文件,其中包含了两个矩阵X, map。
21
MatLab讲义 2002年9月版
例:人体脊骨的图像, load spine image(X)
colormap(bone);title(?人体脊骨图?) 例:(ex23)
%color(flag)
cmap=colormap;l=length(cmap); x=[1:l];y=x'*ones(size(x)); bar(x(1:2),y(1:2,:)) colormap('summer')
例:hot(8)从黑色到暗红、洋红、黄色、白色平滑过渡。
3.18 图形打印和读写
print [–device] [-option]
操作方式:-dps 单色postscript格式的文件 -dpsc 彩色postscript格式的文件
MATLAB能够读写多种格式的图形文件,包括TIFF、JPEG、BMP、PCX、XWD和HDF格式。函数imread能够读取其中任意一种格式的图像文件。
例:RGB=imread('ngc6543a.jpg');
figure('position',[100 100 size(RGB,2), size(RGB,1)]); image(RGB);
set(gca,'position',[0 0 1 1 ]);
例:load clown
imwrite(X,map,'clown.bmp');
3.19 动画制作
用MATLAB产生动画序列有二种方法:第一种方法是先保存多幅不同的图片,然后连续回播;第二种方法是连续不断地擦除并重画屏幕对象,在重画时屏幕对象不断变化,实现动画效果。这二种方法各有优缺点。前者适于来不及快速重画的场合,它只是回放预先准备的画面。后者用到了画、擦、重画技术,适于表现精度不高能够快速重画的场合。
例1:使用moviein函数建立动画图形。 axis equal m=moviein(8);
set(gca,'nextplot','replacechildren') for j=1:8
plot(fft(eye(j+8))) m(:,j)=getframe; end
set(gca,'nextplot','replacechildren') movie(m,10) 例2:
h = uicontrol('style','slider','position',... [10 50 20 300],'Min',1,'Max',16,'Value',1) for k = 1:16
plot(fft(eye(k+16))) axis equal
set(h,'Value',k)
22
MatLab讲义 2002年9月版
M(k) = getframe(gcf); end
例:使用擦除模式绘制动画图形。
a=[-8/3 0 0; 0 -10 10; 0 28 -1]; y=[35 -10 -7]'; h=0.01;
p=plot3(y(1),y(2),y(3),'.','erasemode','none','markersize',5); axis([0 50 -25 25 -25 25]); hold on for i=1:4000
a(1,3)=y(2); a(3,1)=-y(2); ydot=a*y; y=y+h*ydot;
set(p,'Xdata',y(1),'Ydata',y(2),'Zdata',y(3)) drawnow i=i+1; end
第四章 控制流
4.1 关系运算:
MATLIB有六种关系运算符:< <= > >= == ~= 结果1表示true, 0表示false。 其中< <= > >=只用于操作数的实部比较,== ~=用于比较实部和虚部。 A.当两个变量是标量时,a和b的关系成立,结果为1,否则结果为0。
B.当比较a和b是两个维数相同的数组时,按相同位置比较,结果是一个维数和a相同的数组,其元素由1和0组成。
C.当比较的一个是数组a,一个是标量b时,则把标量b和数组a的每一个元素按标量关系逐个比较,结果是一个维数和a相同的数组,其元素由1和0组成。 如:a=rand(5);b=a
c=a==b; c=a>b
c=a>1;c=a>0;c=a>0.5 x=(1:10);t=x>5
4.2 逻辑运算:|(或),&(与),~(非)和逻辑函数or、and、not、xor及any、all、find
MATLAB提供三个逻辑操作符&、|、~,同时又存在三个相应的M文件:all、or、not,这二组的作用是相同的,只是使用格式稍有差异。xor是第四个逻辑运算函数,完成异或操作。
在逻辑操作中,所有输入元素的非零值都当作1处理。逻辑运算的优先级最低。
例:x=[25 –5; 0 0.001] ~x ans=
0 0 1 0 y=[1 0;1 0]
z1=x&y;z2=and(x,y);z3=xor(x,y); z1=
1 0 0 0 z2=
1 0 0 0 z3=
0 1
23
MatLab讲义 2002年9月版
1 1
MATLAB还提供了许多测试用的逻辑函数,巧妙地使用这些函数,可得到意想不到的结果。 any: 若作用于一向量x,则当x中至少有一个非零元素时返回1,否则返回0,若x是矩阵,则对每一列执行any,返回一个元素为0或1的向量。主要作用测试矩阵中是否有非零元素。
如:a=rand(15)
any(a)=(1 1 1 1 1)
all:测试向量,若向量的所有元素非零,返回1,否则返回0,若对矩阵:则对每一列执行all操作。主要作用测定矩阵中是否有零元素。
all(a) t=~(x>5) 例:ex24.m
x=linspace(0,5,100) //产生0~5之间均匀分布的100个数据 y=cos(x)
z=(y>0).*y //将cos函数的负数置为0 z=z+0.3*(y<0) //将cos函数的正数值增加30% z=(x<=4).*z //将超过4时的z值置为0。 plot(x,z)
find:找出矩阵中非零元素及其下标。 例:a=zeros(5,20);
a(3,7)=0.5;a(4,15)=-0.4; [i,j,v]=find(a) i=
3 4 j=
7 15 v=
0.5000 -0.4000
运算符的优先级:
在一个表达式内可能有几个运算符。MATLAB为确定运算的次序设定了运算符的优先级。在同一优先级时,程序先左后右执行,在优先级不同时,先高级后低级执行。
最高 ()
~(取反) . .^ + -
.* ./ .\\ */ \\+ -
: < <= > >= ++ ~=- 最低 & |
4.3 if,else,elseif,end语句
if语句的格式: if <逻辑表达式>
语句集
elseif <逻辑表达式>
语句集 else
语句集 end
仅由if和end组成的语句,可根据逻辑表达式的值选择是否执行。 例:if rem(a,2)=0
disp(?a is even?)
24
MatLab讲义 2002年9月版
b=a/2 end 例:if x
disp(?矩阵x全为0?) else
disp(?矩阵x不全为0?) end
例:if and(a==1,b>5) ...... end
if是MATLAB中最常用的条件执行语句,它与end语句一起构成各种格式,
4.4.for-end循环
for循环,指定次数的重复循环执行语句。
格式:for <循环参数> = <初态>:<步长>:<终态> 循 环 体 end
当步长=1时,步长可以省略。 例:n=4; for i=1:n
for j=1:n if i==j
a(i,j)=2;
elseif min([i,j])==1 a(i,j)=1; else
a(i,j)=0; end end end
disp(?The matrix A is?);disp(a) 执行时:
The matrix A is 2 1 1 1 1 2 0 0 1 0 2 0 1 0 0 2 例:(test1.m)
for i=1:m for j=1:n
a(i,j)=1/(i+j-1); end end
例:for i=9.8:3:-9 i
end
执行时:i=9.800 i=6.800 3.800 i=0.800 i=-2.200 i=-5.200 i=-8.200 例:s=?abcdefghijk? for i=s
i end
%i分别等于s中和每一个字符。
25