Matlab笔记之一 ---- 符号工具箱的应用(待续)

[复制链接]
zhenghui 发表于 2008-5-1 13:21:44
ans 计算结果的缺省变量名
eps 机器零阈值
nargin 函数输入宗量数目
nargout 函数输出宗量数目
realmax 最大正实数   
realmin 最小正实数

求极限
limit(f, x, a) 若a=0,且是对x求极限,可简写为limit(f)
limit(f, x, a, ’left’) 左趋近于a
limit(f, x, a, ’right’) 右趋近于a
limit(f, a) 求函数f在符号findsym(f)趋于a的极限

syms x
limit((cos(x)-exp(-x^2/2))/x^4)

syms x t
limit((1+t/(2*x))^(4*x),x,inf)

1 diff(f, x) 表示对f(这里f是一个函数表达式)求关于符号变量x的一阶导数。若x缺省,则表示求f对预设独立变量的一阶导数。
2 diff(f, x, n) 表示对f求关于符号变量x的n阶导数。若x缺省,则表示求f对预设独立变量的n阶导数。

1 int(f) 返回f对预设独立变量的积分值;
2 int(f,v) 返回f对独立变量v的积分值;
3 int(f,a,b) 返回f对预设独立变量的积分值,积分区间为[a,b],a和b为数值式;
4 int(f,v,a,b) 返回f对独立变量的积分值,积分区间为[a,b],a和b为数值式;
5 int(f,m,n) 返回f对预设变量的积分值,积分区间为[m,n],m和n为符号式;

collect(F) 将表达式F中相同幂次的项合并
expand(F) 将表达式F展开 factor(F) 将表达式F因式分解
simplify(F) 利用代数上的函数规则对表达式F进行化简
simple(F) 以尽可能的办法将F表达式再做化简,目的是使表达式以最少的字表示出来

collect(f1)
f1=sym('(a-1)^2+(b+1)^2+a+b')
collect(f1)
expand(f1)
f2=sym('a^3-1')
factor(f2)
f3=sym('1/a^4+2/a^3+3/a^2+4/a+5')
simplify(f3)
simple(f3)
simplify函数利用代数上的函数规则对表达式进行化简,如果其中的F为符号矩阵,则会对逐个元素进行化简。而simple函数用来求符号表达式或矩阵的最简形式。该函数会尝试用多种不同化简方法对F进行化简,并显示所有能够化简F的方法,最后返回F的最简形式。如果F是一个矩阵,则返回的结果是整个矩阵的最简形式,而不一定是其中某一个元素的最简形式。从上例可以看出,simple使用了多种方法,能够改善simplify的结果,而simplify返回的不一定是最简结果。

求反函数与复合函数
g=finverse(f,v)       对指定自变量为v的函数f(v),求反函数g(v);
g=finverse(f)         对缺省自变量求反函数g;
fg=compose(f,g)       求f=f(x)和g=g(y)的复合函数fg=f(g(y));
fg=compose(f,g,z)     求f=f(x)和g=g(y)的复合函数fg=f(g(z));
fg=compose(f,g,x,z)   求f=f(x)和g=g(y)的复合函数fg=f(g(z)),其中x是f的自变量; fg=compose(f,g,x,y,z) 求f=f(x)和g=g(y)的复合函数fg=f(g(z)),其中x是f的自变量,其中y是g的自变量;

syms a x y
g=finverse(1/tan(x))
g=finverse(1/tan(a*x),x)

syms x y z t u
f=1/(1+x^2);
g=sin(y);
h=x^t;
p=exp(-y/u);
compose(f,g)
compose(f,g,t)
compose(h,g,x,z)
compose(h,g,t,z)
compose(h,p,x,y,z)
compose(h,p,t,u,z)


求函数的泰勒(Taylor)展式
taylor(f,n)   求函数f的n阶Maclaurin展式。如n缺省,则表示求f的5阶展式。
taylor(f,n,a) 求函数f在x=a的n-1阶泰勒展式。如n缺省,则表示求f在x=a的5阶泰勒展式。

syms x
y=taylor(cos(x),5)

MATLAB软件解常微分方程的函数为:
dsolve(‘equation’,’condition’)
其中,equation代表常微分方程(组),condition为初始条件,如果初始条件没有给出,则给出通解形式。
在函数 dsolve所包含的equation中,用字母D来表示求微分,D的数字表示几重微分,D后的变量为因变量,并默认所有这些变量都是对自变量t求导。如”Dny”表示y的n阶导数。

dsolve('Dy=2*x+y','x')
dsolve('D2y=1+Dy','y(0)=1','Dy(0)=0')
dsolve('2*D2y+Dy=8*sin(2*x)+exp(-x)','y(0)=1,Dy(0)=0','x')

dsolve函数还可以用于求微分方程组的通解或初值解,如
[x,y]=dsolve('Dx=y+x,Dy=2*x')
[x,y]=dsolve('Dx=y+x,Dy=2*x','x(0)=0,y(0)=1')

用于求解方程(组)的函数为 solve(f,v) 对指定自变量v解符号方程f。如v省略,表示对预设变量解符号方程f。
f='a*x^2+bx+c'
solve(f)

解代数方程组的指令是: solve(equa1,equa2,…,equan)
eq1=sym('x+y+z=10')
eq2=sym('x-y+z=0')
eq3=sym('2*x-y-z=-4')
[x,y,z]=solve(eq1,eq2,eq3)

[x,y]=solve('x^2+x*y+y=3','x^2-4*x + 3=0')

求多项式根的指令:
roots(p) 这里p是多项式的系数作成的行向量,MATLAB软件约定系数按降幂的方式排列。该指令在运行时对次数不超过20的多项式比较可靠。

p=[-2,5.2,-4.8,7,0,2,9.8,1] %p为多项式降序排列的各个系数
roots(p)

求一元函数零点的指令:
fzero(function,x0)
其中function是被用来求零点的函数或者是函数表达式。x0是一个数或者一个二元向量。当x0是一个数时,指令将在x0的附近寻找函数function的一个近似零点;当x0是一个二元向量[a,b]时,指令将在区间[a,b]内寻找函数function的一个近似零点。

f='x-exp(-x)'
x0=[0,1]
fzero(f,x0)

MATLAB绘图功能应用示例
ezplot(f,[a,b]) 在区间[a,b]绘制f(a,b)=0的函数图。当区间缺省时,表示在默认区间-2π<a<2π和2π<b<2π绘制f(a,b)=0的函数图;
ezplot(x,y,[tmin,tmax]) 在区间tmin<t<tmax绘制x(t)=0,y(t)=0的函数图。当区间缺省时,表示在默认区间2π<t<2π绘制x(t)=0,y(t)=0的函数图;
fplot(fun,lims) 在指定区间lims=[xmin,xmax]绘制字符串fun所指定的函数图。

f=sym('sin(x)')
ezplot(f,[0,2*pi]) % 或 ezplot('sin(x)', ,[0,2*pi])

syms t
ezplot(cos(3*t)*cos(t)','cos(3*t)*sin(t)',[0,pi])

syms x
fplot('exp(x)-x',[0,1])

53 条回复


zhenghui 发表于 2008-5-1 13:24:24

Matlab笔记之三 ---- 非线性方程组求解算法

求方程根的几种常用方法:
搜索法
a=0.001;
step=3*pi/100000;
for i=0:step:8*pi
   x=4*cos(i);
   y=4*sin(i);
   z=i;
   d=abs(x+y+0.5*z-2)/sqrt(1+1+0.25);
if d<=a
      i
end
end
a=0.001
thetai=[]
step=8*pi/100000
for i=0:step:8*pi
   x=4*cos(i)
   y=4*sin(i)
   z=i
   d=abs(x+y+0.5*z-2)/sqrt(1+1+0.25)
if d<=a %只有满足精度时才执行循环
    if isempty(thetai) %首先判断是否为空,将第一个放到thetai
          thetai=[thetai,i]
    else     %假如不为空,判断是否与前一结果差开两个步长
       if abs(i-thetai(length(thetai)))>2*step
            thetai=[thetai,i];
       else   %否的话与前一值相加初二
thetai(length(thetai))=(thetai(length(thetai))+i)/2
       end
    end
end
end
x=4*cos(thetai)
y=4*sin(thetai)
z=thetai
区间二分法:
与对分查找法相同
1 区间二分法求出的仅仅是方程的一个单根,如果方程有重根或者多个根时,在做区间二分法时就会出现分叉,这样方程有几个根,就会产生几个实数序列,每一个实数序列的极限便是方程的一个根
2 通常用区间二分法为一些迭代法提供靠近x^*的初始选代值;
3 区间二分法的缺点是不能求方程的复数根。
format long
   a=5;
   b=6;
   x1=a;
   x2=b;
   f1=4*cos(x1)+4*sin(x1)+0.5*x1-2;       f2=4*cos(x2)+4*sin(x2)+0.5*x2-2;
   step=0.000001;
   ii=0;
while abs(x1-x2)>step
   ii=ii+1;
   x3=(x1+x2)/2;
   f3=4*cos(x3)+4*sin(x3)+0.5*x3-2;
if f3~=0
   if f1*f3<0
     x2=x3;
   else
     x1=x3;
   end
end
end
x3
f=[4*cos(x3)+4*sin(x3)+0.5*x3] disp(['迭代次数:',num2str(ii),'次'])
牛顿迭代法求解:
在方程f(x)=0有实数根的情况下,若能够将方程等价地转化成x=g(x)的形式,然后取一个初始值x0代入x=g(x)的右端,算得x1=g(x0),再计算x2=g(x1),这样依次类推
x(k+1)=g(x(k))
可以得到一个序列xk,通常称g(x)为迭代函数,序列xk为由迭代函数产生得迭代序列,x0为迭代初始值。
同一个方程,不同等价形式的转换产生的迭代法可能收敛,也有可能发散.关于迭代法的敛散性判定有下面的定理(也称李普希兹(Lipschitz定理):
如果迭代函数g(x)在区间[a,b]上连续,且满足以下条件,
1 对于任意的x=[a,b],有g(x)=[a,b]
2 在区间内(a,b)内,函数g(x)满足Lipschitz条件,即存在常数L>0,使得对于任意的x,y=(a,b),都有|g(x)-g(y)|=<L|x-y|,如果有L<1,则迭代格式xk+1=g(xk),k=0,1,2,..
对于任意的迭代初始值x0=[a,b]均是收敛的
这里与x和y无关的正常数L称为Lipschitz常数。
一种较为特殊得迭代法为牛顿(Newton)迭代法
xk+1=xk-f(xk)/f'(xk)
相应迭代函数为 g(x)=x-f(x)/f'(x)
Newton迭代法的几何意义:它的第k+1次迭代值就是曲线y=f(x)在点(xk,f(xk))处切线y-f(xk)=f'(xk)(x=xk)与轴的交点的横坐标,
%解方程:f=4*(cos(x1)+sin(x1)+0.5*x1-2)=0
x0=9.6;
x1=x0-(4*(cos(x0)+sin(x0))+0.5*x0-2)/(4*(cos(x0)-sin(x0))+0.5);
while abs(x1-x0)>0.000001
    x0=x1;
x1=x1-(4*(cos(x0)+sin(x0))+0.5*x0-2)/(4*(cos(x0)-sin(x0))+0.5);
end
f=4*(cos(x1)+sin(x1)+0.5*x1-2)

弦截法:
单点弦截法:
连接两个端点与作弦(a,f(a)) 与(b,f(b))作弦,此弦与轴交点的横坐标设为 x1.
如果f(x1)=0,则x1即为所求根,否则选取(x1,f(x1))点和点(a,f(a))(该点的选取要满足条件f(a)与f''(x)同号,并改记为(x0,f(x0))。再做弦
此弦与轴交点的横坐标设为 x2,依次类推,其迭代格式即为
xk+1=xk-f(xk)*(xk-x0)/(f(xk)-f(x0)
双点弦截法:
无固定点
xk+1=xk-f(xk)*(xk-xk-1)/(f(xk)-f(xk-1)
format long
nx=[];
nx(1)=5;
nx(2)=nx(1)-(2^nx(1)-nx(1)^2-1)/(2^nx(1)*log(2)-2*nx(1));
k=1;
while abs(nx(k+1)-nx(k))>=10^(-6)
k=k+1;
nx(k+1)=nx(k)-(2^nx(k)-nx(k)^2-1)/(2^nx(k)*log(2)-2*nx(k));
end
nk=k+1; disp(['牛顿迭代法迭代次数:',num2str(nk),blanks(4),'方程的解:',num2str(nx(nk))])
dx=[];
dx(1)=5; dx(2)=dx(1)-(2^dx(1)-dx(1)^2-1)/((2^3-3^2-1)-(2^5-5^2-1))*(3-5);
k=1;
while abs(dx(k+1)-dx(k))>=10^(-6)
k=k+1;
dx(k+1)=dx(k)-(2^dx(k)-dx(k)^2-1)/((2^dx(k)-dx(k)^2-1)-(2^5-5^2-1))*( dx(k)-5);
end
disp(['单点迭代法迭代次数:',num2str(k),blanks(4),'方程的解:',num2str(dx(k))])
sx=[];
sx(1)=5;
sx(2)=3;
k=1;
while abs(sx(k+1)-sx(k))>=0.000001
k=k+1;
sx(k+1)=sx(k)-((2^sx(k)-sx(k)^2-1)/((2^sx(k)-sx(k)^2-1)-(2^sx(k-1)-sx(k-1)^2-1)))*(sx(k)-sx(k-1));
end
sk=k+1;
disp(['双点迭代法迭代次数:',num2str(sk),blanks(4),'方程的解:',num2str(sx(sk))])
x=3:0.05:5;
y=2.^x-x.^2-1;
yn=zeros(1,nk);
yd=zeros(1,sk);
subplot(1,2,1)
plot(x,y,sx,yd,'*')
title('双点弦截法')
gtext('y=2^x-x^2-1')
subplot(1,2,2)
plot(x,y,nx,yn,'*')
title('牛顿迭代法')
gtext('y=2^x-x^2-1')


zhenghui 发表于 2008-5-1 19:36:57

Matlab笔记之四---- 概率分布Poisson分布

Matlab笔记之四---- 概率分布Poisson分布
概率密度函数 poisspdf(x,lamda)
分布函数poisscdf(X,lamda)
逆概率分布函数poissinv(F,lamda)
x=[0:15]';
y1=[];
y2=[];
lam1=[1,2,5,10];
for i=1:length(lam1)
    y1=[y1,poisspdf(x,lam1(i))];
    y2=[y2,poisscdf(x,lam1(i))];
end
plot(x,y1), figure; plot(x,y2)
正态分布
y=normpdf(x,mu,row)
F=normcdf(x,mu,row)
x=norminv(F,mu,row)
x=[-5:.02:5]';
y1=[]; y2=[];
mu1=[-1,0,0,0,1];
sig1=[1,0.1,1,10,1];
sig1=sqrt(sig1);
for i=1:length(mu1)
   y1=[y1,normpdf(x,mu1(i),sig1(i))];
   y2=[y2,normcdf(x,mu1(i),sig1(i))];
end
plot(x,y1);
figure;
plot(x,y2)
gamma 分布
y=gampdf(x,a,lamda)
F=gamcdf(x,a,lamda)
x=gaminv(F,a,lamda)
x^2 分布
y=chi2pdf(x,k)
F=chi2cdf(x,k)
x=chi2inv(F,k)
T分布
y=tpdf(x,k)
F=tcdf(x,k)
x=tinv(F,k)
Rayleigh分布
y=raylpdf(x,b)
F=raylcdf(x,b)
x=raylinv(x,b)
F分布
y=fpdf(x,a,b)
F=fcdf(x,a,b)
x=finv(F,a,b)
随机数发生器 rand randn函数
此类函数均为随机数发生器,每次调用时将返回不同的随机数组。实际上这些表面上看来是随机的数是通过确定的数学算法生成的,所以rand这类函数又称为伪随机数生成器(pseudorandom
number generators)。
x= rand(n,m)        产生(n×m)维的[0,1]区间均匀分布随机数组
正态分布随机数:满足标准正态分布随机数N(0,1)可由randn( )函数得出,其调用格式与rand( )完全一致。
其它随机数发生器:
A=gamrnd(a,lamda,n,m) %生成n*m的gamma分布伪随机数矩阵     
B=chi2rnd(k,n,m)                x^2分布
C=trna(k,n,m)                    T分布
D=frnd(p,q,n,m)                  F分布
E=raylrnd(b,n,m)                 rayleigh 分布
求向量各个元素的均值、方差和标准差:
m=mean(x),s2=var(x),s=std(x)
p=normrnd(0.5,1.5,30000,1);
[mean(p), var(p), std(p)]
gamma 分布的均值
syms x;
syms a lam positive
%p为gamma分布
p=lam^a*x^(a-1)/gamma(a)*exp(-lam*x);
m=int(x*p,x,0,inf)
s=simple(int((x-1/lam*a)^2*p,x,0,inf))

zhenghui 发表于 2008-5-1 19:41:58

Matlab笔记之五---- MATLAB 常用函数简介

一、通用命令
1.1帮助命令
demo                   启动演示程序
helpbrowser            超文本文档帮助信息
help                   在线帮助命令
helpdesk               超文本文档帮助信息
doc                    以超文本方式显示帮助文档
Helpwin                打开在线帮助窗
1.2工作空间管理
clear
从内存中清除变量和函数
quit
退出MATLAB
clc
清除命令窗口
exit
关闭MATLAB
save
把变量存入数据文件中
who
列出工作空间中的变量
load
从文件中读入数据变量
whos
列出工作内存中变量的详细信息
format
设置数据显示格式
what
列出当前目录中的Matlab文件
more
分页输出
which
查找指定函数和文件的位置
1.3路径管理
addpath
添加搜索路径
path
控制MATLAB的搜索路径
rmpath
从搜索路径中删除目录
pathtool
弹出修改搜索路径窗口
1.4操作系统指令
cd
改变当前工作目录
pwd
显示当前工作目录名
copyfile
文件拷贝
getenv
给出环境值
delete
删除文件
dos
执行DOS指令并返回结果
dir
列出文件

执行外部应用程序
mkdir
创建目录
rmdir
删除目录
二、基本运算
2.1算术运算
+ 加                  / 斜杠或右除
.* 数组乘              - 减
\
反斜杠或左除
./
数组右除
*
矩阵乘
^
矩阵乘方
.\
数组左除
dot
向量内积
cross
向量叉积
.^
数组乘方
kron
Kronecker乘积或张量积
2.2关系运算

小于

大于
==
等于
<=
小于或等于
>=
大于或等于
~=
不等于
2.3逻辑操作
&
逻辑“与”
|
逻辑“或”
~
逻辑“非”
xor
逻辑“异或”
any
有非零元素则为真
all
所有元素非零时为真
2.4特殊运算符
=
赋值号

引号
()
园括号
.
小数点

逗号
[ ]
方括号

冒号
%
注释符
{}
花括号

续行符
'
共轭转置
@
函数句柄

分号
.'
转置
三、编程语言结构
3.1控制语句
if
条件执行语句
switch
多个条件分支
else
同if一起使用
case
同switch一起使用
elseif
同if一起使用
otherwise
可同switch一起使用
end
结束for,while,if等语句
try
Try-cathch结构
for
按规定次数重复执行语句
catch
同try一起使用
while
不确定次数重复执行语句
return
返回
break
终止最内层循环
continue
for或while循环中结束本次循环
3.2计算运行
builtin
执行内联函数
evalin
跨空间计算串表达式的值
eval
运行字符串表示的表达式
feval
函数宏指令
evalc
执行MATLAB字符串
run
执行脚本文件
3.3脚本文件、函数及变量
exist
检查函数或变量是否被定义
isglobal
若是全局变量则为真
function
函数文件引导语句
mfilename
正在执行的M文件名
global
定义全局变量
persistent
定义永久变量
3.4参数处理
inputname
实际调入变量名
nargoutchk
输出变量个数检查
nargchk
输入变量个数检查
varargin
输入参数
nargout
函数输出参数的个数
varargout
输出参数
nargin
函数输入参数的个数
3.5信息显示
disp
显示矩阵和字符串内容
lasterr
最后一个错误信息
error
显示错误信息
lastwarn
最后一个警告信息
fprintf
格式化输出
warning
显示警告信息
3.6交互式输入
input
提示键盘输入
uicontrol
创建用户界面控制
keyboard
激活键盘作为命令文件
uimenu
创建用户界面菜单
pause
暂停
四、基本矩阵函数和操作
4.1基本矩阵
eye
单位矩阵
linspace
线性等分向量
ones
全1矩阵
logspace
对数等分向量
zeros
全0矩阵
meshgrid
用于三维曲面的网格坐标
rand
均匀分布随机阵
randn
正态分布随机阵
4.2矩阵基本信息
disp
显示矩阵内容
isempty
若是空矩阵则为真
length
向量的长度
isequal
若对应元素相等则为真
size
输出数组的大小
islogical
若是逻辑数则为真
ndims
输出数组的维数
isnumeric
若是数值则为真
isvector
若为向量则为真
isprime
若为素数则为真
4.3矩阵操作
tril
提取矩阵的下三角部分
reshape
改变矩阵的形状
triu
提取矩阵的上三角部分
blkdiag
生成块对角阵
fliplr
矩阵左右翻转
end
数组的长度,即最大下标
flipud
矩阵的上下翻转
find
找出非零元素的下标
rot90
矩阵逆时针旋转90度
4.4特殊变量和常量
pi
圆周率
realmax
最大浮点数
inf、Inf
无穷大
realmin
最小正浮点数
i、j
虚数单位
isfinite
若是有限数则为真
nan、NaN
不确定数
isinf
若是无穷大则为真
eps
浮点运算相对误差
isnan
若为不确定数则为真
ans
最新表达式的运算结果
4.5特殊矩阵
magic
魔方阵
company
伴随矩阵
pascal
Pascal矩阵
gallery
一些小测试矩阵
hilb
Hilbert矩阵
toeplitz
Toepllitz矩阵
invhilb
Hilbert逆矩阵
hankel
Hankel矩阵
4.6字符串与数字之间的转换
double
按ASCII码将字符串转换成数值数组
char
按ASCII码将数值数组转换成字符串
int2str
将整数直接转换为字符串
str2double
字符串转换为双精度
num2str
将数值直接转换为字符串
str2num
字符串转换为数值
mat2str
将矩阵直接转换为字符串
sprintf
格式输出字符串
sscanf
格式读入字符串
4.7字符串操作
strcat
字符串连接组合
findstr
查找字符串
strvcat
字符串竖向连接
strmatch
寻找符合条件的行
deblank
去掉字符串末尾的空格
strrep
寻找和替代
strcmp
字符串比较
symvar
寻找字符串表达式中的变量
strcmpi
字符串比较(忽略大小写)
strjust
调整字符串排列位置
strncmp
比较字符串的前n个字符
lower
转换为小写
eval
执行字符串表达式
upper
转换为大写
ischar
判断是否为字符型
blanks
产生由空格组成字字符串
4.8单元(cell)数组相关
cell
生成单元数组
num2cell
将数组矩阵转化成单元
celldisp
显示单元数组的内容
iscell
判断是否为单元类型
celldisp
图形显示单元数组的内容
五、基本数学函数
5.1三角函数
sin
正弦
sec
正割
tanh
双曲正切
asin
反正弦
asec
反正割
atanh
反双曲正切
cos
余弦
csc
余割
coth
双曲余切
acos
反余弦
acsc
反余割
acoth
反双曲余切
tan
正切
sinh
双曲正弦
sech
双曲正割
atan
反正切
asinh
反双曲正弦
asech
反双曲正割
cot
余切
cosh
双曲余弦
csch
双曲余割
acot
反余切
acosh
反双曲余弦
acsch
反双曲余割

zhenghui 发表于 2008-5-1 19:43:48

Matlab笔记之六---- 矩阵运算矩阵除法运算

Matlab笔记之六---- 矩阵运算矩阵除法运算
矩阵除法的运算符有两种:“\”和“/”,它们分别表示左除和右除。
A\B=inv(A)*B
B/A=B*inv(A)
所以只有当矩阵A可逆时,方可实现此运算。
对于矩阵算术右除相当于求x*A=B的解;
而算术左除相当于A*x=B的解。
a,b为数值时
a/b=a除b a\b=b除a
A=[2 1 -3;3 -2 2;5 -3 -1]
B=[5;5;16]
X=A\B
矩阵的转置的运算符是“'”。
B=A'       %b是A的转置。如果矩阵中有复数元素,则转置后得到的是它的复共轭。
A.'      % 非共轭转置。相当于conj(A')
permute   %广义非共轭转置
squeeze   %撤消长度为1的“孤维”,使数组降维
rand      %产生均匀分布随机数组
exp(A)    以自然数e为底,分别以A的元素为指数,求幂
sqrt(A)   对A的各元素求平方根
log(A)    对A的各元素求对数
expm(A)   A的矩阵指数函数
logn(A)   A的矩阵对数函数
sqrtm(A) A的矩阵平方根函数
A#B       A、B阵对应元素间的关系运算。#代表关系运算符
[email=A@B]A@B[/email]       A、B阵对应元素间的关系运算。@代表逻辑运算符
求方阵的行列式的值及逆的函数是:det(A)和inv(A)
求方阵的特征值及特征向量的函数是:eig(A)
在调用格式[V,D]=eig(A)中,A的特征向量以列向量的形式存放在V中,D是对角元,它表示对应的特征值。[V,D]=eig(A)
均匀采样生成一维“行”数组 : x=linspace(a,b,n)
定数对数采样法: x=logspace( a, b, n )
   即: x=[10^a, 10^a+s 10^a+2*s … 10^b ] (其中s = (b–a)/(n–1))
二维数组的创建:
直接输入法
1 整个输入数组必须以方括号“[ ]”为其首尾;
2 数组的行与行之间必须用分号“;”或回车键Enter隔离;
3 数组元素必须由逗号“,”或空格分隔。
ones(m,n),         元素全为1
diag (m,n)          对角阵
eye(m,n)            单位阵
zeros(m,n)          元素全为0
size(C)             %函数size给出矩阵C的行和列
A=diag(C)         % 取矩阵C的对角元素,此时它是一个列向量
“逻辑1”标识
A=zeros(2,5)     % 预生成一个(2×5)全零数组
A(:)=-4:5        % 运用“全元素”赋值法获得A
L=abs(A)>3       % 产生与A同维的“0-1”逻辑值数组
islogical(L)    % 判断L是否是逻辑值数组。输出若为1,则是
X=A(L)           % 把L中逻辑值1对应的A元素取出
        %所谓“逻辑1”标识法是:通过与A同样大小的逻辑值数组L中“逻辑值1”所在的位置,指出A中元素的位置。
A(r,c) 它由A的“r指定行”和“c指定列”上的元素组成 A(r,:) 它由A的“r指定行”和“全部列”上的元素组成
A(:,c) 它由A的“全部行”和“c指定列”上的元素组成
A(:) “单下标全元素”寻访。它由A的各列按自左到右的次序, 首尾相接而生成“一维长列”数组
A(s) “单下标”寻访。生成“s指定的”一维数组。s若是“行数组”(或“列数组”),则A(s)就是长度相同的“行数组”(或“列数组”)
A(L) “逻辑1”寻访,生成“一维”列数组:由与A同样大小的“逻辑数组”L中的“1”元素选出A的对应元素;按“单下标”次序排成长列组成
A(r,c)=Sa 以“双下标”方式,对子数组A(r,c)进行赋值:Sa的“行宽、列长”必须与A(r,c)的“行宽、列长”相同
A(:)=D(:) 全元素赋值方式。结果:保持A的“行宽、列长”不变。条件:A、D两个数组的总元素相等,但“行宽、列长”不一定相同
A(s)=Sa
按“单下标”方式,对A的部分元素重新赋值。结果:保持A的“行宽、列长”不变。条件:s单下标数组的长度必须与“一维数组”Sa的长度相等,但是s、Sa不一定同是“行数组”或“列数组”
A(:)=1:8
s=[2 3 5]
Sa=[10 20 30]'
A(s)=Sa
acos    反余弦      asinh 反双曲正弦    csch 双曲余割
acosh    反双曲余弦 atan 反正切         sec 正割
acot     反余切     atan2 四象限反正切 sech 双曲正割
acoth    反双曲余切 atanh 反双曲正切    sin 正弦
acsc    反余割       cos 余弦           sinh 双曲正弦
acsh    反双曲余割 cosh 双曲余弦       tan 正切
asec    反正割       cot 余切             tanh 双曲正切
asech 反双曲正割     coth 双曲余切      asin 反正弦
csc    余割
exp 指数            log10 常用对数
pow2 2的幂          log 自然对数
log2 以2为底的对数 sqrt 平方根
abs 模,或绝对值    conj 复数共轭
real 复数实部       angle 相角(弧度)
imag 复数虚部
ceil 向+∞圆整函数   rem 求余数
fix 向0圆整函数      round 向圆整函数
floor 向-∞圆整函数 sign 符号函数
mod 模余求余
cart2sphl    直角坐标变为球坐标
pol2cart     柱(或极)坐标变为直角坐标
cartpol      直角坐标变为柱(或极)坐标
sph2cart     球坐标变为直角坐标
[X,Y] = POL2CART(TH,R)   % The arrays TH and R must the same size (or either can
be scalar).TH must be in radians.
[X,Y,Z] = POL2CART(TH,R,Z)
函数meshgrid。设a=[a1 a2 a3 a4],b=[b1 b2 b3 b4],则[A,B]=meshgrid(a,b)
可生成两个(3×4)的矩阵A及B.
数量积: 求数量积的命令是: dot(a, b, dim) 此函数表示求向量a与b在维数为dim的点乘值。如果dim缺省,则返回两个同维向量a与b的数量积。
向量积: 求向量积的命令是: cross (a, b, dim)
此函数表示求向量a与b在维数为dim的叉乘值。如果dim缺省,则返回两个同维向量a与b的向量积。注意向量a与b的维数不能大于三维。
混合积:   我们可以由前面的两个命令来求三个向量的混合积:dot (a, cross (b, c))
sum函数: sum(A)
当A是向量时,sum函数将计算向量中所有元素之和,并返回此值。当A是向矩阵时,sum函数将矩阵中的元素按列相加,并返回一个长度等于矩阵A的列数的行向量。
    dim=1为列向量 dim=2 为行向量
cat:   把“大小”相同的若干数组,沿“指定维”方向,串接成高维数组
diag:   提取对角元素,或生成对角阵
flipud: 以数组“水平中线”为对称轴,交换上下对称位置上的数组元素
fliplr: 以数组“垂直中线”为对称轴,交换左右对称位置上的数组元素
kron: 按Kronecker乘法规则产生“积”数组
repmat: 按指定的“行数、列数”铺放模块数组,以形成更大的数组
reshape: 在总元素数不变的前提下,改变数组的“行数、列数”
A=reshape(1:9,3,3)
逻辑函数的运用示例:
randn('state',1),R=randn(3,6) % 创建正态随机阵
L=abs(R)<0.5|abs(R)>1.5   % 不等式条件运算,结果给出逻辑数组
R(L)=0          % “逻辑1”对应的元素赋0值
s=(find(R==0))' % 利用find获得符合关系等式条件的元素“单下标”
R(s)=111        % 利用“单下标”定位赋值
[ii,jj]=find(R==111) % 利用find获得符合关系等式条件的元素“双下标”
高维数组
cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3)
cat指令第一个输入宗量填写的数字“表示串接方向的维号”。
repmat(ones(2,3),[1,1,3])
repmat指令的第一个输入宗量是“模块数组”。第二个输入宗量指定“各维方向”铺放“模块数组”的数目。指令中[1,1,3]表示:在“行维方向”和“列维方向”各铺一块,而在“页维方向”铺3块。
reshape(1:12,2,2,3)
1 reshape的第一个输入宗量是“待重组”的数组;第二、三、四输入量是要生成的数组的“行数、列数、页数”。
2 “将生成数组的总元素数”必须与“待重组”数组的总元素相等。
3 重组时,元素放置遵循“单下标”编号规则:第一页第一列下接该页的第二列,下面再接第三列,依次类推。第一页的最后列接着第二页第一列,如此进行,直至结束。
NaN的性质:
1 NaN参与运算所得的结果也是NaN,即具有传递性。
2 非数没有“大小”概念,因此不能比较两个非数的大小。
isnan(R) %判断一个变量是否是NaN
“空”数组
which,who,whos,以及变量浏览器都可以验证它的存在。判断一个数组是否“空”数组的指令:isempty。
关系、逻辑函数
all(A)      当向量A的元素全非0时,结果才是1;否则结果是0
isequal(A,B) A,B对应元素相等时,相应元素位置取1,否则取0
any(A)     只要向量A中有非0元素,结果就是1;否则结果是0 xor(A,B)   A,B对应元素同为0,或非0时,相应位置元素取0,否则取1
isfinite(x) 对应x中有限大小元素的位置取1,其余均为0
isprime(x) 对应x中质数元素的位置取1,其余均为0
isinf(x)    对应x中无穷大小元素的位置取1,其余均为0 isreal(x)   对应x中实数元素的位置取1,其余均为0
isletter(x) 对应x中英文字母的元素的位置取1,其余均为0
isspace(x) 对应x中空格的元素的位置取1,其余均为0

zhenghui 发表于 2008-5-1 19:45:21

Matlab笔记之七---- 线性最优化MATLAB软件优化

Matlab笔记之七---- 线性最优化MATLAB软件优化工具箱提供得专门解线性规划问题得函数指令是:lp和linprog。
1   x=lp(c,A,b) 该指令是用来解线性规划问题
    c为目标函数系数,A为条件矩阵,Ax=<b
2   x=lp(c,A,b,lb,ub) 该指令是用来解线性规划问题
       Ax=<b     lb=<x=<ub
3   x=lp(c,A,b,lb,ub,x0)     x0是给出的初始点向量。
4   x=lp(c,A,b,lb,ub,x0,n),其中x0是给出的初始点向量,     n表示约束条件Ax=<b中的前n个约束是等式约束。
c=[-10,-18];
A=[5 2;2 3 ; 1 5];
b=[170;100;150];
lb=[0;0];
ub=[];
x=lp(c,A,b,lb,ub)
maxf=-c*x
linprog几种常用的调用格式:
1 x=linprog(c,A,b)
2 x=linprog(c,A,b,Aeq,beq)
3 x=linprog(c,A,b,Aeq,beq,lb,ub)
4 x=linprog(c,A,b,Aeq,beq,lb,ub,x0)
5 x= linprog(c,A,b,Aeq,beq,lb,ub,x0,options)
6 [x,fval]=linprog(c,A,b)
7 [x,fval,exitflag]=linprog(c,A,b)
8 [x,fval,exitflag,output]=linprog(c,A,b) 9
[x,fval,exitflag,output,lambda]=linprog(c,A,b)
Ax=<b    Aeq*x=beq   lb=<x=<ub   min (f)=c'*x
输入参数c是赋权行向量;x是决策向量(未知向量);A是不等式约束条件的系数矩阵;b是不等式约束条件的右端常数向量;Aeq是等式约束条件的系数矩阵;beq是等式约束条件的右端常数向量;lb与ub分别为变量取值范围的下界和上界;x0是设定的初始值选项;选项options是用来指定优化参数(具体可查看指令optimset),不选则使用默认值。
输出参数x是LP问题的最优解;输出参数fval是LP问题在最优解x处目标函数的最优值;输出参数exitflag是在求解过程中退出的条件,如果exitflag大于零表示算法收敛到所要求的最优解x,如果exitflag等于零表示在解LP问题时已经达到了迭代次数的最大限制,但是算法并没有收敛到所要求的最优解,如果exitflag小于零表示在解LP问题时寻找可行解失败。

zhenghui 发表于 2008-5-1 19:48:22

Matlab笔记之八---- 微分方程

Matlab笔记之八---- 微分方程ode23    解非刚性微分方程,低精度,使用Runge-Kutta法的二三阶算法。
ode45    解非刚性微分方程,中等精度,使用Runge-Kutta法的四五阶算法。
ode113   解非刚性微分方程,变精度变阶次Adams-Bashforth-Moulton PECE算法。
ode23t    解中等刚性微分方程,使用自由内插法的梯形法则。
ode15s    解刚性微分方程,使用可变阶次的数值微分(NDFs)算法。
ode23s    解刚性微分方程,低阶方法,使用修正的Rosenbrock公式。
ode23tb    解刚性微分方程,低阶方法,使用TR-BDF2方法,即Runger-Kutta公式的第一级采用梯形法则,第二级采用Gear法。
[t,YY]=solver('F',tspan,Yo)
解算ODE初值问题的最简调用格式。
solver指上面的指令。
tspan=[0,30];     %时域t的范围
y0=[1;0];         %y(1)y(2)的初始值
[tt,yy]=ode45(@DyDt,tspan,y0);
plot(tt,yy(:,1)),title('x(t)')
function ydot=DyDt(t,y)
ydot=[y(2); 2*(1-y(1)^2)*y(2)-y(1)]
刚性方程:刚性是指其Jacobian矩阵的特征值相差十分悬殊。在解的性态上表现为,其中一些解变化缓慢,另一些变化快,且相差较悬殊,这类方程常常称为刚性方程,又称为Stiff方程。
刚性方程和非刚性方程对解法中步长选择的要求不同。
刚性方程一般不适合由ode45这类函数求解,而应该采用ode15s等。
如果不能分辨是否是刚性方程,先试用ode45,再用ode15s。
[t,YY,Te,Ye,Ie] = solver('F',tspan,Yo,options,p1,p2,…)
解算ODE初值问题的最完整调用格式。
为了能够解出方程,要用指令odeset确定求解的条件和要求。在MATLAB中,求解方程组的指令都有默认的求解的条件和要求(由结构数组options表示),但可以用odeset修改或重新建立,也可以用odeget去获取已有的“优化选项”的信息。指令odeset和odeget用法介绍如下:
语句格式如下:
options=odeset(‘name1’,value1,’name2’,value2,…)
options=odeset(oldopts,‘name1’,value1,’name2’,value2,…)
options=odeset(oldopts,newopts)
odeset
第一种调用格式是指定各个参数的取值,对不指定取值的参数,取默认值。在不引起混淆的情况下,参数名可以只键入前面的几个字母,也不必区分大小写,如用“abst”表示AbsTol.但数值的输入必须格式正确,否则仍采用默认值。
第二种格式使用了原来的优化选项,但对其中的参数1等指定了新值。
第三种格式合并了两个优化选项oldopts newopts,重复部分取newopts的指定值):
第四种格式可在屏幕上显示如下全部可设置的参数及其默认值。
键入help odeset可查看全部参数的说明,下面对其中几个参数举例说明。
RelTol               相对误差,默认值为1e-3
AbsTol              绝对误差,默认值为1e-6
OutputFcn    输出方式,
默认值为‘odeplot’,其它选项有:
          odeplot       按时间顺序画出全部变量的解
          odephase2    二维相空间中两个变量的图形
          odephase2 三维相空间中三个变量的图形
          odeprint       打印输出
语句格式:
val=odeget(options,’name’)
这里options是由odeset设定的优化选项。
该语句从优化选项中提取指定的参数的取值。如果该参数没有指定值,则返回空阵[]。
options
odeget(options,'Reltol')
options=odeset(options,'Reltol',1e-6)
odeget(options,'Reltol')
function ydot=lorenfcn(t,y)
ydot=[-8/3*y(1)+y(2)*y(3);
    -10*y(2)+10*y(3);
    -y(2)*y(1)+35*y(2)-y(3)];
axis([10 50 -50 50 -50 50])
view(3)
hold on
title('Lorenz Attractor')
options=odeset('OutputFcn','odephas3');
[t,y]=ode23(@lorenfcn,[0 20],[0,0,eps],options);
% EPS    Floating point relative accuracy.
    EPS returns the distance from 1.0 to the next largest
    floating point number. EPS is used as a default tolerance by
    PINV and RANK, as well as several other MATLAB functions.
pdftool

zhenghui 发表于 2008-5-1 19:50:57

Matlab笔记之九---- 数组运算对字符串ASCII码

Matlab笔记之九---- 数组运算对字符串ASCII码数组的操作
upper(a)       % 使字符串中字母全部大写
w=find(a >= 'a' & a<= 'z') % 找出串数组a中,小写字母的元素位置
char(ascii_a)    % 把ASCII码转换为字符
A='这是一个算例。' % 创建中文字符串,注意“单引号对”的输入
A_s=size(A) % 串数组的大小
A56=A([5 6]) % 取串的子数组
ASCII_A=double(A) % 获取ASCII码
与英文字符情况一样,每个中文字符也占一个元素位置。但应注意,中文的ASCII码大于256 。
在直接创建多行串数组时,关键是要保证同一串数组的各行字符要相等
转换函数产生数码字符串
int2str把整数数组转换成串数组(非整数将被四舍五入后再转换)
num2str把非整数数组转换成串数组(常用于图形中,数据点的标识)
mat2str把数值数组转换成输入形态的串数组(常与eval指令配用)
abs 把串翻译成ASCII码
hex2dec   16-进制串转换为十进制整数
base2dec   X-进制串转换为十进制整数
hex2num   16-进制串转换为浮点数
bin2dec   二进制串转换为十进制整数
int2str   把整数转换为串
char      把ASCII码及其他非数值类型数据转换成字符串
mat2str   把数值矩阵转换为
eval      可调用的格式
dec2base 十进制整数转换为X进制串
num2str   把数值转换为串
dec2bin 十进制整数转换为二进制串
setstr   把ASCII码翻译成串
dec2hex 十进制整数转换为16进制串
sprintf 以控制格式把数值转换为串
double   把任何类型数据转换成双精度数值
sscanf   在格式控制下把串转换为数
fprintf 把格式化数据写到文件或屏幕
str2num 把串转换为数值
blank(n)   创建n个空格串
lower(s)   使s里的英文字母全部小写
char(s1,s2,…) 把串s1,s2等逐个写成行,形成多行数组 str2mat(s1,s2,…) 把串s1,s2等逐个写成行,形成多行数组,并删除全空行
deblank(s)      删除串尾部的空格符
strcat(s1,s2,…) 把串s1,s2等连接成长串
eval(s)       把串s当作MATLAB指令运行
strcmp(s1,s2) 若串s1,s2相等,则判”真”给出逻辑1 eval(s1,sc)   
把串s1当作MATLAB指令运行。若s1运行发生错误,则运行sc
strjust(s)    字符串的对齐方式:或右对齐,或左对齐,或对中 feval(f,x,y,…) 对输入的宗量x,y等计算函数f
strmatch(s1,s2) 逐行搜索串s2,给出以s1开头的那些行的行号 findstr(s1,s2) 在较长串中,找出短串的起始字符的下标
strncmp(s1,s2,n) 若串s1,s2的前n个字符相同,则判”真”给出逻辑1
Ischar(s)        s是字符串,则判”真”给出逻辑1
strrep(s1,s2,s3) 串s1中的所有出现s2的地方替换为s3 isletter(s)      以逻辑1指示s里文字符的位置
strtok(s)     找出第一个间隔符(空格、制表位、回车符)前的内容
isspace(s)     以逻辑1指示s里空格符的位置
strvcat(s1,s2,…)   把串s1,s2等逐个写成行,形成多行数组
Laster     MATLAB发出的最新错误信息
upper(s)   使s里的英文字母全部大写
利用cell指令创建细胞数组
C=cell(2)    % 预设(2×2)空细胞数组
C(:,1)={char('Another','text string');10:-1:1} % 对第一列细胞赋值
用图形形象化地表示细胞数组的内容
cellplot(A_C,’legend’)中的第二个输入宗量是用于显示色彩图例的。该指令用大白方格表示细胞,用小方格表示所存数组的元素,色彩表示数据属性。
构造函数创建构架数组
利用struct函数也可以方便地建立架构数组,其调用格式为 架构数组名=struc(‘域名1’,‘值1’,‘域名2’,‘值2’,…)
a1={'六号房'};a2={'3200立方米'};
green_house_4(2,3)=struct('name',a1,'volumn',a2,'parameter',[]); % <6>
T6={31.2,30.4,31.6,28.7;29.7,31.1,30.9,29.6}; % <7>
green_house_4(2,3).parameter.temperature=T6; % <8> green_house_4

zhenghui 发表于 2008-5-1 19:52:35

Matlab笔记之十---- 有关Matlab绘图plot

Matlab笔记之十---- 有关Matlab绘图plot(x,y1,x,y2,…) 以公共的x元素为横坐标值,以y1,y2,…
元素为纵坐标值绘制多条曲线。
y 黄       - 实线    . 点        < 小于号    m 紫
:点线     o 圆      s 正方形    c 青        -. 点划线
x 叉号     d 菱形    r 红        -- 虚线      + 加号
h 六角星   g 绿      * 星号      p 五角星      b 蓝
v 向下三角形 w 白    ^向上三角形 k 黑         > 大于号
AXIS EQUAL
grid on (/off)               给当前图形标记添加(取消)网络
xlable(‘string’)           标记横坐标
ylabel(‘string’)           标记纵坐标
title(‘string’)            给图形添加标题
text(x,y,’string’)         在图形的任意位置增加说明性文本信息
gtext(‘string’)            利用鼠标添加说明性文本信息
axis([xmin xmax ymin ymax]) 设置坐标轴的最小最大值
x=0:pi/10:2*pi
y1=sin(x)
y2=cos(x)
plot(x,y1,x,y2)
grid on
xlabel('independent variable X')
ylabel('Dependent Variable Y1 & Y2')
title('Sine and Cosine Curve')
text(1.5,0.3,'cos(x)')
gtext('sin(x)')
axis([0 2*pi -0.9 0.9])
hold on(/off)将新产生的图形曲线叠加到已有的图形上
subplot(m,n,k)函数,将图形窗口分隔成nm×个子图,并选择第k个子图作为当前图形,然后在同一个视图窗口中画出多个小图形。
三维曲线图:
plot3(x1,y1,z1,x2,y2,z2,...)
其中x1,y1,z1,x2,y2,z2,…等分别为维数相同的向量,分别存储着曲线的三个坐标值,该函数的使用方式和plot类似,也可以采用多种的颜色或线型(见表5.1.1)来区分不同的数据组,只需在每组变量后面加上相关字符串即可实现该功能。
mesh函数为数据点绘制网格线,图形中的每一个已知点和其附近的点用直线连接。
surf函数和mesh的用法类似,但它可以画出着色表面图,图形中的每一个已知点与其相邻点以平面连接。
x=-7.5:0.5:7.5
y=x
[X,Y]=meshgrid(x,y)
R=sqrt(X.^2+Y.^2)+eps
Z=sin(R)./R
surf(X,Y,Z)
xlabel('X 轴方向')
ylabel('Y 轴方向')
zlabel('Z 轴方向')
观察点设置:
view(azimuth,elevation)
其中方位角azimuth是观察点和坐标原点连线在x-y平面的投影和y轴负方向的夹角,仰角elevation是观察点与坐标原点的连线和x-y平面的夹角。对于这两个角度,三维图形的默认值分别是-37.5和30,二维图形的默认值是0和90。
loglog      使用对数坐标系绘图
semilogx    横坐标为对数坐标轴,纵坐标为线性坐标轴
semilogy    横坐标为线性坐标轴,纵坐标为对数坐标轴
polar       绘制极坐标图
fill        绘制实心图
bar         绘制直方图
pie         绘制饼图
area        绘制面积图
quiver      绘制向量场图
stairs      绘制阶梯图
sterm       绘制火柴杆图
[x,y] = meshgrid(-2:.2:2,-1:.15:1);
z = x .* exp(-x.^2 - y.^2);
[px,py] = gradient(z,.2,.15);
contour(x,y,z)
hold on
quiver(x,y,px,py)
hold off
axis image
QUIVER(X,Y,U,V)
The matrices X,Y,U,V must all be the same size and contain corresponding
position and velocity components (X and Y
can also be vectors to specify a uniform grid). QUIVER automatically scales the
arrows to fit within the grid.
bar,bar3,barh和bar3h,其中bar和bar3分别用来绘制二维和三维竖直方图,barh和bar3h分别用来绘制二维和三维水平直方图,调用格式是:
bar(x,y) 其中x必须单调递增或递减,y为nm×矩阵,可视化结果为m组,每组n个垂直柱,也就是把y的行画在一起,同一列的数据用相同的颜色表示;
bar(x,y,width)(或bar(y,width))指定每个直方条的宽度,如width>1,则直方条会重叠,默认值为width=0.8;
bar(…,’grouped’) 使同一组直方条紧紧靠在一起;
bar(…,’stack’) 把同一组数据描述在一个直方条上。
y=[5 3 2 9;4 7 2 7;1 5 7 3]
subplot(2,2,1)
bar(y)
x=[5 9 11]
subplot(2,2,2)
bar3(x,y)
subplot(2,2,3)
bar(x,y,'grouped')
subplot(2,2,4)
bar(rand(2,3),.75,'stack')
area用来绘制面积图,面积图在plot的基础上填充x轴和曲线之间的面积,该图用于查看某个数在该列所有数的总和中所占的比例。
pie(x)     x中的元素通过x/sum(x)进行归一化,以确定饼图中的份额
pie(x,explode) 向量explode和x元素数相同,用来指出需要分开的饼片,explode中不为零的部分会被分开。
x=[32 58 27 21 16]
explode0=[1 0 0 0 0]
subplot(1,2,1)
pie(x,explode0)
explode1=[0 0 0 0 1]
subplot(1,2,2)
pie(x,explode1)
semilogx    绘制x轴为对数标度的图形,在半对数坐标系中绘图;
semilogy    绘制y轴为对数标度的图形;
loglog      绘制两个轴都为对数间隔的图形;
polar(theta,rho)绘制极坐标图形,其中theta为相角,rho为其对应的半径。
theta=-pi:pi/80:pi
polar(theta,2*cos(3*theta))
fplot(fun,lims) 其中fun就是所要绘制的函数,可以是定义函数的M文件名,也可以是以x为变量的可计算字符串。
例如’diric(x,10)’或’[sin(x),cos(x)]’,对于向量x的每个元素,函数fun(x)必须返回一个行向量。如果fun返回[f1(x),f2(x),f3(x)],输入[x1;x2],就会返回矩阵[f1(x1)
f2(x1) f3(x3);f1(x2) f2(x2) f(x2)]。 lims=[XMIN XMAX YMIN YMAX]限定了x,y轴上的绘图空间。
DIRIC Dirichlet, or periodic sinc function Y = DIRIC(X,N) returns a matrix the
same size as X whose elements are the Dirichlet function of the elements of X.
Positive integer N is the number of equally spaced extrema of the function in
the interval 0 to 2*pi. The Dirichlet function is defined as :     d(x) =
sin(N*x/2)./(N*sin(x/2))
for x not a multiple of 2*pi +1 or -1 for x a multiple of 2*pi. (depending on
limit)
ezplot(f)
x轴的绘图区域为]2,2[ππ],但我们可以用ezplot(f,xmin,xmax)或ezplot(f,[xmin,xmax])来指定x的范围。
交互式图形指令:
[x,y]=ginput(6)
从图形上选取6个点 此时,ginput指令将把当前图形调入前台,同时光标变为十字叉,移动光标,使交叉点落在目标点上,单击鼠标,即可获得该点数据。
fplot('humps',[0 1])
ginput(6)
切片图CMD:slice
X=[-2:0.1:2];Y=[-2:0.1:2];Z=[-2:0.1:2];     %x,y,z的范围
[x,y,z]=meshgrid(X,Y,Z);               
v=5*(x.^2+y.^2)+5.*z.^2;               % v的值
xi=[-1 0 1];yi=[0];zi=[0];                %切片的位置
slice(x,y,z,v,xi,yi,zi)

zhenghui 发表于 2008-5-1 19:57:22

Matlab笔记之十二---- 有关图像处理读取图像

Matlab笔记之十二---- 有关图像处理读取图像I=imread('cameraman.tif')
显示图像:imshow(I) 或 image()
调整图像大小:I2=imresize(I,0.5)
写图像:imwrite(I2,'cameraman.bmp')
获得图像信息:imfinfo('cameraman.bmp')
显示图像的颜色柱状图: imhist
调整图像的强度:imadjust
e.x: I = imread('pout.tif');
        J = imadjust(I,[0.3 0.7],[]);
        imshow(I), figure, imshow(J)
        aa=get(gcf,'colormap')
图像叠加噪声:imnoise
   e.x:
   I=imread('eight.tif');
   imshow(I) ;
   J1=imnoise(I,'gaussian',0,0.02); % 叠加均值为0,方差为0.02的高斯噪声。
   figure,imshow (J1);
   J2=imnoise(I,'salt & pepper',0.04); % 叠加密度为0.04的椒盐噪声。
   figure,imshow(J2);
二维中值过滤:medfilt2
   I=imread('eight.tif');
   imshow(I) ;
   J2=imnoise(I,'salt & pepper',0.04); % 叠加密度为0.04的椒盐噪声。
    I_Filter1=medfilt2(J2,[3 3]); %窗口大小为3×3

zhenghui 发表于 2008-5-1 20:00:22

Matlab笔记之十一---- 有关M文件编写

Matlab笔记之十一---- 有关M文件编写
for循环结构:
for x = array
( commands )
end
while循环结构:
while expression
( commands )
end
a(1)=1
a(2)=1
i=2
while a(i)<=10000
a(i+1)=a(i-1)+a(i)
i=i+1
end;
i
a(i)
单分支:
if expression
(commands)
end
双分支:
if expression
   (commands1)
else
   (commands2)
end
多分支:
if expression1
    (commands)
elseif expression2
    (commands)
…………
else
   (commands)
end
如果判决条件expression为一个空数组,MATLAB认为条件为假(false)。
表达式有时由多个逻辑子表达式组成的,MATLAB将尽可能少地检测这些子表达式的值。例如,表达式为:(子表达式1
|子表达式2),当MATLAB检测到子表达式1的值为真时,它就认为表达式为真,而不再对子表达式2进行检测。又如,表达式为:(子表达式1 &
子表达式2),当MATLAB检测到子表达式1的值为假时,它就认为表达式值为假的,从而跳过该结构。
if指令判决和break指令的配合使用,可以强制终止for循环或while循环。
switch-case结构:
switch ex        ex为一标量或字符串。
case test1
(commands 1)     当ex等于test1时,执行组命令1,然后跳出该结构。
case test2
……
case testk
(commands k)     当ex等于testk时,执行组命令k,然后跳出该结构。 otherwise        otherwise指令可以不存在
(commands)       表达式不等于前面所有检测值时,则执行该组命令。
end
1
当遇到switch结构时,MATLAB将表达式的值依次和各个case指令后面的检测值进行比较。如果比较结果为假,则取下一个检测值再比较,一旦比较结果为真,MATLAB将执行相应的一组命令,然后跳出该结构。如果所有的比较结果都为假,即表达式的值和所有的检测都不等,MATLAB将执行otherwise后面的一组命令。由此可见上述结构保证了至少有一组命令会得到执行。
2 switch指令后面的表达式应为一个标量或者为一个字符串。对于标量形式的表达式,比较这样进行:表达式 = =
检测值i。而对于字符串,MATLAB将调用函数strcmp 来实现比较:strcmp(表达式,检测值i)。
3
case指令后面的检测值不仅可以为一个标量值或一个字符串,还可以为一个元胞数组。如果一个检测值是一个元胞数组,MATLAB将把表达式的值和该元胞数组中的所有元素进行比较;如果元胞数组中某个元素和表达式的值相等,MATLAB认为此次比较结果为真,从而执行与该检测值相应的一组命令。
for i=1:10
a{i}=89+i
b{i}=79+i
c{i}=69+i
d{i}=59+i
end
c=[d,c]
Name={' Jack','Marry','Peter',' Rose',' Tom'};
Mark={72,83,56,94,100};
Rank=cell(1,5);
% 创建一个含5个元素的架构数组S,它有三个域 S=struct('Name',Name,'Marks',Mark,'Rank',Rank);
for i=1:5
switch S(i).Marks
case 100 % 得分为100时
   S(i).Rank='满分';    % 列为‘满分’等级
case a                  % 得分在90和99之间
   S(i).Rank='优秀';    % 列为‘优秀’等级
case b                  % 得分在80和89之间
   S(i).Rank='良好';    % 列为‘良好’等级
case c                  % 得分在60和79之间
   S(i).Rank='及格';    % 列为‘及格’等级
Otherwise               % 得分低于60
S(i).Rank='不及格';   % 列为‘不及格’等级
end
end
                        % 将学生姓名,得分,登记等信息打印出来
disp(['学生姓名 ',' 得分 ',' 等级']);
disp(' ')
for i=1:5
disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);
end;
try-catch结构:
try
(commands1) 组命令1总被执行。若正确,则跳出此结构。
catch
(commands2) 仅当组命令1出现执行错误,组命令2才被执行。
end
只有当MATLAB在执行组命令1时出现了错误后,组命令2才会被执行。可调用lasterr函数查询出错原因。如果函数lasterr的运行结果为一个空串,则表明组命令1被成功执行了
仅使用lasterr函数返回最近的出错提示。
clear
N=3
A=magic(3)
try
     N=N+1
     A_N=A(N,:)
catch
     A_end=A(end,:)
end
lasterr
v=imput(‘message’)
v=input(‘message’,‘s’)
该指令执行时,“控制权”交给键盘;待输入结束,按下Enter键,“控制权”交还MATLAB。Message是提示用的字符串,第一种格式用于键入数值、字符串、元胞数组等数据;第二种格式,不管键入什么,总以字符串形式赋给变量v
keyboard:
遇到keyboard时,将“控制权”交给键盘,用户可以从键盘输入各种MATLAB指令。仅当用户输入return指令后,“控制权”才交给程序。它与input的区别是:它允许输入任意多个MATLAB指令,而input只能输入赋给变量的“值”
break:
可以使包含该指令的while、for循环终止;也可以在if-end、switch-case、try-catch中导致中断。
continue
跳过位于其后的循环中的其他指令,执行循环的下一个迭代
pause   pause(n)
第一种格式使程序暂停执行,等待用户按任意键继续;第二种格式使程序暂停n秒后,再继续执行
return
结束return指令所在函数的执行,而把控制转至主调函数或者指令窗,否则,只有待整个被调函数执行完后,才会转出。
error(‘message’)
显示出错信息message,终止程序
lasterr 显示最新出错原因,并终止程序
lastwarm 显示MATLAB自动给出的最新警告程序继续运行 warming(‘message’) 显示警告信息message,程序继续运行
全局变量定义:
Global a b
M函数文件示例:
function sa=circle(r,s)
% CIRCLE plot a circle of radii r in the line specified by s.
% r 指定半径的数值
% s 指定线色的字符串
% sa 圆面积
% circle(r) 利用蓝实线画半径为r的圆周线
% circle(r,s) 利用串s指定的线色画半径为r的圆周线
% sa=circle(r) 计算圆面积,并画半径为r的蓝色圆面
% sa=circle(r,s) 计算圆面积,并画半径为r的s色圆面
% 编写于2000年1月1日,修改于2000年2月1日。
if nargin>2
error('输入宗量太多。');
end;
if nargin==1
s='b'
end;
clf;
t=0:pi/100:2*pi;
x=r*exp(i*t);
if nargout = = 0
plot(x,s);
else
sa=pi*r*r;
fill(real(x),imag(x),s)
end
axis('square')
P码文件:
pcode FunName 在当前目录上生成FunName.p。
pcode FunName-inplace 在FunName.m所在目录上生成FunName.p。
inmem 罗列出内存中所有P码文件名。
clear FunName 清除内存中的FunName.p P码文件。
clear functions 清除内存中的所有P码文件。
MATLAB的搜索过程:
假设MATLAB在一个文件中碰到指令cow时,它将按以下步骤逐步进行检索:
1 检查cow是否一个变量名;如果不是,执行下一步。
2 检查cow是不是内建函数(Built-in Function);假如不是,执行下一步。
3 检查cow是不是cow所在的M文件中的一个子函数;假如不是,再往下执行。
4 检查cow是不是cow所在的M文件中的一个私用函数(先找cow.p,然后是cow.m);假如不是,再往下执行。
5 检查cow是不是当前目录上的文件(先找cow.p,然后是cow.m);假如不是,再往下执行。
6 检查搜索路径上是否有cow存在(先找cow.p,然后是cow.m)。
MATLAB将使用最先找到的那个cow。如果一直找不到cow,MATLAB就给出错误提示信息。
输入输出宗量检测指令:
nargin       在函数体内,用于获取实际输入宗量。
nargout      在函数体内,用于获取实际输出宗量。
nargin(‘fun’) 获取‘fun’指定函数的标称输入宗量数。
nargout(‘fun’) 获取‘fun’指定函数的标称输出宗量数。
inputname(n) 在函数体内使用,给出第n个输入宗量的实际调用变量名。
nargin,nargout,inputname本身都是函数,而不是变量
跨空间变量传递:
evalin('workspace','expression') 跨空间计算串表达式值。
evalin('workspace', 'expression1', 'expression2') 跨空间计算替代串表达式值。
1 'workspace'可取两个值:'base'和'caller'。
2
第一种调用格式的执行机理是:当'workspace'取'base'表示计算eval('expression')时,将从基本工作空间获得变量值。当'workspace'取'caller'表示计算eval('expression')时,将从主调函数工作空间获得变量值。主调函数是相对被调函数而言的。这里,被调函数是指evalin所在的函数。
(待续)

zhenghui 发表于 2008-5-1 20:06:08

Matlab笔记之十一---- 有关M文件编写

3
第二种调用格式的执行机理是:先从所在函数空间获得变量值,用eval(‘expression1’)计算原串表达式;若该计算失败,则再从'workspace'指定的(基本或主调函数)得变量值。再通过eval('expression2')计算替代串表达式。
evalin运行机理与eval的异同:
function y1=evalinzzy(a,s)
t=(0:a)/a*2*pi
y1=subevalinzzy(4,s);
%- - - - - - - - - - - - subfunction - - - - - - - - - - -
function y2=subevalinzzy(a,s)
    t=(0:a)/a*2*pi;
    ss='a*exp(i*t)';
switch s
case{'base','caller'}
    y2=evalin(s,ss);
case 'self'
    y2=eval(ss);
end
%调用该函数。
clear
a=30
t=(0:a)/a*2*pi
sss={'base','caller','self'}
for k=1:3
y0=evalinzzy(8,sss{k})
subplot(1,3,k)
     plot(real(y0),imag(y0),'r','LineWidth',3)
axis square
image
end
assignin('workspace','VN',x) 跨空间向VN变量赋值
把当前工作空间内变量x的值赋给’workspace’指定空间名的VN变量
function y=assigninxyq(x)
y=sqrt(x)
t=x^2
assignin('base','yy',t)
clear
a=30
t=(0:a)/a*2*pi
sss={'base','caller','self'}
for k=1:3
   y0=evalinzzy(8,sss{k})
   subplot(1,3,k)
     plot(real(y0),imag(y0),'r','LineWidth',3)
     axis square
     %image
end
clear
x=4
y=assigninxyq(x);
disp([blanks(5),'x',blanks(5),'y',blanks(4),'yy'])
disp([x,y,yy])
MATLAB允许一个M函数文件包含多个函数的代码。其中,第一个出现的函数称为主函数(Primary
function),该文件中的其他函数称为子函数(Subfunction)。保存时所用函数文件名与主函数定义名相同。外部程序只能对主函数进行调用。
1 在M函数文件内,主函数的位置不可改变,但子函数的排列次序可以任意改变。
2 子函数只能被处于同一文件的主函数或其他子函数调用。
3 在M函数文件中,任何指令通过“名字”对函数进行调用时,子函数的优先级仅次于内装函数。
4 同一文件的主函数、子函数的工作空间都是彼此独立的。各函数间的信息,或通过输入输出宗量传递,或通过全局变量传递,或通过跨空间指令传递。
私用函数,是指位于private目录上的M文件函数。
1 私用函数的构造与普通M函数完全相同。
2
私用函数只能被private目录的直接父目录上的M函数文件所调用。它不能被其他目录上的任何M函数、M脚本文件或MATLAB指令窗中的命令所调用,也不能被直接父目录上的M脚本文件调用。

3 M文件中,任何指令通过“名字”对函数进行调用时,私用函数的优先级虽低于内装函数和子函数,但高于其他任何目录上的函数。
串演算函数
指令、表达式、语句,以及由它们综合组成的M文件,是用户为达到自己计算目的时所最常用的形式。为提高计算的灵活性,MATLAB还提供两种演算函数:一种是“串演算函数”eval,它具有对字符串表达式进行计算的能力;另一种是“函数句柄演算函数”feval,它具有对函数句柄进行操作的能力。
y=eval(‘CEM) 执行CEM指定的计算。
[y1,y2,…]=eval(‘CEM’) 执行对CEM代表的函数文件调用,并输出计算结果。
1 eval指令的输入宗量必须是字符串。
2 构成字符串的CEM,可以是MATLAB任何合法的指令、表达式、语句或M文件名。
3 第二种格式中的CEM只能是(包含输入宗量在内的)M函数文件名。
clear
t=pi
eval('theta=t/2,y=sin(theta)')
CEM={'cos','sin','tan'}
for k=1:3
theta=pi*k/12;
y(1,k)=eval([CEM{k},'(',num2str(theta),')'])
end
feval
[y1,y2,…]=feval(FH,arg1,arg2,…) %执行函数句柄FH指定的计算。
[y1,y2,…]=feval(FN,arg1,arg2,…) %执行函数名字符串FN指定的计算。
[y1,y2,…]=feval(FIL,arg1,arg2,…) %执行内联函数FIL指定的计算。
1 第一种调用格式是MATLAB6.0版引入的新格式。其中FN是函数句柄。它用@或str2func专门创建。
2 第二种调用格式是“老格式”,目前仍能使用,但建议尽量少用或不用该格式。其中FN取“带单引号的MATLAB内装函数名或M函数文件名”。
3 第三种调用格式仅对内联函数对象使用。
4 三种调用格式中的 arg1,arg2,…是传给函数的参数。它们的含义及排列次序均由与“被计算函数的输入宗量含义及次序”一致。
5 feval与函数句柄配套使用;而eval与字符串配套使用。
6 MATLAB中的泛函指令(如fzero,ode45,explot等)都借助feval构成。
x=pi/4
Ve=eval('1+sin(x)')
rand('seed',1)
A=rand(2,2)
[email=Heig=@eig]Heig=@eig[/email]
d=feval(Heig,A)
内联函数:
inline('CE',arg1,arg2,…) 把串表达式转化为arg1,arg2等指定输入宗量的内联函数。
inline('CE',n) 把串表达式转化为x,P1,P2,…Pn等指定输入宗量的内联函数。
1 'CE'是字符串;CE必须是不包含赋值号“=”的表达式。
2 第一种调用格式是创建内联函数的最稳妥、可靠途径。输入宗量字符可表达得更自如。
3 第二种调用格式最简练,但对输入宗量的字符限制严格。输入宗量字符只能是x,P1…,Pn等。注意:P是大写字母。
4
内联函数是沟通eval,feval两个不同指令的“桥梁”。凡eval可以运作的表达式,都可以通过inline转化为内联函数,而这种内联函数总可被feval使用。MATLAB的“泛函”指令,就是由于采用了inline,而具备了适应各种被处理函数形式的能力
class(inline_fun)        给出内联函数类型。
char(inline_fun)         给出内联函数计算公式。
argnames(inline_fun)     给出内联函数的输入宗量。
vectorize(inline_fun)    使内联函数适用“数组运算”规则。%以字符串定义的函数亦可 %f='sin(x^2)'
f=inline('sin(x^2)')
G=inline('a*exp(x)*cos(y)','a','x','y');
disp([class(G),blanks(10),char(G)])
argnames(G)
GG=vectorize(G)
Z2=inline('P1*x*sin(x^2+P2)',2)
z2=Z2(2,2,3)
fz2=feval(Z2,2,2,3)
函数句柄
[email=hsin=@sin]hsin=@sin[/email]
class(hsin)
size(hsin)
CC=functions(hsin) %借助指令functions观察内涵
CC.methods          %同名重载函数观察
1 指令
[email=hsin=@sin]hsin=@sin[/email]的功能可以用hsin=str2func('sin')替代。
2 定义函数句柄时,所指定的函数名不应包括路径信息,也不应包括扩展名。函数名最多只能包含31个字符。
functions返回构架中各域的名称、可能取值和含义:
    Function 句柄所代表的函数名
    Type 函数类型
           simple 无重载的内建函数、M、P函数文件,或无法判别类型函数
           subfunction 子函数
           private 私有函数
           constructor MATLAB类的对象构造函数
           overloaded 有重载的函数
    File 非重载数据类型所对应的源代码及路径。假如存在内建函数,则总列在此栏
    Methods 仅当函数类型为时,返回构架才具有该域。该域本身又是一个构架,其各子域分别记录着所有的重载函数及路径。
[argout1,argout2,…,argoutn]=FunName(argin1,argin2,…,arginn)
[email=Hfun=@FunName]Hfun=@FunName[/email];
[argout1,argout2,…,argoutn]=feval(Hfun,argin1,argin2,…,arginn)
1 不管名为FunName的函数文件是否在当前搜索路径上,不管它是否在当前视野内,不管它是否是子函数或私用函数,运用句柄Hfun后总能被正确地执行。
2
在FunName存在重载函数时,借助句柄Hfun的计算总能被“恰当地”执行。也就是说,它也会根据待计算的数据类型,从其包含所有重载函数中选择相应的函数文件执行运算。

3 在不使用函数句柄的情况下,对FunName进行多次调用时,每次都要为该函数进行全面的路径搜索,这直接影响计算速度。借助Hfun可完全克服这种无谓的时间消耗。
fhandle=str2func('sin');
ys=sin(pi/4)                % 函数直接调用
yfold=feval('sin',pi/4)     % feval指令的“老式”调用
yfnew=feval(fhandle,pi/4)   % feval指令的“新式”调用
Alpha=sym('pi/4'); % 定义符号常数
yss=sin(Alpha)
yfold=feval('sin',Alpha)    % feval指令的“老式”调用
yfnews=feval(fhandle,Alpha) % feval指令的“新式”调用
xold=fminbnd('sin',0,2*pi) % 泛函指令的“老式”调用
xnew=fminbnd(fhandle,0,2*pi) % 泛函指令的“新式”调用

zhenghui 发表于 2008-5-1 20:09:54

Matlab笔记之十二---- 有关图像处理读取图像

Matlab笔记之十二---- 有关图像处理读取图像I=imread('cameraman.tif')
显示图像:imshow(I) 或 image()
调整图像大小:I2=imresize(I,0.5)
写图像:imwrite(I2,'cameraman.bmp')
获得图像信息:imfinfo('cameraman.bmp')
显示图像的颜色柱状图: imhist
调整图像的强度:imadjust
e.x: I = imread('pout.tif');
        J = imadjust(I,[0.3 0.7],[]);
        imshow(I), figure, imshow(J)
        aa=get(gcf,'colormap')
图像叠加噪声:imnoise
   e.x:
   I=imread('eight.tif');
   imshow(I) ;
   J1=imnoise(I,'gaussian',0,0.02); % 叠加均值为0,方差为0.02的高斯噪声。
   figure,imshow (J1);
   J2=imnoise(I,'salt & pepper',0.04); % 叠加密度为0.04的椒盐噪声。
   figure,imshow(J2);
二维中值过滤:medfilt2
   I=imread('eight.tif');
   imshow(I) ;
   J2=imnoise(I,'salt & pepper',0.04); % 叠加密度为0.04的椒盐噪声。
    I_Filter1=medfilt2(J2,[3 3]); %窗口大小为3×3

zhenghui 发表于 2008-5-1 20:14:40

用matlab制作简单仿真动画,并生成.avi格式的电影文件

用matlab制作简单仿真动画,并生成.avi格式的电影文件
第一种形式:利用for循环,在一定时间内控制图形窗口图像的显示,产生一段动态的演示过程:
如下:
set(gcf,'color','green');
grid on;
set(gca,'zlim',[-10,10]');
set(gca,'xlim',[-10,10]);
set(gca,'ylim',[-10,10]);
for i=1:10
   set(gca,'view',[-i*3.75,3*i] );
   pause(0.2);
end
第二种形式:利用moviein和movie函数,现将生成的动画存入一个由movien
函数定义的数组中,每一帧为数组的一个元素,最后用movie重复演示,movie后面的数字代表演示次数。
x=[-30:0.2:30];
y=[-30:0.2:30];
[x,y]=meshgrid(x,y);
n=5;
M = moviein(n);
for i=1:n
z=sin(sqrt(2*(x).^2+2*(y).^2)-2*pi*i/10);
zz=plot3(x,y,z,'parent',gca);
mesh(x,y,z);
grid on;
colormap([0,0.9,0.5]);
light('position',[1,1,2],'style','local','color','white');
material([0.5,0.4,0.3,10,0.3]);
set(gca,'zlim',[-10,10]');
M(i)=getframe(gca);
end
movie(M,20)
创建电影剪辑文件,并存储起来,如下:
aviobj=avifile('文件名.avi','fps',3);%定义一个avi文件,
%AVIOBJ = AVIFILE(FILENAME,'PropertyName',VALUE,'PropertyName',VALUE,...)
%各属性详细说明见matlab帮助
for i=1:n
%在当前窗体上生成一帧图像
frame=getframe(gca); %获得一帧图像
aviobj=addframe(aviobj,frame);%并加到电影剪辑文件中
end
aviobj=close(aviobj);%关闭文件,结束数值仿真模拟过程。

zhenghui 发表于 2008-5-1 20:19:42

Matlab笔记附件下载

Matlab笔记附件下载

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

kastin 发表于 2009-9-4 17:07:38
很好,感谢楼主分享!

wyscjm 发表于 2009-11-12 21:11:30
好啊好啊好啊好啊好啊好啊好啊好啊好啊好啊

yixiaofan 发表于 2010-1-12 18:17:50
多谢楼主分享
顶起来。:)

bingericy 发表于 2010-1-16 10:16:04
非常感谢

dadafly 发表于 2010-4-22 19:54:26
谢谢楼主,辛苦了

eastwind 发表于 2010-4-30 10:20:59
十分不错,顶顶!

四王爷 发表于 2010-8-3 18:27:29

回复 11# zhenghui 的帖子

谢谢楼主,辛苦了

songxiang519 发表于 2010-8-3 22:14:21
感谢楼主分享!

cardinalmx 发表于 2010-8-4 10:56:37
好东西,能做个压缩包放着么?

landlordwife 发表于 2010-9-1 20:06:47
楼主,辛苦:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表