MATLAB编程基础


变量与语句

 MATLAB中,变量不需要预先声明就可以直接进行赋值操作。变量命名需遵守以下规则:

  • 变量名和函数名对字母的大小写敏感。
  • 变量名必须以字母为开端。
  • 不能使用MATLAB的关键字作为变量名。
  • 避免使用函数名作变量名。

变量类型

MATLAB变量分为三类:

  • 局部变量:MATLAB每个函数都有自己的局部变量,与其他函数变量及祝工作区的变量是分开存储。当函数调用结束后,局部变量也将随之删除。
  • 全局变量:在MATLAB全部工作区中有效,当一个工作区内改变该变量的值时,该变量在其他工作区的值也将改变。声明格式为global x_Val
  • 永久变量:只能在M文件函数中定义和使用。当声明它的函数退出时,永久变量继续保存在内存中。声明格式为persistent a

特殊变量

标识 描述 标识 描述
ans 系统默认保存计算结果的变量名 nargout 函数输出参数个数
pi 圆周率 realmin 可用的最小正实数
Eps MATLAB最小数 realmax 可用的最大正实数
inf 无穷大 bitmax 可用的最大正整数
NaN或nan 不定数 varargin 可变的函数输入参数个数
i或j 虚数 varargout 可变的函数输出参数个数
nargin 函数输入参数个数

关键字

>> reshape(iskeyword,[5,4])

ans =

  5×4 cell 数组

    {'break'   }    {'else'    }    {'global'    }    {'return'}
    {'case'    }    {'elseif'  }    {'if'        }    {'spmd'  }
    {'catch'   }    {'end'     }    {'otherwise' }    {'switch'}
    {'classdef'}    {'for'     }    {'parfor'    }    {'try'   }
    {'continue'}    {'function'}    {'persistent'}    {'while' }

程序控制

分支结构

  1. if-else结构
if expression
    commands
end

或者

if expression
    commands
else
    commands2
end

或者

if expression
    commands
elseif expression2
    commands2
else
    commends3
end
  1. switch-case结构
switch value %value为需要进行判决的标量或字符串
    case test1
        commands1
    case test2
        commands2
    case testk
        commandsk
    otherwise
        commands
end
  1. try-catch结构
try
    commands1
catch
    commands2
end

实例:

n = 16;
mat = magic(3);
try
    mat_num = mat(n);
catch
    mat_end = mat(end);
    disp(lasterr);
end

输出如下:

>> study
索引超出数组元素的数目(9)

循环结构

for循环:

for x = array
    commands
end

while循环:

while expression
    commands
end

其他常用控制命令

inputkeyboard命令:

input命令将MATLAB的控制权暂时交给用户,等待用户通过键盘输入数值、字符串或表达式并按下Enter键将输入的内容传递到工作区,收回控制权。

value = input('请输入值:');
disp(value);

输出:

>> study
请输入值:2
     2

keyboard命令将控制权暂时交给键盘,用户可以用键盘输入各种合法的MATLAB命令只有当用户输入完成,并输入return命令后,才收回控制权。

两个的不同在于:keyboard命令允许输入任意多个MATLAB命令,而input命令只允许用户输入赋值给变量的数组,字符串或元胞数组。

pause命令:控制执行文件的暂停和恢复,调用格式为pause(n),暂停n秒。

errorwarning命令:错误和警告命令。

error('message'); % 显式错误信息message,终止程序
errortrap % 错误发生后,控制程序继续执行与否的开关
lasterr % 终止程序并显示系统判断的最新出错原因
warning('message'); % 显示警告信息,继续运行程序
lastwarn % 显示系统给出的最新警告程序并继续运行

函数

M文件函数参数控制命令:

控制命令 说明
nargin 指定调用函数所带参数的个数
nargout 指定调用函数所返回参数个数
inputname(x) 返回输入表上数字x所在位置的输入参数变量的名字,若为表达式则返回一个空字符串
nargchk 控制函数的输入参数的个数
varargin 函数可带有任意多个输入参数
varargout 函数可带有任意多个输出参数

匿名函数

创建方法:f = @(input1,input2,...) expression

注意:如果匿名函数没有输入参数,就在调用函数时用空格代替input,否则MATLAB将不执行该程序。

>> sqr = @(x) x.^3

sqr =

  包含以下值的 function_handle:

    @(x)x.^3

>> t = sqr([1 2 3])

t =

     1     8    27

子函数

function [s,m] = sm(x)
%UNTITLED3 此处显示有关此函数的摘要
%   此处显示详细说明
% outputArg1 = inputArg1;
% outputArg2 = inputArg2;
n = length(x);
m = mymean(x,n);
s = mysum(x);

end

function m = mymean(x,n)
m = sum(x)/n;

end
function s = mysum(x)
s = sum(x);
end

命令行运行:

>> x = [1 2 3 4 5]

x =

     1     2     3     4     5

>> [sum, mean] = sm(x)

sum =

    15


mean =

     3

内联函数

>> f = inline('2*exp(x.^2)')

f =

     内联函数:
     f(x) = 2*exp(x.^2)

>> ans1 = argnames(f) %内联函数的输入变量

ans1 =

  1×1 cell 数组

    {'x'}

>> ans2 = formula(f) % 内联函数计算公式

ans2 =

    '2*exp(x.^2)'

>> ans3 = char(f) % 内联函数计算公式

ans3 =

    '2*exp(x.^2)'

>> ans4 = class(f) %内联函数类型

ans4 =

    'inline'

>> ans5 = f([1 2 3 4 5])

ans5 =

   1.0e+11 *

    0.0000    0.0000    0.0000    0.0002    1.4401

eval、feval函数

  1. eval函数

eval函数用于翻译并执行文本字符串并返回结果,调用格式:

eval(expression)
[output1,output2] = eval(expression)

示例:

>> x = 3

x =

     3

>> str = 'eye(x)'

str =

    'eye(x)'

>> eval(str)

ans =

     1     0     0
     0     1     0
     0     0     1
  1. feval函数

feval函数可以将函数句柄文本与函数连续,提供函数计算输入并返回求解结果。调用格式:

[y1, y2, ...] = feval(fhandle, x1,..., xn)

[y1, y2, ...] = feval(fname, x1,..., xn)

示例:

>> x = 5

x =

     5

>> str = @eye

str =

  包含以下值的 function_handle:

    @eye

>> feval(str,5)

ans =

     1     0     0     0     0
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1

函数编写建议

  1. 为函数语句添加必要的注释。
  2. 尽可能将循环转换为向量。
  3. 如果不能向量化,可以通过预分配任何输出结果所在的向量或数组来加快循环。
  4. 编程时在程序之前以注释的形式编写帮助文件,以方便使用和维护。

M文件变量检测

可变数量的输入输出

  1. 可变数量输入示例:
function sm(varargin)
%UNTITLED3 此处显示有关此函数的摘要
%   此处显示详细说明
% outputArg1 = inputArg1;
% outputArg2 = inputArg2;
fprintf('输入参数数量:%d\n',nargin);
celldisp(varargin);
end

命令行运行:

>> sm(eye(5),'this is a function',pi)
输入参数数量:3

ans{1} =

     1     0     0     0     0
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1



ans{2} =

this is a function


ans{3} =

    3.1416
  1. 可变数量输出示例:
function [s,varargout]= sm(x)
%UNTITLED3 此处显示有关此函数的摘要
%   此处显示详细说明
% outputArg1 = inputArg1;
% outputArg2 = inputArg2;
nout = max(nargout,1) -1;
s = size(x);
for k=1:nout
   varargout{k} = s(k); 
end
end

命令行运行:

>> [s,rows,cols] = sm(randn(3,4,5))

s =

     3     4     5


rows =

     3


cols =

     4

文章作者: HANABI
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HANABI !
评论
  目录