matlab基础语法

title: matlab基础语法
date: 2019-08-19 08:53:16

一、变量

变量命名:区分大小写,必须以字母开头,后可跟下划线和数字

变量类型:

  1. 全局变量:global X_Val,变量名大写,在函数体开头位置进行定义
  2. 永久变量:persistent a,只允许声明它的函数进行存取

二、控制流

1.顺序结构

2.if-else-end分支结构

注意:elseif是连在一起写的

x=input(' enter''x'': ');%input的实际参数是一个,即 enter'x': 
if(x>0)
    y=1;
elseif(x==0)
        y=0;
    else y=-1;
end
    disp(y)%将y结果输出在命令窗口中

3.switch-case结构

num=input(' enter''num'': ');
switch num
    case 1
        data='Hello';
    case 2
        data='Nice';
    case 3
        data='Good';
    otherwise
        data='No'
end
disp(data);

注意:exp(x),表示e的x次幂,参数也可以是矩阵,输出为矩阵次幂

4.try-catch结构

num=1;
Mat=magic(4)%方阵,且每行,每列,及对角线之和相等
try
    Mat_num=Mat(num,:)%取第num行元素
catch
    Mat_end=Mat(end,:)%若num超过了矩阵有的行数,均取最后一行
end
lasterr%显示出错原因,也会重复上一次出错情况下的错误原因(每次运行都会有输出)

5.for循环结构

注意:matlab是列优先的,所以for循环次数是由数组array的列数(即个数)决定的

for i=1:4
    for j=1:4
        if i>(5-j)
            Mat(i,j)=0;
        else
            Mat(i,j)=i+j-1;
        end   %与if配对的end
    end  %与j层循环配对
end  %与i层循环配对
        

6.while循环结构

while和end之间的内容为循环体,即C++中括号内内容,注意这里不使用括号,要习惯matlab里条件和循环体都不需要括号

%求第一个大于9999的斐波那契数列元素
a(1)=1;
a(2)=2;
i=3;
while a(i)<10000
    a(i)=a(i-2)+a(i-1);
    i=i+1;%这里不能写作i++或i+=1
end
[i a(i)]  %显示结果

7.return指令

用法和c++一样,可以使被调函数在未执行完的时候return到调用函数

8.input和keyboard指令

Value=input('message:');%引号中放输出在屏幕的提示信息
Value=input('message:','s');%将用户输入的信息以字符串形式赋给Value

keyboard将控制权交给键盘,可以直接从键盘读入指令,运行界面如下:

>> keyboard
K>> N=input('x:');
x:2

input指令只能够输入值(数组、字符串或元胞数组等),而keyboard可以输入指令

输入dbcont退出keyboard模式

元胞数组cell:类似于C++中的结构体,就是数组里可以包含不同类型的数据

9.yesinput、pause、continue、break指令

  • yesinput是一个只能输入的指令,无法在notebook中运行

    Value=yesinput('S:',0,3)这样出现函数未定义报错??,不知道咋回事,算了这个函数反正应该不常用,明明应该是系统自带的函数吧…没思绪

    声明变量用sym

  • pause命令

 Value=input('x:');
 pause;  %暂停执行文件,按任意键可以继续
 pause(3);%暂停3s,然后自动继续执行
 Value
  • continue命令和break命令与C++中相同

10.error和warning指令

error('message');%输出错误信息message(红色底),就像是java里try-catch错误信息那样自定义出错吧
errortrap;%也出现未定义??? 这个是发生错误后,控制程序是否继续执行的开关
lasterr%显示上一次出错原因,如果上一次没有出错就上上次
warning('message');
lastwarn;

三、脚本和函数

函数:以function开头,且.m文件应与函数名相同

function y=average(x)
[a,b]=size(x);
if ~((a==1)|(b==1)|(a==1)&(b==1))
    error('必须输入向量')
end
y=sum(x)/length(x);

匿名函数:直接在命令行中定义和使用

>> Fxy=@(x,y) x.^y+3*x*y

Fxy =

  包含以下值的 function_handle:

    @(x,y)x.^y+3*x*y

>> Fxy(2,5)

ans =

    62

1.eval和feval函数

eval函数应用举例:可以计算四种不同类型的语句字符串

(1)”表达式“字符串

Array=1:5;
String='[Array*2;Array/2;2.^Array]';
Output=eval(String)
>> test

Output =

    2.0000    4.0000    6.0000    8.0000   10.0000  %Array*2
    0.5000    1.0000    1.5000    2.0000    2.5000  %Array/2
    2.0000    4.0000    8.0000   16.0000   32.0000  %Array.^2

(2)“指令语句”字符串

theta=pi;
eval('Output=exp(sin(theta))');
who
>> test

Output =

    1.0000


您的变量为:

Array   Output  String  theta   %这里输出的是当前工作区的所有变量

(3)“备选指令语句”字符串: 只允许两个参数,以第一个为主,第二个是备选指令

Matrix=magic(3)
Array=eval('Matrix(5,:)','Matrix(3,:)')
errmessage=lasterr
>> test

Matrix =

     8     1     6
     3     5     7
     4     9     2


Array =

     4     9     2


errmessage =

    '位置 1 处的索引超出数组边界(不能超出 3)。'

(4)“组合“字符串:

Expression={'zeros','ones','rand','magic'};
Num=2;
Output=[];
for i=1:length(Expression)
    Output=[Output eval([Expression{i},'(',num2str(Num),')'])];
end
Output
>> test

Output =

         0         0    1.0000    1.0000    0.8147    0.1270    1.0000    3.0000  
         0         0    1.0000    1.0000    0.9058    0.9134    4.0000    2.0000

敲重点:eval函数的功能是将一个字符串等价转换为一个对应可执行的matlab语句,举例:

a = 3
eval('b=4')
a =
     3
b =
     4
eval([Expression{i},'(',num2str(Num),')'])
'zeros(2)'
'ones(2)'
'rand(2)'
'magic(2)'

再调用eval函数
eval('zeros(2)')  -->等价于MATLAB语句zeros(2)
eval('ones(2)')   -->等价于MATLAB语句ones(2)
eval('rand(2)')   -->等价于MATLAB语句rand(2)
eval('magic(2)')  -->等价于MATLAB语句magic(2)

生成了四个2*2的矩阵,在行方向拼接,形成2 *8的矩阵,Output最初时为空数组

feva函数应用举例:效率比eval高

[y1,y2,...]=feval['FN',arg1,arg2,...]  %与eval不同的是FN不可以是表达式

feval是用变量arg1,arg2,…来执行FN函数所指定的计算

两种写法举例:

eval('plot(z)');
feval('plot',z);

2.内联函数

inline('CE',arg1,arg2,...)inline('CE')(不能使用多标量构成的向量进行赋值,即只能一个参数)

示例:

可以自动辨识字符串‘CE’转化成输入变量自动生成的内联函数

内联函数用于沟通feval和eval,只要是eval可以操作的表达式都可以通过inline转换成内联函数,这样内联函数总能被feval调用

注意:字符串’CE’中不能包含赋值号"="

f1=inline('mod(12,5)')
f2=vectorize(f1)  %  使内联函数适用于数组运算的规则
f3=char(f2) %  取出计算公式,即f3='mod(12,5)'
class(f3)   %   'char'
class(f2)   %   'inline'
class(f1)   %  'inline'

最好使用带参数的,不然容易出问题

f4=inline('m*exp(n(1))*cos(n(2))'),f4(1,[-1])  %这样是不行的,没办法使用[-1,pi/2](错误提示:输入数目太多),就算变成[-1]也不行,去掉就会变成没有定义n

f5=inline('m*exp(n(1))*cos(n(2))','m','n'),f5(1,[-1,,pi/2])  % n(1),n(2)取的是[-1,pi/2]这个数组里的值

内联函数也可以向量输入、向量输出

y=inline('[3*x(1)*x(2)^3;sin(x(2))]')
argnames(y)  %输出函数y的变量名
x=[10,pi*5/6];
ans=y(x)
>> test

y =

     内联函数:
     y(x) = [3*x(1)*x(2)^3;sin(x(2))]


ans =

  1×1 cell 数组

    {'x'}


ans =

  538.3034
    0.5000

创建内联函数,并被feval调用示例:

Z=inline('floor(x)*sin(P1)*exp(P2^2)',2)  %第二个参数为数字的时候,表示的是输入参数的个数
argnames(Z)  
z=Z(2.3,pi/8,1.2)
fz=feval(Z,2.3,pi/8,1.2)
>> test

Z =

     内联函数:
     Z(x,P1,P2) = floor(x)*sin(P1)*exp(P2^2)


ans =

  3×1 cell 数组

    {'x' }
    {'P1'}
    {'P2'}


z =

    3.2304


fz =

    3.2304

3.向量化和预分配

向量化的目的主要是加速循环,例如:

x=0.01;
for k=1:1001
    y(k)=log10(x);
    x=x+0.01;
end
y

进行向量化翻译:

x=0.01:0.01:10
y=log10(x)
y

若一条代码无法向量化,我们通过预分配内存,加速循环,免去扩展r向量的时间

tic
t=zeros(100,1);
for n=1:100
    t(n)=rank(magic(n));
end
toc

你可能感兴趣的:(matlab)