MATLAB 编程技巧总结(一)

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

转载于:https://www.cnblogs.com/Ustar_Lee/p/4755770.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值