MATLAB 编程技巧总结(一)
1.利用字符串模拟运算式(很好的一个技巧!!值得学习)
利用字符串建立表达式后,再用eval 命令执行它,可以使程序设计更加灵活。但是注意表达式一定要是字符串。其命令格式为:
eval(’字符串’)功能:将括号内的字符串视为语句并运行
例1: 先定义字符串t 为平方根运算,再用eval 求出1 到10 的平方根。
clear, clc t = \'sqrt(i)\'; for i=1:10 s(i) = {char([\'The square root of \', int2str(i), \' is \', num2str(eval(t))])}; %上面大括号{}代表建立数组 end s(:)
例2:如果要输入几十个甚至上百个文件,用手工操作十分繁琐,然而灵活运用eval 函数可以自动完成这一工作。
假设数据文件名从data1.dat~data10.dat,放在D:\matlab\chp 目录下,
操作如下:
for i=1:10 eval([\'load d:\matlab\chp\data\',int2str(i),\'.dat\']) end
例3:函数feval 用于执行字符串代表的文件或函数。
fun = [\'sin\';\'cos\';\'log\']; k = input(\'选择第几个函数:\'); x = input(\'输入数值:\'); feval(fun(k,:),x)
例4: 当前matlab\work 目录下有三个图形文件hlpstep1.gif~hlpstep3.gif,分别打开这三个文件。
clear,clc fun = \'imread\'; for i=1:3 str = char([\'hlpstep\',int2str(i),\'.gif\']); x = feval(fun,str) end
2.关于matlab的文件输入输出
根据数据的组织形式,Matlab 中的文件可分为ASCII 文件和二进制文件。ASCII文件又称文本文件,
它的每一 个字节放一个ASCII 代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的
存储形式原样输出到 磁盘上存放。
Matlab 中的关于文件方面的函数和C 语言相似。
函 数 分 类 | 函数名 | 作 用 |
打开和关闭文件 | fopen | 打开文件 |
fclose | 关闭文件 | |
读写二进制文件 | fread | 读二进制文件 |
fwrite | 写二进制文件 | |
格式I/O | fscanf | 从文件中读格式数据 |
fprintf | 写格式数据 | |
fgetl | 从文件中读行,不返回行结束符 | |
fgets | 从文件中读行,返回行结束符 | |
sprintf | 把格式数据写入字符串 | |
读写字符串 | sscanf | 格式读入字符串 |
feof | 检验是否为文件结尾 | |
文件定位 | fseek | 设置文件定位器 |
ftell | 获取文件定位器 | |
frewind | 返回到文件的开头 |
(1)文件的打开和关闭
对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。
函数fopen 用于打开文件,其调用格式为:
fid=fopen(‘filename’,’permission’)
fid 是文件标识符(file identifier),fopen 指令执行成功后就会返回一个正的fid 值,
如果fopen 指令执行失败,fid 就返回-1。
filename 是文件名。
permission 是文件允许操作的类型,可设为以下几个值:
‘r’ 只读
‘w’ 只写
‘a’ 只能追加(append)
‘r+’ 可读可写
与fopen 对应的指令为fclose,它用于关闭文件,其指令格式为:
status=fclose(fid)
如果成功关闭文件,status 返回的值就是0。
(2)读写操作
i)fwrite 的指令格式
fid=fopen(‘filename’,’permission’)
fwrite(fid,要保存的数据矩阵,’精度格式’)
执行help fread 即可查到精度格式的设定。
ii)fprintf 的指令格式
fprintf(fid,’数据格式’,需要保存的数据矩阵)
例 产生10 个随机数,并保存到一个纯文本文件data1.txt 中。
clear,clc a = rand(1,10) fid = fopen(\'data1.txt\',\'w\'); fprintf(fid,\'%8.4f\',a); fclose(fid); load data1.txt data1
iii)save 的指令格式
save filename 变量1 变量2 …
使用load filename 即可把变量1、变量2、…调出来。
如果要保存为ASCII 码,就要在后面加上-ascii
save filename 变量1 变量2 … -ascii
对于save 指令,处理大量数据存取有一个技巧非常有用,即:
save(‘filename’,’变量1’,’变量2’,…)
由于filename 是用字符串表示的,所以可以使用程序进行控制,使其每处理
完一次就存一个不同的文件名称。
例
clear,clc m = 1:10; for i=1:length(m) n = m.^2; nf = [m\',n\']; t = char([\'nf\',int2str(i),\'=nf\']) eval(t) save([\'data\',int2str(i)],[\'nf\',int2str(i)]) end
iv)load 纯文本文件
load filename.txt
就建立了变量名为filename 的数据。
例: 现有一纯文本数据文件caipao.txt,保存了山东省65 期的福利彩票中奖号码,试对中奖号码给出一些统计,
并按一定的规则产生两组彩票号码。
clc,clear load caipiao.txt; cp = caipiao; for i=1:30 b(i) = length(find(cp==i)); end [b,id] = sort(b); mai1 = sort(id(1:7)), mai2 = sort(id(24:30)) fid1 = fopen(\'cpsj.txt\',\'w\'); fprintf(fid1,\'%6d %6d %6d %6d %6d %6d %6d %6d\n\',caipiao\'); fclose(fid1);
3.动画制作
动画制作通常有两种方法:一种是预先将图形制作好,并放到图形缓冲区内,然后一帧一帧地播放。
另一种方法是保持整个背景图案不变,只更新运动部分的图案,以便加快每幅图的实时生成速度。
(1)简单动画制作
在 getframe 命令下,可以完成动态数据到动态画面的制作。其使用格式及制作步骤一般为:
for j=1:n plot_command M(j) = getframe; end movie(M,n) %其中M(j)=getframe 将当前图形窗口中的画面作为第j 帧存入矩阵M, %movie(M,n)将按顺序放映矩阵M 中存储的画面,并重复n 次。
例1:
x = -3:0.1:3; [x,y] = meshgrid(x); z = sin(x.*y).*exp(x.*y/5); for j=1:30 mesh(cos(4*pi*j/30)*z, z) m(j) = getframe end movie(m,10)
例2: 模拟 6 个移动物体
x0 = [150 85 150 145 130 0]; y0 = [140 85 155 50 150 0]; q = [243 236 220.5 159 230 52]*pi/180; t = 0:0.05:2*pi; for i = 0:280 pause(0.01); for j=1:5 axis([0 160 0 160]); fill(x0(j)+0.8*i*cos(q(j))+4*cos(t),y0(j)+0.8*i*sin(q(j))+4*sin(t),\'b\') hold on; end fill(x0(6)+0.8*i*cos(q(6))+4*cos(t),y0(6)+0.8*i*sin(q(6))+4*sin(t),\'r\') hold off; end
2.其它例子
在 Matlab 里利用图形的“EraseMode”属性可以实现显示新对象,擦除旧对象,而
又不破坏背景图案。图形的“EraseMode”属性有以下四种:
normal 方式:
重绘整个显示区,这种方式产生的图形最准确,但较慢。
none 方式:
不做任何擦除,直接在原来图形上绘制。
xor 方式
对象的绘制和擦除由背景颜色和屏幕颜色的异或而定。只擦除和屏幕颜色不一致的旧对象的点,
只绘制和屏幕颜色不一致的新对象的点。
background 方式
把旧对象的颜色变为背景色,这种方式影响被擦除对象下面的对象。
当新对象的属性修改后,应刷新屏幕,使新的对象显示出来。Matlab 里屏幕刷新的命令是drawnow。
drawnow 命令使Matlab 暂停目前的任务而去刷新屏幕。若不使用
drawnow 命令,Matlab 则等到任务序列执行完后才刷新。
例 布朗运动
(1)先确定布朗运动的点数n 和一个温度s(或速度)。比如n=20,s=0.002。达
到最好的动画效果的n、s 与使用的计算机的性能有关。在以原点为中心、边长为1 的
正方形内产生n 个位置随机分布的点。
(2)在单位正方形里绘制所有的点。设置图形的“EraseMode”属性为异或(xor),
即当图形的某个点的位置变化时,不用全部重绘图形,而只绘制不相同的部分,这将大
大提高绘图速度。
(3)用while 循环实现动画效果,在每一次循环中给点的坐标加上一些正态分布
的噪声,这样整个图形中只有点的坐标发生变化,而不用全部重绘整个图形。
程序如下:
clc,clear n=20; s=0.002; axis square grid off x = rand(n,1)-0.5; y = rand(n,1)-0.5; h = plot(x,y,\'.\'); set(h,\'EraseMode\',\'xor\',\'MarkerSize\',18) while 1 x=x+s*rand(n,1);y=y+s*rand(n,1) set(h,\'Xdata\',x,\'Ydata\',y) if all(x>1) & all(y>1) break end drawnow end
例 制作一幅钻石沿着圆周运动的动画。
程序如下:
t = 0:pi/200:pi*2; x = sin(t); y = cos(t); axis square plot(x,y,\'b\') n = length(t); h = line(\'color\',\'red\',\'marker\',\'diamond\',\'erasemode\',\'xor\'); i = 1; j = 1; while 1 set(h,\'xdata\',x(i),\'ydata\',y(i)) drawnow i = i+1; j = j+1; if i>n i=1; end if j>2*n break end end