Febird's Sky

Search & Research & Find
posts - 42, comments - 39, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年12月20日


  鉴于Matlab中缺乏多线程机制,使用Timer无疑是一个很重要的工具,Matlab中Timer是一个Java对象。
 
   Timer的定义

   t=timer();

   设置属性:

  eg.   set(t,'Name','your_timer_name');

  当然可以一次性设置完成:

  例如:

    TaskTimer=timer(...
    'Name','FebirdTimer',...
    'TimerFcn',@ExecuteTask,...
    'ErrorFcn',@ExecuteError,...
    'Period',1,...
    'ExecutionMode','fixedrate');  

  这里TimerFcn为Timer执行的函数,后面的 ‘@ExcuteTask’ 就是你定义的函数名
 同样 ErrorFcn也是一样。

  Period为执行周期,ExecutionMode为执行模式,fixedrate为固定频率。当然前面所说的都是在这个前提之上。

  关于TimerFcn的定义


  当以TimerFcn的定义默认必须有两个参数

  function ExcuteTask(obj,eventdata)
   % TODO
  end

  其中obj为执行该函数所对应的timer对象,eventdata为事件数据,一般里面为具体时间。

 当需要在ExcuteTask中传入参数的时候,那么Timer可以这样定义:

 set(t,'TimerFcn',{@ExecuteTask,var1});

 那么这时函数定义应该为:

 function ExcuteTask(obj,eventdata,var1)
   % TODO
 end

  其他函数的定义也类似。

  关于UserData



  UserData在Timer比较有用,因为当时用上面的方法传递参数是,Matlab只会在第一次传入参数。

  所以我们可以在UserData这个域中保存我们的数据

  例如
 
  t=[0]
  lh=plot(t,sin(t),'-');

   t=timer(...

   'Name','FebirdTimer',...

   'TimerFcn',@ExecuteTask,...

   'ErrorFcn',@ExecuteError,...

   'Period',1,...

   'ExecutionMode','fixedrate');

   ud=struct{'linehanle',lh,'count',0} ;

   set(t,'UserData',ud);


  function ExcuteTask(obj,eventdata)

    ud=obj.UserData;
    l=ud.linehandle;
    c=ud.count;
    t=get(l,'XData');
    y=get(l,'YData');
    t=[t count];
    y=[y sin(0.1*count)];
    set(lh,'XData',t,'YData',y);

   drawnow

   ud.count=ud.count+1;
   set(obj,'UserData',ud);


  end

以上给出了一个使用Timer画图的方法 

关于Timer的函数


 1.start();
 2.stop();
 3.timerfind();

 eg.删除所有的timer
 ts=timerfind;
 if length(ts)>0
 stop(ts);
 delete(ts);
 end

 通过Name查找特定的Timer:

 t=timerfind('Name','FebirdTimer');

  

posted @ 2008-12-20 23:31 febird 阅读(2422) 评论(1) 编辑


  1.直接传递
 
   当要在一个matlab中的.m文件打开一个新窗口时候,可以直接传递

   例如有两个窗口 A.fig/A.m 和 B.fig/B.m

   在 A.m中

   B(var1) ; 即可传入参数

  那么在B中这样获取即可:
 
  if  length(varargin)==1
  
     some_var= varargin{1};

  end

 2.通过output属传回

  在A.m中

  some_var=B(var1);

  也就是 B还需要返回值。

   那么在B中就需要设置handles的output值了

  function varargout = B_OutputFcn(hObject, eventdata, handles)

  varargout{1} = some_var_in_figure_B;


 3. 几个重要的函数

    1.getappdata(h,'Name'); 获取窗口句柄为h中的'Name'变量
    2.setappdata(h,'Name',value);设置窗口句柄为h中的'Name'变量为Value
    3.isappdata(h,'Name'); 判断h句柄下面有无‘Name’的变量
    4.rmappdata(h,'Name');删除h句柄下面‘Name’的变量

     5.guidata(h);  获取窗口句柄为h的 handles结构
     6.guidata(h,handles);  设置窗口句柄为h的handles结构为handles

     7.guihandles(h) 生成handles结构


   说明:
     关于appdata的几个函数是最基本的,每个figure都可以有几个很多appdata,setappdata(0,'Name',value) 当设置句柄为0时,表示整个Matlab共享的数据域,任何figure都可以访问。这也可以成为数据传递的另一种方式。

    hansles是我们在GUI的m文件经常看到的东西,为什么会有guidata呢?那是因为一个figure对象下面可能有很多其他的对象,例如 edit axes slider 等等,为了将这些东西组织起来供用户方便的访问,matlab特地的添加了这个数据结构,它包括改figure所有的控件。你可以直接访问  

  使用 guihandles(h) 可以生成 hanles结构,它包含 h 中的所有控件,其中h可以从fig文件load进来。

   guidata(h) 返回 matlab默认给这个 figure生成的 handles结构 。

   guidata(h,handles) 是修改 h (如果是一个figure) 或者 h 的父figure的handles值。

  它会不停的向上查找 h的parent ,知道为figure,然后便修改其handles值。


4.句柄概念

  个人认为,句柄就是相当于指针的意思,在Matlab中,每一个GUI对象都有一个handle,他们都是一些小数或者整数,Matlab能够保证这些数字不重复,因此通过这个句柄就可以访问或者修改你的对象。

 通过传递 句柄的方式可以修改传递的值的内容,而传递变量就做不到,这点和C语言的指针类似。


  
 

  

posted @ 2008-12-20 23:30 febird 阅读(1082) 评论(0) 编辑


  1. struct动态属性名

    例如:
    fieldname=get(some_h,'Tag');
   
    s=struct();

    s.(fieldname)=some_h;

   使用 .() 就能够这样使用


  2. Matlab中的 () [] {} , ; :

     ()可用在函数的定义,调用(当没有参数传递时,使用括号会报错)
        可用在取矩阵中的某一元素 eg.  A(1,2) 就是取矩阵A的 第一行第二列的元素 
      [] 定义矩阵 其中 ", " 或者 " "(空格) 分割行元素, ";" 分割列元素
          []可以直接连接 矩阵 例如 A=[B C] (行连接)  A=[B;C] 列连接

      {} 定义结构,CELL类型,访问 CELL元素

          例如有一个Cell型数据A,A{1,2}就是访问 A的第一行,第二列的元素
          
        

  

 

posted @ 2008-12-20 23:27 febird 阅读(120) 评论(0) 编辑