hongboshenzhen's profileWindows Live 共享空间PhotosBlogListsMore Tools Help

Windows Live 共享空间

hongboshenzhen

This person's network is empty (or maybe they're keeping it private).
No list items have been added yet.
Photo 1 of 35
November 18

matlab2

MATLAB程序设计教程(3)---MATLAB程序设计 (2008-04-15 23:21:18)
标签:it  分类:IT技术
第3章  MATLAB程序设计

3.1 M文件

3.2 程序控制结构

3.3 函数文件

3.4 程序举例

3.5 程序调试

 

3.1  M文件

3.1.1  M文件概述

    用MATLAB语言编写的程序,称为M文件。M文件可以根据调用方式的不同分为两类:命令文件(Script File)和函数文件(Function File)。

例3-1  分别建立命令文件和函数文件,将华氏温度f转换为摄氏温度c。

程序1:首先建立命令文件并以文件名f2c.m存盘。

clear;            %清除工作空间中的变量

f=input('Input Fahrenheit temperature:');

c=5*(f-32)/9

然后在MATLAB的命令窗口中输入f2c,将会执行该命令文件,执行情况为:

Input Fahrenheit temperature:73

c =22.7778

程序2:首先建立函数文件f2c.m。

function c=f2c(f)

c=5*(f-32)/9

然后在MATLAB的命令窗口调用该函数文件。

clear;

y=input('Input Fahrenheit temperature:');

x=f2c(y)

输出情况为:

Input Fahrenheit temperature:70

c =21.1111

x =21.1111

 

3.1.2  M文件的建立与打开

    M文件是一个文本文件,它可以用任何编辑程序来建立和编辑,而一般常用且最为方便的是使用MATLAB提供的文本编辑器。

1.建立新的M文件

    为建立新的M文件,启动MATLAB文本编辑器有3种方法:

    (1) 菜单操作。从MATLAB主窗口的File菜单中选择New菜单项,再选择M-file命令,屏幕上将出现MATLAB 文本编辑器窗口。

    (2) 命令操作。在MATLAB命令窗口输入命令edit,启动MATLAB文本编辑器后,输入M文件的内容并存盘。

    (3) 命令按钮操作。单击MATLAB主窗口工具栏上的New M-File命令按钮,启动MATLAB文本编辑器后,输入M文件的内容并存盘。

2.打开已有的M文件

    打开已有的M文件,也有3种方法:

    (1) 菜单操作。从MATLAB主窗口的File菜单中选择Open命令,则屏幕出现Open对话框,在Open对话框中选中所需打开的M文件。在文档窗口可以对打开的M文件进行编辑修改,编辑完成后,将M文件存盘。

    (2) 命令操作。在MATLAB命令窗口输入命令:edit 文件名,则打开指定的M文件。

    (3) 命令按钮操作。单击MATLAB主窗口工具栏上的Open File命令按钮,再从弹出的对话框中选择所需打开的M文件。

 

3.2  程序控制结构

3.2.1  顺序结构

1.数据的输入

从键盘输入数据,则可以使用input函数来进行,该函数的调用格式为:

    A=input(提示信息,选项);

其中提示信息为一个字符串,用于提示用户输入什么样的数据。

    如果在input函数调用时采用's'选项,则允许用户输入一个字符串。例如,想输入一个人的姓名,可采用命令:

xm=input('What''s your name?','s');

2.数据的输出

    MATLAB提供的命令窗口输出函数主要有disp函数,其调用格式为

    disp(输出项)

其中输出项既可以为字符串,也可以为矩阵。

例3-2  输入x,y的值,并将它们的值互换后输出。

    程序如下:

    x=input('Input x please.');

    y=input('Input y please.');

    z=x;

    x=y;

    y=z;

    disp(x);

    disp(y);

例3-3  求一元二次方程ax2 +bx+c=0的根。

程序如下:

a=input('a=?');

b=input('b=?');

c=input('c=?');

d=b*b-4*a*c;

x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];

disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);

3.程序的暂停

    暂停程序的执行可以使用pause函数,其调用格式为:

    pause(延迟秒数)

    如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。

    若要强行中止程序的运行可使用Ctrl+C命令。

 

3.2.2  选择结构

1.if语句

    在MATLAB中,if语句有3种格式。

    (1) 单分支if语句:

if  条件

        语句组

    end

当条件成立时,则执行语句组,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。

    (2) 双分支if语句:

if  条件

        语句组1

    else

         语句组2

    end

    当条件成立时,执行语句组1,否则执行语句组2,语句组1或语句组2执行后,再执行if语句的后继语句。

    例3-4  计算分段函数的值。

    程序如下:

x=input('请输入x的值:');

if x<=0

   y= (x+sqrt(pi))/exp(2);

else

   y=log(x+sqrt(1+x*x))/2;

end

Y

 (3) 多分支if语句:

if  条件1

        语句组1

    elseif  条件2

        语句组2

       ……

    elseif  条件m

         语句组m

    else

         语句组n

    end

语句用于实现多分支选择结构。

   例3-5  输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。

c=input('请输入一个字符','s');

if c>='A' & c<='Z'

   disp(setstr(abs(c)+abs('a')-abs('A')));

elseif c>='a'& c<='z'

    disp(setstr(abs(c)- abs('a')+abs('A')));

elseif c>='0'& c<='9'

    disp(abs(c)-abs('0'));

else

    disp(c);

end

2.switch语句

    switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为:

    switch  表达式

       case  表达式1

          语句组1

       case  表达式2

          语句组2

          ……

       case  表达式m

          语句组m

       otherwise

          语句组n

    end

当表达式的值等于表达式1的值时,执行语句组1,当表达式的值等于表达式2的值时,执行语句组2,…,当表达式的值等于表达式m的值时,执行语句组m,当表达式的值不等于case所列的表达式的值时,执行语句组n。当任意一个分支的语句执行完后,直接执行switch语句的下一句。

例3-6  某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示): 

    price<200           没有折扣

    200≤price<500      3%折扣

    500≤price<1000     5%折扣

    1000≤price<2500    8%折扣

    2500≤price<5000    10%折扣

5000≤price         14%折扣

输入所售商品的价格,求其实际销售价格。

程序如下:

price=input('请输入商品价格');

switch fix(price/100)

   case {0,1}             %价格小于200

      rate=0;

   case {2,3,4}            %价格大于等于200但小于500

      rate=3/100;

   case num2cell(5:9)       %价格大于等于500但小于1000

      rate=5/100;

   case num2cell(10:24)     %价格大于等于1000但小于2500

      rate=8/100;

   case num2cell(25:49)     %价格大于等于2500但小于5000

      rate=10/100;

   otherwise               %价格大于等于5000

      rate=14/100;

end

price=price*(1-rate)              %输出商品实际销售价格

3.try语句

语句格式为:

try

   语句组1

catch

   语句组2

end

try语句先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2。

例3-7  矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。

程序如下:

A=[1,2,3;4,5,6]; B=[7,8,9;10,11,12];

try

   C=A*B;

catch

   C=A.*B;

end

C

lasterr                %显示出错原因

 

matlab

MATLAB程序设计教程(3-1)---MATLAB程序设计 (2008-04-15 23:48:28)
标签:it  分类:IT技术

3.2.3  循环结构

1.for语句

for语句的格式为:

for 循环变量=表达式1:表达式2:表达式3

        循环体语句

    end

其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。

例3-8  一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。

    程序如下:

for m=100:999

m1=fix(m/100);           %求m的百位数字

m2=rem(fix(m/10),10);   %求m的十位数字

m3=rem(m,10);             %求m的个位数字

if m==m1*m1*m1+m2*m2*m2+m3*m3*m3

disp(m)

end

end

例3-9  已知,当n=100时,求y的值。

    程序如下:

y=0;

n=100;

for i=1:n

  y=y+1/(2*i-1);

end

y

    在实际MATLAB编程中,采用循环语句会降低其执行速度,所以前面的程序通常由下面的程序来代替:

n=100;

i=1:2:2*n-1;

y=sum(1./i);

y

for语句更一般的格式为:

    for 循环变量=矩阵表达式

       循环体语句

    end

    执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。

    例3-10  写出下列程序的执行结果。

    s=0;

    a=[12,13,14;15,16,17;18,19,20;21,22,23];

    for k=a

       s=s+k;

    end

    disp(s');

2.while语句

    while语句的一般格式为:

    while (条件)

         循环体语句

    end

    其执行过程为:若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。

    例3-11  从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。

程序如下:

sum=0;

cnt=0;

val=input('Enter a number (end in 0):');

while (val~=0)

     sum=sum+val;

     cnt=cnt+1;

     val=input('Enter a number (end in 0):');

end

if (cnt > 0)

    sum

    mean=sum/cnt

end

3.break语句和continue语句

    与循环结构相关的语句还有break语句和continue语句。它们一般与if语句配合使用。

break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。

continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。

例3-12  求[100,200]之间第一个能被21整除的整数。

程序如下:

for n=100:200

if rem(n,21)~=0

      continue

end

break

end

n

4.循环的嵌套

    如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。

    例3-13  若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求[1,500]之间的全部完数。

for m=1:500

s=0;

for k=1:m/2

if rem(m,k)==0

s=s+k;

end

end

if m==s

    disp(m);

end

end

 

3.3 函数文件

3.3.1  函数文件的基本结构

    函数文件由function语句引导,其基本结构为:

    function 输出形参表=函数名(输入形参表)

    注释说明部分

    函数体语句

其中以function开头的一行为引导行,表示该M文件是一个函数文件。函数名的命名规则与变量名相同。输入形参为函数的输入参数,输出形参为函数的输出参数。当输出形参多于一个时,则应该用方括号括起来。

    例3-14  编写函数文件求半径为r的圆的面积和周长。

    函数文件如下:       

function [s,p]=fcircle(r)

%CIRCLE  calculate the area and perimeter of a circle of radii r

%r          圆半径

%s          圆面积

%p          圆周长

%2004年7月30日编

s=pi*r*r;

p=2*pi*r;

 

3.3.2  函数调用

函数调用的一般格式是:

    [输出实参表]=函数名(输入实参表)

    要注意的是,函数调用时各实参出现的顺序、个数,应与函数定义时形参的顺序、个数一致,否则会出错。函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。

    例3-15  利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。

    函数文件tran.m:

function [rho,theta]=tran(x,y)

rho=sqrt(x*x+y*y);

theta=atan(y/x);

    调用tran.m的命令文件main1.m:

x=input('Please input x=:');

y=input('Please input y=:');

[rho,the]=tran(x,y);

rho

the

    在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数,甚至调用它自身。一个函数调用它自身称为函数的递归调用。

    例3-16  利用函数的递归调用,求n!。

    n!本身就是以递归的形式定义的:

显然,求n!需要求(n-1)!,这时可采用递归调用。递归调用函数文件factor.m如下:

function f=factor(n)

if n<=1

   f=1;

else

   f=factor(n-1)*n;    %递归调用求(n-1)!

end

 

3.3.3  函数参数的可调性

    在调用函数时,MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。

    例3-17  nargin用法示例。

    函数文件examp.m:

function fout=charray(a,b,c)

if nargin==1

   fout=a;

elseif nargin==2

   fout=a+b;

elseif nargin==3

   fout=(a*b*c)/2;

end

    命令文件mydemo.m:

x=[1:3];

y=[1;2;3];

examp(x)

examp(x,y')

examp(x,y,3)

 

3.3.4  全局变量与局部变量

全局变量用global命令定义,格式为:

global 变量名

    例3-18  全局变量应用示例。

    先建立函数文件wadd.m,该函数将输入的参数加权相加。

function f=wadd(x,y)

global ALPHA BETA

f=ALPHA*x+BETA*y;

    在命令窗口中输入:

global ALPHA BETA

ALPHA=1;

BETA=2;

s=wadd(1,2)

 

3.4 程序举例

例3-19  猜数游戏。首先由计算机产生[1,100]之间的随机整数,然后由用户猜测所产生的随机数。根据用户猜测的情况给出不同提示,如猜测的数大于产生的数,则显示“High”,小于则显示“Low”,等于则显示“You won”,同时退出游戏。用户最多可以猜7次。

例3-20  用筛选法求某自然数范围内的全部素数。

    素数是大于1,且除了1和它本身以外,不能被其他任何整数所整除的整数。用筛选法求素数的基本思想是:要找出2~m之间的全部素数,首先在2~m中划去2的倍数(不包括2),然后划去3的倍数(不包括3),由于4已被划去,再找5的倍数 (不包括5),…,直到再划去不超过的数的倍数,剩下的数都是素数。

例3-21  设,求s=。

求函数f(x)在[a,b]上的定积分,其几何意义就是求曲线y=f(x)与直线x=a,x=b,y=0所围成的曲边梯形的面积。为了求得曲边梯形面积,先将积分区间[a,b]分成n等分,每个区间的宽度为h=(b-a)/n,对应地将曲边梯形分成n等分,每个小部分即是一个小曲边梯形。近似求出每个小曲边梯形面积,然后将n个小曲边梯形的面积加起来,就得到总面积,即定积分的近似值。近似地求每个小曲边梯形的面积,常用的方法有:矩形法、梯形法以及辛普生法等。

例3-22  Fibonacci数列定义如下:

f1=1

f2=1

fn=fn-1+fn-2    (n>2)

求Fibonacci数列的第20项。

例3-23  根据矩阵指数的幂级数展开式求矩阵指数。

 

3.5 程序调试

3.5.1  程序调试概述

一般来说,应用程序的错误有两类,一类是语法错误,另一类是运行时的错误。语法错误包括词法或文法的错误,例如函数名的拼写错、表达式书写错等。

程序运行时的错误是指程序的运行结果有错误,这类错误也称为程序逻辑错误。

 

3.5.2  调试器

1.Debug菜单项

该菜单项用于程序调试,需要与Breakpoints菜单项配合使用。

2.Breakpoints菜单项

该菜单项共有6个菜单命令,前两个是用于在程序中设置和清除断点的,后4个是设置停止条件的,用于临时停止M文件的执行,并给用户一个检查局部变量的机会,相当于在M文件指定的行号前加入了一个keyboard命令。

 

3.5.3  调试命令

  除了采用调试器调试程序外,MATLAB还提供了一些命令用于程序调试。命令的功能和调试器菜单命令类似,具体使用方法请读者查询MATLAB帮助文档。

学习英语的几项心得

学习英语需要训练的几个项目:
1:呼吸,要有足够的气息来帮助发音
2:共振,共振相当于扬声器,他能帮助你将声带产生的声音添加些效果并放大
3:声带振动的训练
4:正音训练,将各种字母的发音拼读正确
5:语言的格式化训练,达到脱口而出
October 12

matlab basic use method

MATLAB基本的使用方法
2007-12-01 17:28
读取图像:用imread函数读取图像文件,文件格式可以是TIFF、JPEG、GIF、BMP、PNG等。比如

>> f = imread('chestxray.jpg');
读进来的图像数据被保存在变量f中。尾部的分号用来抑制输出。如果图片是彩色的,可以用rgb2gray转换成灰度图:

>> f = rgb2gray(f);
然后可以用size函数看图像的大小

>> size(f)
如果f是灰度图像,则可以用下面的命令把这个图像的大小赋给变量M和N

>> [M, N] = size(f);
用whos命令查看变量的属性

>> whos f
显示图像:用imshow显示图像

imshow(f, G)
其中f是图像矩阵,G是像素的灰度级,G可以省略。比如

>> imshow(f, [100 200])
图像上所有小于等于100的数值都会显示成黑色,所有大于等于200的数值都会显示成白色。pixval命令可以用来查看图像上光标所指位置的像素值。

pixval
例如

>> f = imread('rose_512.tif');
>> whos f
>> imshow(f)
如果要同时显示两幅图像,可以用figure命令,比如

>> figure, imshow(g)
用逗号可以分割一行中的多个命令。imshow的第二个参数用一个空的中括号:

>> imshow(h, [])
可以使动态范围比较窄的图像显示更清楚。
写图像。用imwrite写图像

imwrite(f, 'filename')
文件名必须包括指明格式的扩展名。也可以增加第三个参数,显式指明文件的格式。比如

>> imwrite(f, 'patient10_run1.tif', 'tif')
也可以写成

>> imwrite(f, 'patient10_run1.tif')
还可以有其他参数,比如jepg图像还有质量参数:

>> imwrite(f, 'filename.jpg', 'quality', q)
q是0到100之间的一个整数。对比不同质量的图像效果。用imfinfo命令可以查看一个图像的格式信息,比如

>> imfinfo bubbles25.jpg
可以把图像信息保存到变量中

>> K = imfinfo('bubbles25.jpg');
>> image_bytes = K.Width * K.Height * K.BitDepth / 8;
>> compressed_btyes = K.FileSize;
>> compression_ratio = image_bytes / compressed_bytes
数据类型。MATLAB的数据类型包括:

double   双精度浮点
uint8 无符号8位整数
uint16   无符号16位整数
uint32   无符号32位整数
int8 有符号8位整数
int16 有符号16位整数
int32 有符号32位整数
single   单精度
char 字符
logical 逻辑型(二值)
数据类型转换

B = data_class_name(A)
比如

>> C = [1.4 1.5]
>> D = uint8(C)
图像类型分为:

Intensity image 灰度图
Binary image 二值图
Indexed image 索引图
RGB image    彩色图
在灰度图中每个像素可以是整型、浮点型或者逻辑型。图像类型的像素类型可以转换

function to    from
im2uint8 uint8 logical,uint8,uint16,double
im2uint16 uint16 logical,uint8,uint16,double
mat2gray double double
im2double double logical,uint8,uint16,double
im2bw    logical   uint8,uint16,double
比如

g = mat2gray(A, [Amin, Amax]);
g = mat2gray(A);
g = im2double(h);
g = im2bw(f, T)
其中A是浮点型的图像,Amin和Amax是浮点数的范围,h和f是任意类型的图像,T是分割的阈值。
数组(向量)索引:创建向量(数组):

>> v = [1 3 5 7 9 11 13]
用小括号对向量进行索引(取数组中的某个元素):

>> v(2)
转置(将行向量通过转置变成列向量):

>> w = v.'
取向量其中的一部分:

>> v(1:3) 第1个到第3个
>> v(2:4)
>> v(3:end) 第3个到最后一个
>> v(1:end)
>> v(:)     全部
>> v(1:2:end)   第1个到最后一个,每次增加2
>> v(end:-2:1)   最后一个到第1个,每次减2
其中end总是表示最后一个。

>> x = linspace(1, 5, 10)
>> v([1 4 5])
linspace函数产生一个范围内的平均分布。
矩阵索引:创建矩阵

>> A = [1 2 3; 4 5 6; 7 8 9]
取矩阵中的一个元素

>> A(2, 3)
取矩阵中的一行或者一列

>> C3 = A(:, 3)
>> R2 = A(2, :)
取矩阵中某些行某些列

>> T2 = A(1:2, 1:3)
对矩阵中某些元素进行赋值:

>> B = A;
>> B(:, 3) = 0
用end表示最后一行或者最后一列:

>> A(end, end) 最后一行最后一列
>> A(end, end-2)   最后一行倒数第三列
>> A(2:end, end:-2:1)   第2行到最后一行,最后一列到第一列,每次减2
>> E = A([1 3], [2 3])   第1、3行,第2、3列
>> D = logical([1 0 0; 0 0 1; 0 0 0])
>> A(D)   取A中由D指定的位置上的元素
>> v = T2(:) 把矩阵变成一个向量
>> s = sum(A(:))   求和
>> sum(sum(A))
可以把矩阵操作用在图像上

>> f = imread('filename');
>> fp =   矩阵列倒转
>> imshow(fp)
>> fc =
>> imshow(fc)
>> fs =
>> imshow(fs)
>> plot(f(512,:))
矩阵可以是多维的,用size看矩阵大小,用ndims命令常看矩阵的维数

>> size(A, 1)
>> ndims(A)
一些常用的矩阵

zeroes(M, N)
ones(M, N)
true(M, N)
false(M, N)
magic(M)
rand(M, N)
randn(M, N)
其中M、N表示矩阵的行数和列数。比如

>> A = 5 * ones(3, 3)
>> magic(3)
>> B = rand(2, 4)
函数:可以把一系列的MATLAB语句或者一个带参数的函数放在扩展名叫做m的文件中。一个带函数的m文件有一下部分组成

函数定义行
H1行
帮助部分
函数体
注释
函数定义行的格式是

function [outputs] = name(inputs)
比如要写一个函数计算两个图像的和以及乘积

function [s, p] = sumprod(f, g)
其中f和g是输入的图像,而s是和,p是乘积。返回值用中括号括起来,如果返回值只有一个,可以省略中括号。如果函数没有输出,则中括号和等号都可以省略。函数名字的命名规则和C语言是相同的。定义好的函数可以在命令行调用:

>> [s, p] = sumprod(f, g);
也可以被其它函数调用。如果只有一个返回值,调用时中括号也是可以省略的,比如

>> y = sum(x);
H1行是文本的第一行,是一个单行的注释,紧跟在函数定义行后面,之间不能有空行。比如

% SUMPROD Computes the sum and product of two images.
百分号开始的文字表示注释。当使用帮助命令

>> help function_name
时,这个H1行会被首先显示出来。如果使用lookfor命令,则会在所有H1行中查找指定的关键字。这一行应该提供这个函数功能的一个概述。帮助部分是紧跟在H1后的文本块,中间没有空行,用来提供对这个函数更详细的帮助说明。在使用help命令时会显示所有这部分内容。这部分内容由注释语句构成,全部由%开始。接下来第一个非注释语句表示函数体的开始。函数体包含进行计算的语句和给返回值赋值的语句。函数题中的所有注释(百分号开始的行)被认为是普通的注释,不是H1或者帮助部分。m文件可以用任何文本编辑器创建和编辑,只要用.m扩展名保存在MATLAB可以搜索到的路径里面。另一个创建和编辑函数的方法是在命令行输入edit命令,比如

>> edit sumprod
这命令会编辑已经存在的sumprod.m文件,如果没有则自动在当前目录中创建一个sumprod.m并开始编辑。
运算符。运算符可以分为算术运算符,关系运算符和逻辑运算符。算术运算符分为矩阵算术运算符和数组算术运算符。

+ 矩阵和数组加法 plus(A, B) a+b, A+B
- 矩阵和数组减法 minus(A,B) a-b, A-B
.*   数组乘法        times(A,B) C=A.*B, 意味着C(I,J) = A(I,J)*B(I,J)
* 矩阵乘法        mtimes(A,B) A*B, 表示线性代数中的矩阵运算,或者a*A
./   数组右除        rdivide(A,B)   C=A./B, 意味着C(I,J)=A(I,J)/B(I,J)
.\   数组左除        ldivide(A,B)   C=A.\B, 意味着C(I,J)=B(I,J)/A(I,J)
/ 矩阵右除        mrdivide(A,B) A/B 意味着A*inv(B), inv是矩阵求逆
\ 矩阵左除        mldivide(A,B) A\B 意味着inv(A)*B
.^   数组指数        power(A, B) C=A.^B,意味着C(I,J)=A(I,J)^B(I,J)
^ 矩阵指数        mpower(A,B) 请查看帮助
.'   向量和矩阵转置 transpose(A)   A.'
' 复数的共轭    ctranspose(A)   A'
+ 单目加号        uplus(A)    +A 与0+A相同
- 单目负号        uminus(A)     -A 与0-A相同
图像处理工具包还提供其他一些算术运算

imadd       两个图像相加,或者一个图像加上一个常量
imsubstract 两个图像相减,或者一个图像减掉一个常量
immultiply     两个图像相乘,或者一个图像乘上一个常量
imdivide    两个图像相除,或者一个图像除以一个常量
imabsdiff    两个图像的差的绝对值
imcomplement 求一个图像的反色图
inlincomb    求一组图像的线性组合
关系运算符包括

<
<=
>
>=
==
~=
关系运算符的结果是逻辑型的矩阵,比如

>> A = [1 2 3; 4 5 6; 7 8 9]
>> B = [0 2 4; 3 5 6; 3 4 9]
>> A == B
>> A >= B
如果关系运算符两边都是矩阵,则要求两边的矩阵是同样大小的。或者一边是矩阵一边是常数,或者两边都是常数,那也是可以。

>> A > 3
>> 3 ~= 4
逻辑运算符包括与、或、非三个运算

& AND
| OR
~ NOT
matlab中非0被认为是真,0被认为是假。比如

A = [1 2 0; 0 4 5]
B = [1 -2 3; 0 1 1]
>> A & B
MATLAB还有其它一些逻辑运算函数:

xor 异或
all 如果一整列都是真,则结果是真
any 如果一整列只要有一个是真,则结果是真
比如

>> xor(A, B)
>> all(A)
>> any(A)
>> all(B)
>> any(B)
一些重要的常量

ans
eps
i(或者j)
NaN或者nan
pi
realmax
realmin
computer
version
MATLAB中一般常量的写法

3
-99
0.00001
9.6397238
1.60210e-20
6.02252e23
1i
-3.14159j
3e5j
控制流。包括

if          if和else, elseif组合,条件执行一组语句
for          指定次数重复执行一组语句
while       按条件反复执行一组语句
break       终止for或者while循环
continue    马上开始下一次for或者while循环
switch       switch和case,otherwise结合,按照条件值的不同执行不同的语句块
return       终止当前函数,返回到调用它的地方
try...catch 捕获异常状况
if语句

if expression1
statements1
elseif expression2
statements2
else
statements3
end
for循环

for index = start:increment:end
statements
end
比如

count = 0;
for k = 0:0.1:1
count = count +1
end
while循环

while expression
statements
end
比如

a = 10;
b = 5;
while a
a = a - 1;
while b
   b = b - 1;
end
end
switch语句

switch switch_expression
case case_expression
   statements
case {case_expression1, case_expression2}
   statements
otherwise
   statements
end
比如

switch newclass
case 'uint8'
   g = im2uint8(f);
case 'uint16'
   g = im2uint16(f);
case 'double'
   g = im2double(f);
otherwise
   error('Unknown or improper image class.')
end
例子:写一个函数计算一幅灰度图像所有像素的平均值

function av = average(A)
%AVERAGE Computes the average value of an array
% AV = AVERAGE(A) computes the average value of input array, A,
% which must be a 1D or 2D array.

% Check the validity of input.
if ndims(A) > 2
error('The dimensions of the input cannot exceed 2.')
end
% Computes the average
av =
例子:比较各种不同的JPEG质量下的图像质量

for q = 0:5:100
filename = sprintf('series_%3d.jpg', q);
imwrite(f, filename, 'quality', q);
end
其中sprintf语句和c语言的fprintf语句用法类似。例子:写一个函数从一个图像中取出一个矩形的子图。

function s = subdim(f, m, n, rx, cy)
%SUBDIM Extracts a subimage, s, from a given image, f.
% The subimage is of size m-by-n, and the coordinates of its top, left
% corner are (rx, cy).

s = zeros(m, n);
rowhigh = rx + m - 1;
colhigh = cy + n - 1;
xcount = 0;
for r = rx:rowhigh
xcount = xcount + 1;
ycount = 0;
for c = cy:colhigh
       ycount = ycount + 1;
       s(xcount, ycount) = f(r, c);
end
end
实际上这个功能可以用一个matlab语句就可以实现了。
循环优化。一些循环可以被转换成同样向量计算来代替,比如f(x)=Asin(x/2pi),生成一个向量包含一组函数的值:

for x = 1:M
f(x) = A*sin((x-1)/(2*pi));
end
可以用下面两个语句来代替

x =
f = A*sin(x/2(*pi))
向量运算要比循环快得多。对于二维的情况,MATLAB提供了一个meshgrid函数

[C, R] = meshgrid(c, r)
比如

>> r = [0 1 2];
>> c = [0 1];
>> [C, R] = meshgrid(c, r)
>> h = R.^2 + C.^2
例子:f(x, y) = Asin(ux + vy),生成一个矩阵,包含这个函数的值:

function [rt, f, g] = twodsin(A, u0, v0, M, N)
%TWODSIN compare for loops vs vectorization
% The comparision is based on implementing the function
% f(x, y) = Asin(u0x+v0y) for x = 0, 1, 2,..., M-1, and
% y = 0, 1, 2, ..., N-1. The inputs to the function are
% M and N and the constants in the function.

tic
for r = 1:M
u0x = u0*(r-1);
for c = 1:N
   v0y = v0*(c-1)
   f(r, c) = A*sin(u0x + v0y);
end
end
t1 = toc;

tic
r =
c =
[C,R] = meshgrid(c, r);
g = A*sin(u0*R + v0*C)
t2 = toc;

rt = t1/t2;
运行这个例子可以看出,向量计算至少比循环要快30倍。如果只是针对图像的一部分进行操作,可以简单的提取出来,比如

rowhigh = rx + m - 1;
colhigh = cy + n - 1;
s =
同样功能的程序,这个写法比前面例子看到的写法要快1000倍。
用户交互。函数disp用来提示用户一些信息。比如

>> A = [1 2; 3 4];
>> disp(A)
>> sc = 'Digital Image Processing.';
>> disp(sc)
>> disp('This is another way to display text.')
input函数用来提示用户输入某些值:

t = input('message')
这个函数可以显示message,并等待用户输入一个值,并存到t中。输入的值可以是MATLAB允许的任何类型的值。而如下的格式只接受字符串输入

t = input('message', 's')
如果字符串中包含的都是数字,则可以用函数str2num进行转换

n = str2num(t)
比如

>> t = input('Enter your data: ', 's')
>> class(t)
>> size(t)
>> n = str2num(t)
>> size(n)
>> class(n)
如果混合输入字符串和数值,可以全部按照字符串读入,再使用字符串处理函数strread,比如:

>> t = '12.6, x2y, z';
>> [a, b, c] = strread(t, '%f%q%q', 'delimiter', ',')
>> d = char(b)
其中%f表示浮点数,%q表示字符串。delimiter参数表示分割符。函数strcmp用来比较字符串,如果两个字符串相等返回真,否则返回假。lower函数可以把字符串中的大写字母全部变成小写,upper函数可以把字符串中所有小写字母全部变成大写。
Cell数组和结构体。Cell数组是指数组的元素本身还是一个数组,比如

>> c = {'gause', [1 0; 0 1], 3}
>> c{1}
>> c{2}
>> c{3}
结构体和Cell数组类似,但是其中的元素是用一个名字去访问的,比如

>> S.char_string = 'gause';
>> S.matrix = [1 0; 0 1];
>> S.scalar = 3;
>> S.matrix

实验任务
MATLAB 没有提供一个函数来确定数组的每个元素是不是整数(即...,-2,-1,0,1,2,...)。写一个函数来实现这个功能,并满足下面的格式:

function I = isinteger(A)
%ISINTEGER Determines which elements of an array are integers.
%        I = ISINTEGER(A) returns a logical array, I, of the same size
%        as A, with 1s (TRUE) in the locations corresponding to integers
%        (i.e., . . . -2 -1 0 1 2 . . . )in A, and 0s (FALSE) elsewhere.
%        A must be a numeric array.
要求不能使用while或者for循环。提示:使用floor函数。如果你要做到能够处理复数,那么可以使用real和imag函数。
MATLAB没有提供一个函数用来确定数组的每个元素是不是偶数(即...,-4,-2,0,2,4,...)。写一个函数来实现这个功能,并满足下面的格式:

function E = iseven(A)
%ISEVEN Determines which elements of an array are even numbers.
%     E = ISEVEN(A) returns a logical array, E, of the same size as A,
%     with 1s (TRUE) in the locations corresponding to even numbers
%     (i.e., . . . -3, -1, 0, 2, 4, . . . )in A, and 0s (FALSE) elsewhere.
%     A must be a numeric array.
要求不能使用while或者for循环。提示:使用floor函数。
MATLAB没有提供一个函数用来确定数组的每个元素是不是奇数(即...,?3,?1,1,3,...)。写一个函数实现这个功能,并满足下面的格式:

function D = isodd(A)
%ISODD Determines which elements of an array are odd numbers.
%    E = ISODD(A) returns a logical array, D, of the same size as A,
%    with 1s (TRUE) in the locations corresponding to odd numbers
% (i.e., . . . -3, -1, 1, 3, . . . )in A, and 0s (FALSE) elsewhere.
% A must be a numeric array.
要求不能使用while或者for循环。提示:使用floor函数。
写一个函数满足下面的规定:

function H = imcircle(R, M, N)
%IMCIRCLE Generates a circle inside a rectangle.
% H = IMCIRCLE(R, M, N) generates a circle of radius R centered
% on a rectangle of height M and width N. H is a binary image with
% 1s on the circle and 0s elsewhere. R must be an integer >= 1.
你的程序应该检查R的合理性,使它能够在矩形的内部。要求不能使用for或者while循环。提示:使用函数meshgrid和floor函数。
这个实验主要目的是学习如何显示和改变目录,并利用目录信息来读取图像。写一个函数满足下面的规定:

function [I, map] = imagein(path)
%IMAGEIN Read image in from current-working or specified directory.
%     I = IMAGEIN displays a window containing all the files in the
%     current directory, and saves in I the image selected from the
%     current directory.
%     [I, MAP] = IMAGEIN variable MAP is required to be an output
%     argument when the image being read is an indexed image.
%     [ . . .] = IMAGEIN('PATH') is used when the image to be read
%     resides in a specified directory. For example, the input
%     argument 'C:\MY_WORK\MY_IMAGES' opens a window showing
%     the contents of directory MY_IMAGES. An image selected from
%     that directory is read in as image I.
提示:使用在线帮助来熟悉cd,pwd,uigetfile函数的使用。或者也可以采用fullfile函数来代替cd函数
September 22

学会英语6要素

学会英语6要素
一位成功的学习者要具备以下6个要素:
1 自信心;
2 决心;
3 毅力;
4 自我管理力;
5 自我约束力;
6 童心。