<![CDATA[yixiongshu.bokee.com]]> zh_cn Thu,04 May 2006 00:09:54 CST Sat,31 Mar 2007 11:19:40 CST http://www.bokee.com http://reg.bokee.com/account/web/img/logo.gif 博客网 http://www.bokee.com 您好,欢迎访问yunle110.bokee.com <![CDATA[Building of OFDM simulation platform using C/C++ ]]> .html (permitted to copy entirely---Yi Xiongshu)

 

1 Source Part

 

Firstly,we must to get a signal source by creating a uniform random generator.also some other random number,such as normal distribution.

 

using VC++6.0

 

In order to solve the reproduce of the first circle of creating uniform,we choice time( include in 'ctime' library) as the seed of rand().

1) srand((unsigned)time(NULL))

2) time_t t; 
   srand((unsigned) time(&t));

3) srand(static_cast<unsigned>(time(static_cast<time_t *>(NULL))));

 

typical application:

include the follow header files:<iostream><iomanip><cstdlib><ctime>

A: 

double randomdouble()  // creating 0-1 uniform distribution.

{

   return(rand()/(static_cast<double>(RAND_MAX)+1));

}

B:

4-digit precision.

double AverageRandom(double min,double max)
    {
    int minInteger = (int)(min*10000);
    int maxInteger = (int)(max*10000);
    int randInteger = rand()*rand();
    int diffInteger = maxInteger - minInteger;
    int resultInteger = randInteger % diffInteger + minInteger;
    return resultInteger/10000.0;
    }

double dValue[400];
    srand(GetTickCount());
    for(int i= 0;i < 400; i++)
    {
    double dValue[i] = AverageRandom(-1,1);
    }

 

we must pay attention to the refresh frequency of the computer,approximate 55ms.

so often let the srand(GetTickCount()) outside of the circle.

 

in order to get binary value,using binary_value=(dvalue>=0.5).

 

if you want to using normal random number,we can using the below program.

 

从图中可以看出,在μ附近的概率密度大,远离μ的地方概率密度小,我们要产生的随机数要服从这种分布,就是要使产生的随机数在μ附近的概率要大,远离μ处小,怎样保证这一点呢,可以采用如下的方法:在图2的大矩形中随机产生点,这些点是平均分布的,如果产生的点落在概率密度曲线的下方,则认为产生的点是符合要求的,将它们保留,如果在概率密度曲线的上方,则认为这些点不合格,将它们去处。如果随机产生了一大批在整个矩形中均匀分布的点,那么被保留下来的点的横坐标就服从了正态分布。可以设想,由于在μ处的f(x)的值比较大,理所当然的在μ附近的点个数要多,远离μ处的少,这从面积上就可以看出来。我们要产生的随机数就是这里的横坐标。(转贴 http://www.vckbase.com/document/viewdoc/?id=1424任意分布的随机数的产生方法-VC程序实现方法)

 

solution 1

 

double Normal(double x,double miu,double sigma) //normal distribution pdf
    {
    return 1.0/sqrt(2*PI*sigma) * exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma));
    }
    double NormalRandom(double miu,
         double sigma,double min,double max)//generate normal random number.
    {
    double x;
    double dScope;
    double y;
    do
    {
    x = AverageRandom(min,max);
    y = Normal(dResult, miu, sigma);
    dScope = AverageRandom(0, Normal(miu,miu,sigma));
    }while( dScope > y);
    return x;
    }

 

solution 2

 

refer to <<Numerical recipes in c++ >> pp292-294   <<simulation modeling and analysis>> pp465-466

if the u1,u2 is uniform random at range (0,1),and independently.

x1=sqrt(-2*log(u1))*cos(2*pi*u2);

x2=sqrt(-2*log(u1))*sin(2*pi*u2);   x1,x2 is normal distribution.

and also independently.

 

 some other RNG introduce(Professor Pingzhi Fan collected):

 

1 LCG U(0,1),introduced by Lehmer(1951)

  Z(i)=(a*Z(i-1)+c)(mod m), satisfy 0<m,a<m,c<m,and Z(0)<m;

  "Few good men"(for 32 bit machines):Z(i)=(16807*Z(i-1))(mod(pow(2,31)-1)),Z(i)=(69069*Z[i-1]+1)(mod(pow(2,32))).

 

2 Practical U(0,1) Generators

  #include <stdio.h>  %Developed by George Marsaglia,1999.

  #define znew (z=36969*(z&65535)+(z>>16))

  #define wnew (w=18000*(w&65535)+(w>>16))

  #define MWC ((znew<<16)+wnew)

  #define SHR3 (jsr^=(jsr<<17),jsr^=(jsr>>13),jsr^=(jsr<<5))

  #define CONG (jcong=69069*jcong+1234567))

  #define FIB ((b=a+b),(a=b-a))

  #define KISS ((MWC^CONG)+SHR3)

  #define LFIB4 (c++,t[c]=t[c]+t[UC(c+58)]+t[UC(c+119)]+t[UC(c+178)])

  #define SWB   (c++,bro=(x<y),t[c]=(x=t[UC(c+34)])-(y=t[UC(c+19)]+bro))

  #define UNI (KISS*2.328306e-10)

  #define VNI ((long)KISS)*4.656613e-10

  #define UC (unsigned char)  // a cast operation

 

  type unsigned long UL;

// Global static variables

static UL z=362436069,w=521288629,jsr=123456789,jcong=380116160;

static UL a=224466889,b=7584631,t[256];

 

// useing random seeds to reset z,w,jsr,jcong,a,b,and the table t[256]

static UL x=0,y=0,bro;

static unsigned char c=0;

// example procedure to set the table using KISS

void settable(UL i1,UL i2,UL i3,UL i4,UL i5,UL i6)

{  int i; z=i1;w=i2,jsr=i3;jcong=i4;a=i5;b=i6;

for(i=0;i<256;i=i+1) t[i]=KISS;

}

// this is a test main program

int main(void)

{

  int i; UL k;

settable(12345,65435,34221,12345,9983651,95746118);

 

for(i=1;i<100000;i++){k=LFIB4;}

printf("%u/n",k-1064612766U);

......

 

Using UNI produce uniform random real in (0,1),while VNI will produce in (-1,1);

 

3 Uniform Distribute R.V.U(a,b)(Inverse-Transform Method)

  1) Generate U--U(0,1).

  2) Return x=a+(b-a)U.

4 Exponential Distributin R.V.Expo(beta)(Inverse_Transform Method)

  1).Generate U--U(0,1);

  2).Return X=-beta*ln(1-U).

5 Normal Distribution N(0,1)  Marsaglia-Bray Polar Method(1965)

  1.Generate U1 and U2 as IID U(0,1);let Vi=2Ui-1 for i=1,2;and let W=V1^2+V2^2.

  2.If W>1,go back to step 1.Otherwise let Y=Sqrt((-2lnW)/W),X1=V1Y,and X2=V2Y.Then X1 and X2 are IID N(0,1)random variates.

  since a rejection of U1 and U2 can occur in step 2(with probability 1-Pi/4),the polar method will require a random number of U(0,1) random variables to generate each pair of N(0,1)random variates.

 X'=u+lu*X,X--N(0,1),X'--(u,lu^2).

 

6 Normal N(0,1) Box-Muller Method(1958)

  1) Generate U1 and U2 as IID U(0,1).

  2) Return X1=sqrt(-2lnU1)cos(2*pi*U2) and X2=sqrt(-2lnU1)sin(2*pi*U2).

  however,if U2 depends on U1 such as two adjacent random numbers produced by LCG(not truly IID U(0,1)r.v),two N(0,1)are not IID,therefore,it is not as good as polar method.

 

7 Lognormal Distribution LN(u,lu^2)

  1) Generate Y--N(u,lu^2).

  2) Return X=e^Y.

8 Normal Distribution

  sum-of-12 method:

  1) Generate U1,U2,....U12 as 12 IID U(1,1).

  2) Return X=(U1+U2+..U12)-6.0.

9 Rayleigh/Rice

  Rayleigh distribution

  1) Generate Y1--N(0,1),Y2--N(0,1);

  2) Return X=Sqrt(Y1^2+Y2^2).

  Rice distribution

  2) Generate Y1--N(0,1),Y2--N(0,1);

  2) Return X=sqrt((A+Y1)^2+Y2^2).

 

Generating Source based on VC++6.0(allowing to learn,but prohibit to spread it on the Internet without permission)

// Here we generate source of '0' and '1',in order to
// in order to satisfy other circumstance,we program a
// generic program,which can produce uniform at(min,max).
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;

void randint(int a[],int n,int min,int max)
{
 int i;
 double randdouble;
 srand((unsigned)time(NULL));
 if(min==0&&max==1)
      for(i=0;i<n;i++)
  a[i]=(rand()/(static_cast<double>(RAND_MAX)+1))>=0.5;
    
    else
 {
  for(i=1;i<n;i++)
  {
     randdouble=rand()/(static_cast<double>(RAND_MAX)+1);
        a[i]=(max-min)*(randdouble>=0.5)+min;
  }
 }

}

void main()  //测试函数
{
  int i,min=0,max=1;
  int a[10];
  int n=10;
  randint(a,n,min,max);
  for(i=0;i<10;i++)
   cout<<a[i]<<endl;
}

 

2 Mapping

common.h

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <cmath>

 

VC6.0++ contain the header file complex.h,so we can using it to generate complex variable.

also we can definite an struct.

for example:

struct complex
{
 double real;
 double imag;
};

some test of complex variable.

#include <iostream>
#include <complex>
#include <cmath>
using namespace std;

struct A
{
 int a;
 char b;
 
 A::A(int i,char c)
 {
  a = i;
  b = c;
 }
};
/*ostream& operator<<(ostream& os, const A& obj)
{
 os<<obj.a<<" "<<obj.b<<endl;
 return os;
}*/

void main()
{
 complex<double> aa(3,4);
 complex<double> bb(3,4);
 complex<double> cc = aa*bb;
 
 cout<<cc;
 
 A abc(3,'d');
/* cout<<abc<<"adfasd";*/
 cout<<cc.real()<<" "<<cc.imag()<<endl;
}

/*struct complex
{
   double real;
   double imag;
}

class complex
{
   private:
   double _real;
   double _image;

   public:
   double real()  { return _real; }
   double imag()  { return _imag; }
} */

// simulate the modulation.
// here we only consider BPSK,QPSK,16QAM,Constellation
// use constant CL as the number of the above constellation.
// CL is declare at the main()

#include "common.h"

void randint(char a[],int n,int min,int max);
void mapping(char a[],struct complex symb[],int n,int CL);


using namespace std;


struct complex
{
 double real;
 double imag;
};


void mapping(char a[],struct complex symb[],int n,int CL)   // Digital modulation,
{                                                           // you can modify it to satisfy your
 int i,j=0;                                                // requirements
    
 switch(CL)
 {
    case 2:// choice BPSK.
     {
      for(i=0;i<n;i++)
      {
       switch(a[i])
       {
       case '1':
        {symb[j].real=-1.0;
        symb[j++].imag=0.0;
        break;
        }
       case '0':
        {symb[j].real=1.0;
        symb[j++].imag=0.0;
        break;
        }
       default:
        cout<<"Binary Source Error!"<<endl;
        break;
       }
      }
      break;
     }
    case 4: // choice QPSK.
     {
      for(i=0;i<n;i=i+2)
      {
       switch((a[i]-48)*2+(a[i+1]-48))
       {
       case 0:
        {symb[j].real=1.0;
        symb[j++].imag=1.0;
        break;
        }
       case 1:
        {symb[j].real=1.0;
        symb[j++].imag=-1.0;
        break;
        }
       case 2:
        {symb[j].real=-1.0;
        symb[j++].imag=1.0;
        break;
        }
       case 3:
        {symb[j].real=-1.0;
        symb[j++].imag=-1.0;
        break;
        }
       default:
        cout<<"Binary Source Error!"<<endl;
        break;
       }
      }
      break;
     }
    default:
     cout<<"You input a wrong integer!"<<endl;
 }
}


void main()                  // test function
{
 int i,min=0,max=1;          // 变量定义
 struct complex symb[20];
 int CL=4;
 char ch[20];
 int n=20;
 
 randint(ch,n,min,max);     // 调用随机数的产生
 
 for(i=0;i<20;i++)         // 查看产生的二进制符号是否正确
  cout<<ch[i]<<endl;
 
 mapping(ch,symb,n,CL);  // 调用符号映射子函数
 
 for(i=0;i<10;i++)                                    // 查看输出的映射符号是否正确
 {
  cout<<symb[i].real<<"+j"<<symb[i].imag<<endl;
 }

}

 

(待续....)

]]>
Sat,31 Mar 2007 11:19:40 CST 99
<![CDATA[终于毕业了]]> .html 终于毕业了,以后也就更忙乎了。

 

]]>
Wed,02 Apr 2008 19:11:44 CST 0
<![CDATA[春节有感]]> .html 这里一直都空空的,总想写点什么,但又不知从何说起。

又到了新的一年,总感觉有点茫茫然,都不知道有多长时间没有这样的空闲了,想来总该做的什么。

说起来这个春节家里人都过的不是怎么好,遇到的这些事让我时刻都惦记老爸老妈,想以前,从来都不曾帮他们想想问题。连他们要求的每个月给家里一次电话都没有做到,家里就我和我哥,我妈常说要是有个女儿该有多好,说女儿贴心。想来也确实是这样,每次我能和妈说什么心里话呢,她的心里话又找谁说呢。每次电话回去都是催我要尽快解决个人问题,注意身体,没有钱花了一定要跟家里说,要吃好,不要苦了自己,注意安全,晚上不要一个人出去。对他们来说我过的好就是他们的最大的安慰了。

记忆中,我爸就哭过一次,也就是这个春节我妈在雪地里摔倒,伤的很严重。在电话里他哽噎了。幸好检查没有什么问题,我妈哭了,她说的是如果有什么问题她怕拖累我们,如果这样她还不如就这样去了。听了这话心里都不知道是什么滋味。

]]>
Sat,01 Mar 2008 10:36:15 CST 0
<![CDATA[春节读书有感]]> .html 去年回家前就带回了三本书,一本圣经人物介绍,一本奥古斯丁的忏悔录,一本关于财富创造的报告集。

以前对于圣经就一直反感,或许可以作为老年时的精神寄托。什么事情都那上帝来做解释,时刻审视自己的罪恶。从中充斥了很多的人类的原罪论,如杀兄弃弟等。因为世间的罪恶,所以上帝采用大灾难来洗涤灵魂的罪恶。事先给予虔诚信徒以启示。在这样的情况下,很多的自然灾害就有了合理的解释。

很早以前就听说过《忏悔录》,经过千多年还闪烁着智慧的火花。由于时间问题只看了一部分,很多对自己内心世界的剖析,有对善恶来源的追寻,有对上帝的忏悔。“我年轻时一度狂热追求的满足只不过是地域的快乐”,“这时我所喜欢的还不过是爱与被爱”,“最高的存在亦即最高的生命”,“人生是迈向死亡的生命或是生命的死亡”。个人认为对生命形式,对善恶,对存在等进行分析是需要一定条件的,对于今社会也不例外,得拥有很好的物质条件。如果说文章以经世济用为标准,貌似对于年青人来说没有现实的意义。

做技术的最大的误区就是陷入技术维上,这也是我们必须跳出的观点。以前给自己定位的目标就是技术牛人。打通DSP 单片机 FPGA VC。看了这个报告集才发现还有很多市场规则需要学习,得尽早为自己规划学习一下经济方面的理论知识了。认认真真做事,踏踏实实做人。一个人最难的就在于细致努力做好每一件事。就行血色烂漫-玫瑰绽放里姜士安说的,“对自己的要求一直就是,把该我干的事情干好。对上,让上级放心,不能一件事交给你,后面跟着七八个工作组收拾。对下,让下级信任,觉得跟着你干有前途、有价值。”

]]>
Sat,01 Mar 2008 10:35:37 CST 0
<![CDATA[一个经典的爱情哲理zt]]> .html 从前,有一座圆音寺,每天都有许多人上香拜佛,香火很旺。在圆音寺庙前的横梁上有个蜘蛛结了张网,由于每天都受到香火和虔诚的祭拜的熏托,蛛蛛便有了佛性。经过了一千多年的修炼,蛛蛛佛性增加了不少。
  
  忽然有一天,佛主光临了圆音寺,看见这里香火甚旺,十分高兴。离开寺庙的时候,不轻易间地抬头,看见了横梁上的蛛蛛。佛主停下来,问这只蜘蛛:“你我相见总算是有缘,我来问你个问题,看你修炼了这一千多年来,有什么真知拙见。怎么样?”蜘蛛遇见佛主很是高兴,连忙答应了。佛主问到:“世间什么才是最珍贵的?”蜘蛛想了想,回答到:“世间最珍贵的是‘得不到’和‘已失去’。”佛主点了点头,离开了。
  
  
  就这样又过了一千年的光景,蜘蛛依旧在圆音寺的横梁上修炼,它的佛性大增。一日,佛主又来到寺前,对蜘蛛说道:“你可还好,一千年前的那个问题,你可有什么更深的认识吗?”蜘蛛说:“我觉得世间最珍贵的是‘得不到’和‘已失去’。”佛主说:“你再好好想想,我会再来找你的。”
  
  
  又过了一千年,有一天,刮起了大风,风将一滴甘露吹到了蜘蛛网上。蜘蛛望着甘露,见它晶莹透亮,很漂亮,顿生喜爱之意。蜘蛛每天看着甘露很开心,它觉得这是三千年来最开心的几天。突然,
  又刮起了一阵大风,将甘露吹走了。蜘蛛一下子觉得失去了什么,感到很寂寞和难过。这时佛主又来了,问蜘蛛:“蜘蛛这一千年,你可好好想过这个问题:世间什么才是最珍贵的?”蜘蛛想到了甘露,对佛主说:“世间最珍贵的是‘得不到’和‘已失去’。”佛主说:“好,既然你有这样的认识,我让你到人间走一朝吧。”
  
  
  就这样,蜘蛛投胎到了一个官宦家庭,成了一个富家小姐,父母为她取了个名字叫蛛儿。一晃,蛛儿到了十六岁了,已经成了个婀娜多姿的少女,长的十分漂亮,楚楚动人。
  
  这一日,新科状元郎甘鹿中士,皇帝决定在后花园为他举行庆功宴席。来了许多妙龄少女,包括蛛儿,还有皇帝的小公主长风公主。状元郎在席间表演诗词歌赋,大献才艺,在场的少女无一不被他折倒。但蛛儿一点也不紧张和吃醋,因为她知道,这是佛主赐予她的姻缘。
  
  过了些日子,说来很巧,蛛儿陪同母亲上香拜佛的时候,正好甘鹿也陪同母亲而来。上完香拜过佛,二位长者在一边说上了话。蛛儿和甘鹿便来到走廊上聊天,蛛儿很开心,终于可以和喜欢的人在一起了,但是甘鹿并没有表现出对她的喜爱。蛛儿对甘鹿说:“你难道不曾记得十六年前,圆音寺的蜘蛛网上的事情了吗?”甘鹿很诧异,说:“蛛儿姑娘,你漂亮,也很讨人喜欢,但你想象力未免丰富了一点吧。”说罢,和母亲离开了。
  
  蛛儿回到家,心想,佛主既然安排了这场姻缘,为何不让他记得那件事,甘鹿为何对我没有一点的感觉?
  
   几天后,皇帝下召,命新科状元甘鹿和长风公主完婚;蛛儿和太子芝草完婚。这一消息对蛛儿如同晴空霹雳,她怎么也想不同,佛主竟然这样对她。几日来,她不吃不喝,穷究急思,灵魂就将出壳,生命危在旦夕。太子芝草知道了,急忙赶来,扑倒在床边,对奄奄一息的蛛儿说道:“那日,在后花园众姑娘中,我对你一见钟情,我苦求父皇,他才答应。如果你死了,那么我也就不活了。”说着就拿起了宝剑准备自刎。
  
  就在这时,佛主来了,他对快要出壳的蛛儿灵魂说:“蜘蛛,你可曾想过,甘露(甘鹿)是由谁带到你这里来的呢?是风(长风公主)带来的,最后也是风将它带走的。甘鹿是属于长风公主的,他对你不过是生命中的一段插曲。而太子芝草是当年圆音寺门前的一棵小草,他看了你三千年,爱慕了你三千年,但你却从没有低下头看过它。蜘蛛,我再来问你,世间什么才是最珍贵的?”蜘蛛听了这些真相之后,好象一下子大彻大悟了,她对佛主说:“世间最珍贵的不是‘得不到’和‘已失去’,而是现在能把握的幸福。”刚说完,佛主就离开了,蛛儿的灵魂也回位了,睁开眼睛,看到正要自刎的太子芝草,她马上打落宝剑,和太子深深的抱着……
  

]]>
Tue,19 Feb 2008 13:36:41 CST 0
<![CDATA[卡尔曼滤波简介+ 算法实现代码ZT]]> .html 最佳线性滤波理论起源于40年代美国科学家Wiener和前苏联科学家Kолмогоров等人的研究工作,后人统称为维纳滤波理论。从理论上说,维纳滤波的最大缺点是必须用到无限过去的数据,不适用于实时处理。为了克服这一缺点,60年代Kalman把状态空间模型引入滤波理论,并导出了一套递推估计算法,后人称之为卡尔曼滤波理论。卡尔曼滤波是以最小均方误差为估计的最佳准则,来寻求一套递推估计的算法,其基本思想是:采用信号与噪声的状态空间模型,利用前一时刻地估计值和现时刻的观测值来更新对状态变量的估计,求出现时刻的估计值。它适合于实时处理和计算机运算。

 

现设线性时变系统的离散状态防城和观测方程为:

 

X(k) = F(k,k-1)·X(k-1) T(k,k-1)·U(k-1)

 

Y(k) = H(k)·X(k) N(k)

 

其中

 

X(k)和Y(k)分别是k时刻的状态矢量和观测矢量

 

F(k,k-1)为状态转移矩阵

 

U(k)为k时刻动态噪声

 

T(k,k-1)为系统控制矩阵

 

H(k)为k时刻观测矩阵

 

N(k)为k时刻观测噪声

 

则卡尔曼滤波的算法流程为:

 

  1. 预估计X(k)^= F(k,k-1)·X(k-1) 
  2. 计算预估计协方差矩阵
    C(k)^=F(k,k-1)×C(k)×F(k,k-1)' T(k,k-1)×Q(k)×T(k,k-1)'
    Q(k) = U(k)×U(k)'
     
  3. 计算卡尔曼增益矩阵
    K(k) = C(k)^×H(k)'×[H(k)×C(k)^×H(k)' R(k)]^(-1)
    R(k) = N(k)×N(k)'
     
  4. 更新估计
    X(k)~=X(k)^ K(k)×[Y(k)-H(k)×X(k)^]
     
  5. 计算更新后估计协防差矩阵
    C(k)~ = [I-K(k)×H(k)]×C(k)^×[I-K(k)×H(k)]' K(k)×R(k)×K(k)'
     
  6. X(k 1) = X(k)~
    C(k 1) = C(k)~
    重复以上步骤
  7.  

C语言实现Kalman

#include "stdlib.h"
  #include "rinv.c"
  
int lman(n,m,k,f,q,r,h,y,x,p,g)
  
int n,m,k;
  
double f[],q[],r[],h[],y[],x[],p[],g[]; 

int i,j,kk,ii,l,jj,js;  

  double *e,*a,*b;  

  e=malloc(m*m*sizeof(double));    l=m;   

if (l<n)

 l=n;  

 a=malloc(l*l*sizeof(double));  

  b=malloc(l*l*sizeof(double)); 

  for (i=0; i<=n-1; i )     

 for (j=0; j<=n-1; j )       

  { ii=i*l j; a[ii]=0.0;
     
for (kk=0; kk<=n-1; kk )           

 a[ii]=a[ii] p[i*n kk]*f[j*n kk];        

}    

for (i=0; i<=n-1; i )      

for (j=0; j<=n-1; j )      

{ ii=i*n j; p[ii]=q[ii];       

  for (kk=0; kk<=n-1; kk )         

   p[ii]=p[ii] f[i*n kk]*a[kk*l j];   

}
for (ii=2; ii<=k; ii )     

  for (i=0; i<=n-1; i )       

for (j=0; j<=m-1; j )        

   { jj=i*l j; a[jj]=0.0;      

  for (kk=0; kk<=n-1; kk )  

  a[jj]=a[jj] p[i*n kk]*h[j*n kk];     

   }       

 for (i=0; i<=m-1; i )      

for (j=0; j<=m-1; j )         

{ jj=i*m j; e[jj]=r[jj];          

 for (kk=0; kk<=n-1; kk )        

 e[jj]=e[jj] h[i*n kk]*a[kk*l j];     

 }     

  js=rinv(e,m);      

  if (js==0)       

  { free(e); free(a); free(b); return(js);}   

   for (i=0; i<=n-1; i )     

   for (j=0; j<=m-1; j )        

   { jj=i*m j; g[jj]=0.0;        

 for (kk=0; kk<=m-1; kk )  

 g[jj]=g[jj] a[i*l kk]*e[j*m kk];    

 }        

for (i=0; i<=n-1; i )       

{ jj=(ii-1)*n i; x[jj]=0.0;       

 for (j=0; j<=n-1; j )   

 x[jj]=x[jj] f[i*n j]*x[(ii-2)*n j];    

 }        

for (i=0; i<=m-1; i )         

  { jj=i*l; b[jj]=y[(ii-1)*m i];         

   for (j=0; j<=n-1; j )       

   b[jj]=b[jj]-h[i*n j]*x[(ii-1)*n j];   

 }      

 for (i=0; i<=n-1; i )      

    { jj=(ii-1)*n i;      

      for (j=0; j<=m-1; j )           

  x[jj]=x[jj] g[i*m j]*b[j*l];       }       

 if (ii<k)     

     for (i=0; i<=n-1; i )        

    for (j=0; j<=n-1; j )            

   { jj=i*l j; a[jj]=0.0;            

    for (kk=0; kk<=m-1; kk )         

    a[jj]=a[jj]-g[i*m kk]*h[kk*n j];      

        if (i==j) a[jj]=1.0 a[jj];              }        

    for (i=0; i<=n-1; i )            

for (j=0; j<=n-1; j )          

     { jj=i*l j; b[jj]=0.0;             

   for (kk=0; kk<=n-1; kk )               

   b[jj]=b[jj] a[i*l kk]*p[kk*n j];              }     

      for (i=0; i<=n-1; i )          

  for (j=0; j<=n-1; j )           

    { jj=i*l j; a[jj]=0.0;           

    for (kk=0; kk<=n-1; kk )          

       a[jj]=a[jj] b[i*l kk]*f[j*n kk];              }       

    for (i=0; i<=n-1; i )      

      for (j=0; j<=n-1; j )          

     { jj=i*n j; p[jj]=q[jj];          

      for (kk=0; kk<=n-1; kk )             

     p[jj]=p[jj] f[i*n kk]*a[j*l kk];         

    }          }      }  

 free(e); free(a); free(b);  

  return(js);  }

C 实现Kalman

============================kalman.h================================

// kalman.h: interface for the kalman class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_)
#define AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <math.h>
#include "cv.h"

 

class kalman  
{
public:
 
void init_kalman(int x,int xv,int y,int yv);
 CvKalman* cvkalman;
 CvMat* state; 
 CvMat* process_noise;
 CvMat* measurement;
 
const CvMat* prediction;
 CvPoint2D32f get_predict(
float x, float y);
 kalman(
int x=0,int xv=0,int y=0,int yv=0);
 
//virtual ~kalman();


};

#endif // !defined(AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_)


============================kalman.cpp================================

#include "kalman.h"
#include <stdio.h>


/* tester de printer toutes les valeurs des vecteurs */
/* tester de changer les matrices du noises */
/* replace state by cvkalman->state_post ??? */


CvRandState rng;
const double T = 0.1;
kalman::kalman(
int x,int xv,int y,int yv)
{     
    cvkalman = cvCreateKalman( 4, 4, 0 );
    state = cvCreateMat( 4, 1, CV_32FC1 );
    process_noise = cvCreateMat( 4, 1, CV_32FC1 );
    measurement = cvCreateMat( 4, 1, CV_32FC1 );
    
int code = -1;
    
    
/* create matrix data */
     
const float A[] = { 
   1, T, 0, 0,
   0, 1, 0, 0,
   0, 0, 1, T,
   0, 0, 0, 1
  };
     
     
const float H[] = { 
    1, 0, 0, 0,
    0, 0, 0, 0,
   0, 0, 1, 0,
   0, 0, 0, 0
  };
       
     
const float P[] = {
    pow(320,2), pow(320,2)/T, 0, 0,
   pow(320,2)/T, pow(320,2)/pow(T,2), 0, 0,
   0, 0, pow(240,2), pow(240,2)/T,
   0, 0, pow(240,2)/T, pow(240,2)/pow(T,2)
    };

     
const float Q[] = {
   pow(T,3)/3, pow(T,2)/2, 0, 0,
   pow(T,2)/2, T, 0, 0,
   0, 0, pow(T,3)/3, pow(T,2)/2,
   0, 0, pow(T,2)/2, T
   };
   
     
const float R[] = {
   1, 0, 0, 0,
   0, 0, 0, 0,
   0, 0, 1, 0,
   0, 0, 0, 0
   };
   
    
    cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI );

    cvZero( measurement );
    
    cvRandSetRange( &rng, 0, 0.1, 0 );
    rng.disttype = CV_RAND_NORMAL;

    cvRand( &rng, state );

    memcpy( cvkalman->transition_matrix->data.fl, A, 
sizeof(A));
    memcpy( cvkalman->measurement_matrix->data.fl, H, 
sizeof(H));
    memcpy( cvkalman->process_noise_cov->data.fl, Q, 
sizeof(Q));
    memcpy( cvkalman->error_cov_post->data.fl, P, 
sizeof(P));
    memcpy( cvkalman->measurement_noise_cov->data.fl, R, 
sizeof(R));
    
//cvSetIdentity( cvkalman->process_noise_cov, cvRealScalar(1e-5) );    
    //cvSetIdentity( cvkalman->error_cov_post, cvRealScalar(1));
 //cvSetIdentity( cvkalman->measurement_noise_cov, cvRealScalar(1e-1) );

    
/* choose initial state */

    state->data.fl[0]=x;
    state->data.fl[1]=xv;
    state->data.fl[2]=y;
    state->data.fl[3]=yv;
    cvkalman->state_post->data.fl[0]=x;
    cvkalman->state_post->data.fl[1]=xv;
    cvkalman->state_post->data.fl[2]=y;
    cvkalman->state_post->data.fl[3]=yv;

 cvRandSetRange( &rng, 0, sqrt(cvkalman->process_noise_cov->data.fl[0]), 0 );
    cvRand( &rng, process_noise );


    }

     
CvPoint2D32f kalman::get_predict(
float x, float y){
    

    
/* update state with current position */
    state->data.fl[0]=x;
    state->data.fl[2]=y;

    
    
/* predict point position */
    
/* x'k=Ak Bk
       P'k=A
k-1*AT   Q */
    cvRandSetRange( &rng, 0, sqrt(cvkalman->measurement_noise_cov->data.fl[0]), 0 );
    cvRand( &rng, measurement );
    
     
/* xk=A?xk-1 B?uk wk */
    cvMatMulAdd( cvkalman->transition_matrix, state, process_noise, cvkalman->state_post );
    
    
/* zk=H?xk vk */
    cvMatMulAdd( cvkalman->measurement_matrix, cvkalman->state_post, measurement, measurement );
    
    
/* adjust Kalman filter state */
    
/* Kk=P'kT?H'kT R)-1
       xk=x'k Kk
?zk-H'k)
       Pk=(I-Kk
)'k */
    cvKalmanCorrect( cvkalman, measurement );
    
float measured_value_x = measurement->data.fl[0];
    
float measured_value_y = measurement->data.fl[2];

    
 
const CvMat* prediction = cvKalmanPredict( cvkalman, 0 );
    
float predict_value_x = prediction->data.fl[0];
    
float predict_value_y = prediction->data.fl[2];

    
return(cvPoint2D32f(predict_value_x,predict_value_y));
}

void kalman::init_kalman(int x,int xv,int y,int yv)
{
 state->data.fl[0]=x;
    state->data.fl[1]=xv;
    state->data.fl[2]=y;
    state->data.fl[3]=yv;
    cvkalman->state_post->data.fl[0]=x;
    cvkalman->state_post->data.fl[1]=xv;
    cvkalman->state_post->data.fl[2]=y;
    cvkalman->state_post->data.fl[3]=yv;
}

 

 

]]>
Mon,14 Jan 2008 09:24:13 CST 0
<![CDATA[MATLAB RLS,RLS,Demonstration of Wiener filter,LMS ]]> .html RLS算法程序

%RLS_S.m
%RLS algorithm
%static status
%synchronous CDMA
%channel: White Gaussis Noise

function [P1,P_i_n,y,correct,E_ex,PP] = RLS_D(b,N,K,step,yN_step,S,SNR,P)

%multiuser detection
lamda=0.997;
PP=P;

for i=1:step
KK=PP*yN_step(:,i)/(lamda yN_step(:,i).'*PP*yN_step(:,i));
PP=1/lamda*(PP-KK*yN_step(:,i).'*PP);
h=PP*S(1,:).';
c=h/(S(1,:)*h);

P1(i)=(c.'*S(1,:).')^2;
P_i_n(i)=( c.'*(yN_step(:,i)-b(1,i)*S(1,:).') )^2;
%SINR(i)=P1/P_i_n;
y(i)=sign(c.'*yN_step(:,i));

E=(c.'*yN_step(:,i))^2;
E_min=1;
E_ex(i)=E-E_min;
end

correct=(y==b(1,:));

%plot(SINR);

 

[转帖]RLS,Demonstration of Wiener filter,LMS filter,Steep-descent algorithm

% Demonstration of Wiener filter,LMS filter,Steep-descent algorithm
clear;
clc;

N = 10000; %----- the length of the observation sequence
M = 2; %----- the filter length

v = randn(1,N); %----- white process as the AR excitation
a = poly(sign(randn(1,M)).*rand(1,M)); %----- coefficient of AR process

u = filter(1,a,v); %-----the input sequence

d = v; %----- the desired response

rf = xcorr(u,M,'biased');
rv = rf(M 1:2*M 1);

R = toeplitz(rv); %----- the correlation matrix of the input

pf = xcorr(d,u,M,'biased');

pv = pf(M 1:2*M 1).'; %----- the cross-correlation vector between the input and the desired response

%----- the optimal tap weight vector for Wiener filter-----
wopt = inv(R) * pv;
[V,D] = eig(R); %-----selection of a stable step size mu
lambda_max = max(diag(D));
mu = 0.9 * 2/lambda_max;

%----- the steepest descent learning-----
wsd = randn(M 1,1); %-----initial weight vector for steepest descent
total_iteration_number = 100; %-----total iteration number

for i=1:total_iteration_number
wsd = wsd mu * (pv - R*wsd);
end

%----- the LMS learning-----
wlms = randn(M 1,1); %-----initial weight vector for LMS
uv = zeros(M 1,1); %-----initial input vector

mu = 0.1*2/lambda_max %-----step size mu for LMS

for n=1:N;
uv(2:M 1) = uv(1:M);
uv(1) = u(n);

y = wlms' * uv;
e = d(n) - y;
wlms = wlms mu * uv * conj(e);
end;

 

% RLS Adaptive Noise cancellation

%-----Filter Parameters-----;
M = 20;
delta = 1; %%%---------------diffenrence
lamda = 0.99; %%%---------------diffenrence
mu = 0.05;
e_max = 400; %-----maximum of epochs

%-----Contants-----
pi = 3.14;
Fs = 0.01; %-----signal frequency
Fn = 0.05; %-----noise frequency

%-----Initialize-----
w = zeros(M,1); %%%---------------diffenrence
d = zeros(M,1); %%%---------------diffenrence
u = zeros(M,1); %%%---------------diffenrence
P = eye(M)/delta; %%%---------------diffenrence

%-----Generate desired signal and input(signal noise)-----
for t=1:M-1
d(t) = sin(2*pi*Fs*t);
u(t) = d(t) 0.5*sin(2*pi*Fn*t) 0.09*randn;
end
t = M;
epoch = 0;

while epoch<e_max %-----generate new input
input = sin(2*pi*Fs*t);
for i=2:M %-----shift new input into array
d(M-i 2) = d(M-i 1);
u(M-i 2) = u(M-i 1);
end
d(1) = input;
u(1) = input 0.5*sin(2*pi*Fn*t) 0.09*randn; %-----add undesired freq & random noise


output = w'*u; %-----compute filter output


%-----RLS algorithm-----
k = (P*u)/(lamda u'*P*u); %-----compute error-----

E = d(1) - w'*u;
w = w k*E;

P = (P/lamda) - (k*u'*P/lamda);

int(t-M 1) = u(1);
out(t-M 1) = output;
err(t-M 1) = E;

t = t 1;
epoch = epoch 1;

%-----plot noise and filtered signal-----
figure(2);
subplot(211),plot(t,u(1)),axis([0 e_max -2.5 2.5]),title('RLS Filter Input(Siganal Noise)'),drawnow,hold on
subplot(212),plot(t,output),axis([0 e_max -2.5 2.5]),title('RLS Filtered Signal'),drawnow,hold on
end

]]>
Sun,13 Jan 2008 23:05:22 CST 0
<![CDATA[Matlab与VC混合编程精华网页总汇zt]]> .html
  • Gui编程的一些技巧
  • GUI和相应的m可以编译成EXE吗
  • Matcom的使用
  • MATLAB GUI编程中文参考手册(for beginner)
  • MATLAB LINKS
  • MATLAB的C-C math library
  • MATLAB读取文件的问题
  • MATLAB函数结构与参数传递
  • MATLAB绘图时纵横轴比例的设置
  • MATLAB极坐标图形
  • MATLAB如何动态显示鼠标的坐标值和图像像素值
  • MATLAB如何设置GUI界面来完成数据读取
  • MATLAB如何在不同的m文件之间交换数据
  • MATLAB遗传算法工具箱函数及实例讲解
  • MATLAB遗传算法实例
  • MATLAB与C 的接口问题 - mex.mat.引擎
  • MATLAB与C 的接口问题
  • MATLAB与C的接口
  • MATLAB与VC混编-Matcom篇
  • MATLAB与VC混合编程
  • MATLAB与VC集成
  • mat文件结构分析
  • M函数文件编译成DLL文件问题请教
  • m文件与fig文件创建figure的十大差异
  • VB界面 MATLAB图像显示
  • Vc 下如何利用MATLAB工具箱进行数字信号处理
  • VC MATLAB实现卫星照片三维显示
  • VC MATLAB实现卫星照片三维显示1
  • VC MATLAB实现卫星照片三维显示2
  • VC调用MATLAB最优化工具箱函数碰到的问题
  • VC中如何调用MATLAB
  • 把m文件编程dll文件的问题 - mex
  • 创建自已的Toolbox一些方法与建议
  • 改变Figure图标的另一捷径
  • 关于matcom的资料收集与整理
  • 关于MATLAB与VC接口的新疑问 - 函数注册
  • 基于VC实现Java和Matlab的通信
  • 简单分析下MATLAB与其他应用程序语言接口的发展趋势
  • 精通VC与MATLAB联合编程1
  • 精通VC与MATLAB联合编程2
  • 精通VC与MATLAB联合编程3
  • 精通VC与MATLAB联合编程4
  • 精通VC与MATLAB联合编程5
  • 精通VC与MATLAB联合编程6
  • 精通VC与MATLAB联合编程7-编译器的使用
  • 精通VC与MATLAB联合编程8-编译器的使用
  • 精通VC与MATLAB联合编程9-综合举例一
  • 去掉MATLAB编译产生的可执行图形界面程序运行时的DOS黑窗口的一种方法
  • 如何去掉讨厌的command窗口
  • 如何使MATLAB编制的界面最大化
  • 使MATLAB变成中文版
  • 数学工具常见问题集
  • 提高MATLAB运行速度和节省空间的心得合集
  • 通过VC 调用MATLAB - 引擎
  • 完整MATLAB程序下载
  • 完整的MATLAB下遗传算法源代码
  • 我与MATLAB这三年
  • 研学shxchen0592近期做的一个非常好的gui
  • 一个很好的例子,关于matcom与VC的数据传递
  • 一些经典guide编程
  • 用MATLAB神经网络工具箱怎样编制bp神经网络
  • 用MATLAB怎么处理超声图象来获得图象分形维数
  • 在用mcc编译exe时,指定icon
  • 招聘MATLAB程序员
    转自:陆振波的个人主页
  • ]]>
    Sun,13 Jan 2008 22:58:05 CST 0
    <![CDATA[Matlab与VC混合编程精华网页总汇zt]]> .html
  • MATLAB的Active接口
  • MATLAB对C 的调用方法研究
  • Matlab和C 接口中函数注册的实现
  • Matlab和Visual C 接口中编译环境的配置
  • Matlab与C-C( )语言接口的方法
  • Matlab与C-C 的接口及其在仿真中的应用
  • Matlab与C-C 语言混合编程的几种方法
  • MATLAB与C-Visual C 混合编程的实现
  • MATLAB与C的简易接口设计
  • Matlab与C接口分析及实现
  • MATLAB与C语言的混合编程
  • MATLAB与Visual C 的混合编程
  • Matlab与Visual C 的联合应用
  • Matlab与Visual C 混合编程的实现
  • MATLAB语言及其与C-C 的混合编程
  • VC 与Matlab混合编程的快速实现
  • VC与MATLAB7 C Shared Library
  • VC与Matlab接口方法剖析
  • VC与MATLAB数学库和图形库的混合编程应用
  • Visual C 调用MATLAB程序的接口方法
  • Visual C 调用Matlab的探讨
  • Visual C 与Matlab的混合编程
  • Visual C 与Matlab的混合编程研究
  • Visual C 与Matlab之间数据交互的实现
  • Windows调用Matlab程序的解决方案
  • Windows环境中C语言对Matlab的编程
  • 基于COM的VC与Matlab的混合编程技术
  • 基于C的Matlab函数功能扩充
  • 基于MatlabAdd-in的MatlabVC混合编程的研究
  • 基于Visual C 和MATLAB的联合编程方法的研究
  • 将Matlab源程序转化为C,C
  • 利用Matcom实现Visual C 与Matlab的混合编程
  • 如何用Visual C 和MATLAB联合开发软件
  • 在 MATLAB 语言中间接实现C语言链接
  • 在C、C 中调用Matlab
  • 在MATLAB环境下创建C-C( )外部应用程序的方法
  • 在Visual C 5.0中利用Matlab实现绘图
  • 在Visual C 中调用MATLAB以实现数学算法
  • 转自:陆振波的个人主页

  • ]]>
    Sun,13 Jan 2008 22:57:11 CST 0
    <![CDATA[matlab gui编程中文参考手册]]> .html   用户界面(或接口)是指:人与机器(或程序)之间交互作用的工具和方法。如键盘、鼠标、跟踪球、话筒都可成为与计算机交换信息的接口。
          图形用户界面(graphical user interfaces ,gui)则是由窗口、光标、按键、菜单、文字说明等对象(objects)构成的一个用户界面。用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等。
          假如读者所从事的数据分析、解方程、计算结果可视工作比较单一,那么一般不会考虑gui的制作。但是如果读者想向别人提供应用程序,想进行某种技术、方法的演示,想制作一个供反复使用且操作简单的专用工具,那么图形用户界面也许是最好的选择之一。
          matlab为表现其基本功能而设计的演示程序demo 是使用图形界面的最好范例。matlab的用户,在指令窗中运行demo 打开那图形界面后,只要用鼠标进行选择和点击,就可浏览那丰富多彩的内容。
    即便比较熟悉matlab的读者,在他初次编写gui程序时,也会感到棘手。为使读者获得制作自己gui的体验,本章“入门”节提供了一个简单的示例。读者只要输入所提供的程序,就可引出相应的界面。
    本章第2节叙述图形用户界面的设计原则和一般制作步骤。第3、4节分别介绍用户菜单、用户控件的制作。出于“由浅入深”的考虑,前4节制作gui是通过m脚本文件实现的。利用m函数文件制作gui ,需要解决数据传递问题,为此专设第5节给予阐述和示例。matlab 5.x版为方便用户制作图形界面,提供了一个交互式的设计工具guide 。关于该工具的使用方法,被放在第6节中,以一个综合例题为设计目标逐步展开。
    在此提醒读者,假如要比较准确的理解本章程序和掌握本章内容,请先阅读第10章关于图柄的内容。
    11.1 入门
    【*例11.1-1】对于传递函数为 的归一化二阶系统,制作一个能绘制该系统单位阶跃响应的图形用户界面。本例演示:(a)图形界面的大致生成过程;(b)静态文本和编辑框的生成;(c)坐标方格控制键的形成;(d)如何使用该界面。
    (1)产生图形窗和轴位框:
    clf reset
    h=axes(unit,normalized,position,[0,0,1,1],visible,off);
    set(gcf,currentaxes,h);
    str=\fontname<隶书>归一化二阶系统的阶跃响应曲线;
    text(0.12,0.93,str,fontsize,13);
    h_fig=get(h,parent);
    set(h_fig,unit,normalized,position,[0.1,0.2,0.7,0.4]);
    h_axes=axes(parent,h_fig,...
    unit,normalized,position,[0.1,0.15,0.55,0.7],...
    xlim,[0 15],ylim,[0 1.8],fontsize,8);

    图 11.1-1 产生坐标轴
    (2)在坐标框右侧生成作解释用的“静态文本”和可接受输入的“编辑框”:
    h_text=uicontrol(h_fig,style,text,...
    unit,normalized,position,[0.67,0.73,0.25,0.14],...
    horizontal,left,string,<输入阻尼比系数,zeta =>);
    h_edit=uicontrol(h_fig,style,edit,...
    unit,normalized,position,[0.67,0.59,0.25,0.14],...
    horizontal,left,...
    callback,[...
    z=str2num(get(gcbo,string));,...
    t=0:0.1:15;,...
    for k=1:length(z);,...
    s2=tf(1,[1 2*z(k) 1]); ,...
    y(:,k)=step(s2,t);,...
    plot(t,y(:,k));,...
    if (length(z)>1) ,hold on,end,,...
    end;,...
    hold off,]);

    图 11.1-2 在图形界面中添加编辑框和文本框

    (3)形成坐标方格控制按键:
    h_push1=uicontrol(h_fig,style,push,...
    unit,normalized,position,[0.67,0.37,0.12,0.15],...
    string,grid on,callback,grid on);
    h_push2=uicontrol(h_fig,style,push,...
    unit,normalized,position,[0.67,0.15,0.12,0.15],...
    string,grid off,callback,grid off);

    图 11.1-3 添加了两个按键的图形界面

    (4)输入阻尼比系数 ,可得单位阶跃响应曲线:

    图 11.1-4 输入标量阻尼比所得到的响应曲线



    图 11.1-5 输入阻尼比数组所得到的一组响应曲线

     

    11.2 图形用户界面的设计原则和一般步骤
    11.2.1 设计原则
    11.2.2 一般制作步骤
    11.3 界面菜单(uimenu)
    11.3.1 图形窗的标准菜单
    【例11.3.1-1】本例说明:如何隐藏和恢复标准菜单的显示。
    (1)获得缺省设置的标准菜单
    figure

    (2)隐去标准菜单的两种方法
    set(h_fig , menubar,none);
    set(gcf,menubar,menubar);

    (3)恢复图形窗上标准菜单
    set(gcf,menubar,figure);

    图 11.3.1-1 含有菜单条的图形窗 图 11.3.1-2 移去菜单条的图形窗

     

    11.3.2 自制的用户菜单
    【*例11.3.2-1】本例演示:如何自制一个带下拉菜单表的用户菜单(如图11.3.2-1所示)。该菜单能使图形窗背景颜色设置为兰色或红色。
    figure %创建一个图形窗
    h_menu=uimenu(gcf,label,color); %制作用户顶层菜单项color <2>
    h_submenu1=uimenu(h_menu,label,blue,... %制作下拉菜单项blue <3>
    callback,set(gcf,color,blue)); %<4>
    h_submenu2=uimenu(h_menu,label,red,... %制作下拉菜单red <5>
    callback,set(gcf,color,red)); %<6>

    图 11.3.2-1 创建用户菜单示例

     

    11.3.3 用户菜单的属性
    11.3.3.1 回调属性和菜单名
    【*例11.3.3.1-1】本例的目标是:在图形窗上自制一个名为【test】的“顶层菜单项”;当用鼠标点动该菜单项时,将产生一个带分格的封闭坐标轴。通过本例说明:(a)回调属性的运作机理;(b)用户顶层菜单项的制作(c)uimenu属性的设置方法;(d)复杂字符串的构成方法和注意事项。
    (1)在matlab指令窗中运行以下程序可产生带分格的封闭坐标轴(见图11.3.3.1-1)
    grid on,set(gca,box,on)


    图11.3.3.1-1 带分格的封闭坐标轴

    (2)在matlab指令窗中用以下eval指令可产生与图11.3.3.1-1相同的界面
    eval(grid on,set(gca,box,on))


    (3)产生图11.3.3.1-2界面的uimenu的书写格式一:直接连续表示法
    uimenu(label,test,callback,grid on,set(gca,box,on),)

    图11.3.3.1-2 通过顶层菜单test形成的带分格的封闭坐标轴

    (4)产生图11.3.3.1-2界面的uimenu的书写格式二:方括号续行号表示法
    uimenu(label,test, ...
    callback,[grid on, , ...
    set(gca,box,on);])


    (5)产生图11.3.3.1-2界面的uimenu的书写格式三:串变量法
    lpv=test;
    cpv=[grid on,,set(gca,box,on),];
    uimenu(label, lpv, callback , cpv)

    (6)产生图11.3.3.1-2界面的uimenu的书写格式四:构架表示法
    ps.label=test;
    ps.callback=[grid on;,set(gca,box,on);];
    uimenu(ps)

     

    11.3.3.2 设置简捷键或快捷键
    【*例11.3.3.2-1】本例目标:使图11.3.2-1所示菜单成为图11.3.3.2-1那样,color菜单项及其下拉的blue菜单各带一个简捷键,而另一项下拉菜单red带一个快捷键。
    [exm11332_1.m]
    figure
    h_menu=uimenu(gcf,label,&color); %带简捷键c的用户菜单color <2>
    h_submenu1=uimenu(h_menu,label,&blue,... %带简捷键b的的下拉菜单blue <3>
    callback,set(gcf,color,blue));