Matlab专题三

 Matlab程序文件分为脚本文件函数文件

 例子:分别建立脚本文件和函数文件,求两个函数的矩阵的乘积

函数文件名称,一定要与函数一致

%  建立脚本文件f1.m  %
A = [1,2,3;4,5,6];
B = [1,2;3,4;5,6];
C = A*B

%  在命令行窗口运行脚本文件  %

>> f1

C =

    22    28
    49    64
% 建立函数文件f2.m %

function C = f2(A,B)
C = A*B;

% 命令行中调用函数文件 %

>> A = [1,2,3;4,5,6];
>> B = [1,2;3,4;5,6];
>> C = f2(A,B)

C =

    22    28
    49    64

一、顺序结构程序

 输入、处理(核心)、输出

 1、数据的输入

A = input('请输入变量A的值')。

2、数据输出

disp(输出项):与不加分号相比,用disp函数输出的数据更加紧凑。

3、程序的暂停

pause(延时秒数),若延时秒数省略,则程序会暂停执行。

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


%{
有一线段AB,A的坐标为(1,1),B的坐标为(4.5,4.5),
求AB的长度,以及黄金分割点C的坐标。
A、B点坐标用复数的形式表示,方便计算。
%}
clear
clc

a = input('a=');
b = input('b=');
c = a+0.618*(b-a);
s = abs(a-b);
disp(s);
disp(c);


%命令行交互

a=1+1i
b=4.5+4.5i
    4.9497

   3.1630 + 3.1630i

二、用if语句实现选择结构

1、单分支if 语句格式:

 if      条件

        语句组

end

1、当条件结果为标量时,非零表示条件成立,零表示条件不成立。

2、当条件结果为矩阵时,如果矩阵为非空,且不包含零元素,则条件成立,否则不成立。

2、双分支if语句格式:

if        条件

        语句组1

else

        语句组2

end

%输入一个整数,若为奇数则输出其平方根,否则输出其立方根


c = input('请输入一个整数:');
if rem(c,2) == 0
    d = sqrt(c);
else
    d = nthroot(c,3);
end
    disp(d);

3、 多分支if语句格式

        if        条件1

                        语句组1

        else if 条件2

                        语句组2

                        ......

        else if 条件m

                        语句组m

        else 

                        语句组n

        end

%{
输入一个字符,若为大写字母,则输出其对应的小写字
 母;若为小写字母,则输出其对应的大写字母:若为数字字
符则输出其对应数的平方,若为其他字符则原样输出。
%}
    clear
    clc
    x = input('请输入一个字符:');
    if x >= 'A'&& x <= 'Z'
        disp(char(abs(x)+'a'-'A'));
    elseif x >= 'a' && x <= 'z'
        disp(char(abs(x)- 32));
    elseif x >= '0' && x <= '9'
        disp(str2double(x)^2);
    else
            disp(x)
    end

lower(字符):输入:大写字母字符;输出:小写字母字符

upper(字符):输入:小写字母字符;输出:大写字母字符

str2double(字符):输入:数字字符串;输出为:双精度数值

三、用switch语句实现选择结构

%{
    switch语句,简单例子
%}
    
    clear
    clc
    x = input('x=')
    switch fix(x)
        case 2
            disp(222);    % fix(x) = 2;执行此语句
        case 2
            disp(333);    % fix(x) = 任何数;都不会执行此语句
        case {3,4,5}
            disp(444);    % fix(x) = 3,4,5;执行此语句
        otherwise
            disp(555);    % fix(x) = 其它数;执行此语句
    end

x = input(prompt) x = prompt

str = input(prompt,'s') 返回输入的文本,而不会将输入作为表达式来计算。即:此时输入apple,str = 'apple'

% PM2.5 等级设置 %
g = input('请输入PM2.5值:');
switch fix(g)
    case num2cell(0:34)    % 0 <= g <=34时,执行该条件成立时的语句。
        disp('空气质量优');
    case num2cell(35:74)
        disp('空气质量良好');
    case num2cell(75:114)
        disp('空气质量轻度污染');
    case num2cell(15:149)
        disp('空气质量中度污染');
    case num2cell(159:249)
        disp('空气质量重度污染'); 
    otherwise
        disp('空气质量严重污染');
end

四、用for语句实现循环结构

for        循环变量 = 表达式1(初值):表达式2(步长):表达式3(终值),这些构成一个向量

        循环体语句(重复执行的语句)

end

(1)for语句针对向量中的每一个元素执行一次循环体。

(2)退出循环后,循环变量的值就是向量中最后的元素值。

(3)当向量为空时,循环体一次也不执行。

%计算圆周率Π,原理是无穷级数
format long
y = 0;
g = -1;
n = input('n=');
for i  = 1:n
    g = -g;
    y = y + g*1/(2*i-1);
end
pai = 4*y

%计算圆周率Π,利用四分之一圆的单位圆
a = 0;
b = 1;
n = input('n =?');
h = (b-a)/n;
x = a:h:b;
f = sqrt(1-x.*x);
s = [];
for k = 1:n
    s1 = (f(k)+f(k+1))*h/2;
    s = [s,s1];
end
pai = 4*sum(s)

%利用蒙特卡洛法求Π的近似值
s = 0;
n = input('n=?');
for i = 1:n
    x = rand(1);
    y = rand(1);
    if x*x+y*y<=1
        s = s+1;
    end
end
pai = (s/n)*4

按照 MATLABE的定义,for语句的循环变量也可以是一个
列向量(以上的特例,可以看作每列元素只有一个数),其格式为:

for        循环变量 = 矩阵表达式

                循环体语句

end

例如

% for k = [1,2,3,4] %
s = 0;
for k =[1,2,3,4]
    s= s+1;
end
disp(['第一个执行次数:',s]);
disp(s);
disp(['第一个k的数值:',k]);
disp(k);

% for k = [1;2;3;4] %
s = 0;
for k = [1;2;3;4]
    s = s+1;
end
disp(['第二个执行次数:']);
disp(s);
disp(['第二个k的数值:']);
disp(k);


命令行结果:

第一个执行次数:
     4

第一个k的数值:
     4

第二个执行次数:
     1

第二个k的数值:
     1
     2
     3
     4

五、用while语句实现循环结构

while        条件

                循环体语句

end

例子:

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


n = 0;
su = 0;
x = input('x = ');
while x ~= 0
    n = n + 1;
    su = su + x;
    x = input('x = ');
end
disp('和:');
disp(su);
disp('均值:');
disp(su/n);

while语句多用于循环次数不确定的情况,而对于循环次数确定的情况,使用for语句更方便。

针对不同情况可以选择不同的循环语句,但从功能上讲两种循环语句可以相互替代

流程转向语句,break语句和continue语句

(1)break语句:用来跳出循环体,结束整个循环。

(2)continue语句:用来结束本次循环,接着进行下一次是否执行循环的判断。

%求 [100,200] 之间第一个能被21整除的整数

for k = 100:200
    if rem(k,21) == 0
    break;
    end
end
disp(k);



%求 [100,200] 之间第一个能被21整除的整数,另一种思路
for n = 100:200
    if rem(n,21)~=0
        continue
    end
    n
    break
end

循环的嵌套

例程:(没懂的算法)

例3用筛选法求某自然数范围内的全部素数
筛选法求素数的基本思想:要找出2m之间的全部素数,首先在2~m中
划去2的倍数(不包括2),然后划去3的倍数(不包括3),由于4已
被划去,再找5的倍数(不包括5),…,直到再划去不超过m的倍
数,剩下的数就都是素数了。

%用筛选法求某自然数范围内的全部素数
m = input('m=');
p = 1:m;
p(1) = 0;
for i = 2:sqrt(m)
    for j=2*i:i:m
        p(j)=0;
    end
end
n = find(p~=0);
p(n)

六、函数文件的定义与调用

1、普通函数 

函数文件的基本结构:

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

注释说明部分

函数体语句

当有多个形参时,形参之间用逗号分隔,组成形参表。当输出形参多于一个时,应该用方括号括起来,构成一个输出矩阵。

函数文件名通常由函数名再加上扩展名.m组成,函数文件名与函数名也可以不相同。

(一般推荐将函数文件名与函数名统一)

 Return语句:用于结束函数的执行。

例子:定义一个知道半径r,求圆面积、周长的函数,并调用

% 求圆的面积和周长的函数定义

function [S,L] = cy(r)
    S = pi*r^2;
    L = 2*pi*r;
end
% 求圆面积和周长函数的调用

r = input('r = ')
[S,L] = cy(r);
disp('面积:');
disp(S);
disp('周长:');
disp(L);

2、匿名函数

 基本格式:

        函数句柄变量=@(匿名函数输入参数)匿名函数表达式

例程:

>> f = @(x,y)x^2+y^2;    %匿名函数的定义,输入形参为x、y,返回值为x^2+y^2的运算结果。

f(3,4)    %调用匿名函数

ans =

    25

不仅可以给函数表达式定义句柄,还可以给已经存在的函数(包括内部函数、自定义函数)定义句柄。 

>> ccc =@ cos    %为cos()函数定义句柄,以后可以用CCC() 来调用cos() 函数

ccc =

  包含以下值的 function_handle:

    @cos

>> ccc(pi)

ans =

         -1.00

七、函数的递归调用

1、直接递归调用

如:f函数直接调用f函数本身

2、间接递归调用

如:f函数调用了其他函数,而其他函数调用了f函数

 例程:

% 利用函数的递归调用,求n!。

fmult.m 文件如下

function nn = fmult(n)
    if n<=1
        nn = 1;
    else
        nn = n*fmult(n-1);
end

递归编程 的 关键是想清楚 递归表达式,也就是算法。这很重要!!!

八、函数参数与变量的作用域

1、函数参数的可调性

 Matlab在函数调用上有一个特点,就是函数所传递参数数目是可调的。

在调用函数时,Matlab有两个预定义变量,

nargin        记录输入实参的个数

nargout        记录输出实参的个数

2、参数的作用域

% 可以根据输入参数个数的不同,进行判断,并执行相关语句
function fout = test1(a,b,c)

    if nargin == 1
        fout =a;
    elseif nargin ==2
            fout = a+b;
        elseif nargin ==3
                fout=(a*b*c)/2;
            end
end

局部变量,是指在程序中只在特定过程或函数中可以访问的变量。

全局变量的作用域是整个MATLAB工作空间,也就是全程有效,所有的函数都可以对它进行存取和修改。

全局变量的应用实例:

function f = wad(x,y)
    global ALPHA BETA
    f = ALPHA*x + BETA*y;
end

调用全局变量需要在命令行窗口声明一下全局变量。

global  ALPHA  BETA

猜你喜欢

转载自blog.csdn.net/weixin_41949409/article/details/120213965