您的位置:首页 > 编程语言 > MATLAB

使用matlab编写程序的一些总结

2017-12-09 09:42 302 查看

一、matlab中的程序

1.脚本程序的基本结构:注释+命令
2.函数程序的基本结构:函数定义行(必有),H1行,函数说明,函数主体(必有),注释
在matlab中新建一个函数文件,输入函数内容,保存好

function y = comp( x )

%comp是一个公式,计算结果为(x+10)^2*10

%   此处显示详细说明

z=x+10;

y=z.^2*10;

end

返回参数是y,所以函数中要有y

文件保存为comp.m
在命令行中调用时只能调用comp(10),必须要有参量
中间两行注释为当在命令行中输入命令

>>help comp时,会出现的内容,也就是用户定义函数的H1行,说明这个函数的作用和内容

同样,写好脚本之后,也会有这样的一个东西

3.P代码

一个写好的脚本,运行命令,
>>pcode ch6_4
生成了一个ch6_4.p的p代码文件
P代码的功能:
1.对m代码进行加密
2.对于大量图形处理的情况,直接使用P代码效率会高很多,大大提高其执行效率

二、参数与变量
1.参数
Matlab提供了方便的接口函数nargin,有些类似于C语言中常用的命令行参数个数变量argc,以下面的函数为例子
function out = check_arg( a,b,c )

%UNTITLED 此处显示有关此函数的摘要

%   此处显示详细说明

if nargin==1

    out=a;

elseif nargin==2

        out=(a.^2+b.^2);

elseif nargin==3

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

end

本来设定为三个参数, a,b,c,以及一个输出参数out,通过nargin这一matlab固有函数检查实际的输入参数的数目,就可以在程序内决定几种不同的运算方式和输出值nargin的意思是:number of arguments input

nargin这一固有函数也可以用于矩阵参数的输入。

同理,输出也有nargout函数

function [ first,remainder ] = token( string,separators )%这个函数程序接受两个输入参数,第一个为输入的字符串,第二个为每个单词间的分隔符(如果没有明确给出这第二个参数,则程序中默认地指定其为由9~13以及32这6个数组成的一个向量/数组,实际上就是指定ASCII码为这几个数字的几个字符来作为分隔符,也就是换行(LF)、回车(CR)和空格等特殊字符)。同时还可以看出,返回值也是有两个输出参数,第一个返回参数first的内容是输入字符串中的第一个单词,第二个范围阐述remainder的内容是出去第一个单词之外在输入字符串中剩余的部分字符串;而是否返回remainder参数,则是由用户调用时是否指定了第二输出参数(即nargout是否等于2来决定)
matlab中字符串是用两个单引号括起来‘’来表示。

%token 

%   Separate the first token

%   from input string according to the separators char assigned

if nargin<1

    error('Lack of enough input arguments')

end

first=[];remainder=[];

len=length(string);

if len==0

    return;

end

if nargin==1

    separators=[9:13 32];

    %Default separators are "white space characters"

end

i=1;

while(any(string(i)==separators))

%any函数也是matlab自带函数,用于判断一个向量的元素是否全部为0,有一个不是0,函数返回值为1,全是0则返回0
%string(i)表示一个字符,判断结果为一个与separator向量维数相同的新向量,其实质就是string(i)与separator中的每一个元素是否相等,如果相等,则为1,否则为0, 新向量的与string(i)相等的位置是1,不相等的是0

    i=i+1;

    if i>len

        return;

    end

end

start=i;

while(~any(string(i)==separators))

    i=i+1;

    if i>len

        break;

    end

end

finish=i-1;

first=string(start:finish);

if nargout==2

    remainder=string(finish+1:len);

end

执行结果:
>> str='He is a student';

>> token(str)

ans =

He

>> [first,rem]=token(str)

first =

He

rem =

 is a student

2.局部变量与全局变量
如果一个函数中的变量没有特别声明,那么这个变量就是一个只能在函数内部使用的局部变量,

使用global关键字将变量声明为全局变量,
外部调用该函数之前也要用global关键词再次声明该全局变量

例如:函数定义

function rmb = Dollar2RMB( dollar )

%UNTITLED4 此处显示有关此函数的摘要

%   此处显示详细说明

global Dollar2RMB;

rmb=dollar*Dollar2RMB;

end

文件名为rmb_dollar.m

实际调用代码为:

>> global Dollar2RMB

>> Dollar2RMB=6.35;

>> rmb_dollar(100)

ans =

   635

其实就是函数内部有个参数需要外部来赋值,然后用global声明一下,外面用global声明之后可以直接修改了。

全局变量的使用可以减少参数传递,要跨不同函数来使用同一个变量,使用全局变量很方便,提高了程序执行效率,实现分布式系统时,使用全局变量可以使系统达到并行化的作用。
但可能出现代码可读性以及进程安全问题。

3.特殊数值

i,j表示了复数,
Inf:无穷大
NaN:不是一个数值,not a number的意思,例如0/0的结果
version:matlab版本号


>>ver signal%查看信号处理工具箱版本号
>>ver simulink%查看动态系统仿真工具箱版本号
>>ver wavelet%小波分析版本号

三、数据类型

logic: true,false逻辑值数组
double
char ‘ He is a student’字符数组
cell {‘He’ 100 eye(4)}单元数组,可以包含其他不同类型的数据,适用于大型数据库
struct

创建二维的双精度double和逻辑值logical矩阵,有两种存储格式:
full完整的         sparse稀疏的

大多数元素都是0的矩阵,稀疏矩阵只存不是0的元素的位置和相应位置的元素,存储空间是等价完整矩阵的很小一部分。

>> speye(5)

ans =

   (1,1)        1

   (2,2)        1

   (3,3)        1

   (4,4)        1

   (5,5)        1

speye函数用来产生一个以稀疏矩阵形式存储的单位矩阵

>> A=[0 0 1;0 2.5 0;3.1 0 0.13];

>> [i,j,s]=find(A);%保存原矩阵中非零元素值及位置于向量s、i、j中,i表示位置的行,j表示位置的列,ij组成了位置坐标,s存下了那个位置的值

>> [m,n]=size(A);

>> S=sparse(i,j,s,m,n)%sparse函数生成了一个m行n列的稀疏矩阵

S =

   (3,1)       3.1000

   (2,2)       2.5000

   (1,3)       1.0000

   (3,3)       0.1300

四、运算符

matlab的运算符有下列三种类型

①算术运算符:处理两个运算元(操作数operand)的数学运算,例如+-×÷等
②关系运算符:比较两个运算元之间的关系,例如大于,小于,等于,等
③逻辑运算符:处理两个运算元的逻辑运算,与(&),或(|),返回值为TRUE(1)或FAULSE(0)

优先级:先加减乘除再比较大小最后逻辑运算

1.算术运算符

包括矩阵四则运算、矩阵的幂运算,单个数的四则运算和单个数的幂运算
   
运算符
功能
.'
矩阵的转置
'
矩阵的共轭转置
.^
矩阵的元素求幂
^
矩阵做幂
.*
矩阵的元素与相应元素相乘
*
矩阵的乘法运算
./
矩阵的元素做右除运算1./4=0.25
.\
矩阵的元素做左除运算1.\4=4
/
矩阵做右除运算
\
矩阵做左除运算
+
矩阵的加法
-
矩阵的减法

2.关系运算符
通常与if,while,for,switch 等流程控制语句来使用于程序的流程控制上。

<小于,<=小于等于,>大于,>=大于等于,==相等,~=不相等

根据对应的元素来
例如:A=[1 2 -1 -5];B=[0 2 3 1];
   A<B=[0 0 1 1]

使用这些关系运算符时需要注意,两个运算元(操作数)必须是:相同的维数(相同大小),或是其中一个是常数

检查一个数组是否为空:

>> X=[];

>> isempty(X)

ans =

  logical

   1

3.逻辑运算符

&与
|或
~非

用来处理两个运算元,两个运算元必须是相同维数/大小的数组或向量,其中一个也可以是常数

如果两个运算元是相同大小的数组,逻辑运算符会处理两个运算元中对应的元素的数值
非零即认为是1
例如:
进行运算:C=[5 -4 0 .5]
D=[0 1 0 9]
C&D=[0 1 0 1]
C&1=[1 1 0 1]

J=[1 0 1 0]
K=[0 0 1 1]

L=[0 1 NaN -inf];%NaN不是有限值,但不是无限大值
M=[0 0 9 inf]

逻辑函数: 功能:
示例
xor(X,Y) 异或
xor(J,K)=[1 0 0 1]
all(X) 检查是否全为非零,是则返回1
all(J)=0
any(X) 检查是否有非零元素,有则返回1
any(J)=1
isfinite(X)
检查是否为有限值 isfinite(L)=[1 1 0 0]
isinf(X) 检查是否为无限大值
isinf(L)=[0 0 0 1]
isnan(X) 检查是否为NaN
is(L)=[0 0 1 0]    isnan(L./M)=[1 0 1 1]

L./M=[0/0 1/0 NaN/9 -inf/inf]=[NaN inf NaN NaN]

4.运算符的应用实例

>> A=magic(5)

A =

    17    24     1     8    15

    23     5     7    14    16

     4     6    13    20    22

    10    12    19    21     3

    11    18    25     2     9

>> I=find(A<10)%找出小于10的元素,是一个列向量,返回值是位置(从左到右,从上到下遍历)

I =

     3

     7

     8

    11

    12

    16

    20

    24

    25

>> A(I)=0%把相应位置的元素置0

A =

    17    24     0     0    15

    23     0     0    14    16

     0     0    13    20    22

    10    12    19    21     0

    11    18    25     0     0

>> A<10

ans =

  5×5 logical 数组

   0   0   1   1   0

   0   1   1   0   0

   1   1   0   0   0

   0   0   0   0   1

   0   0   0   1   1

五、流程控制

4种基本的流程控制
if,else,elseif,end
根据逻辑条件执行一系列运算

switch,case,otherwise,end
根据逻辑条件开关值来选择执行的项目

while,end
根据逻辑条件来决定循环执行的次数

for,end 执行指定次数的循环

1.if语句

if 逻辑表达式一
运算命令一
elseif 逻辑表达式二
运算命令二
else
运算命令三
end

2.switch语句

switch 分支条件(数值或是字符串)
case 分支一
运算命令一
case 分支二
运算命令二
...
otherwise
运算命令N
end

3.while语句
运算命令一
while 循环条件
运算命令二
end

另外的方式
while A%当数组A是一个空数组A=[]时,会终止这个循环
运算命令
end

写n!的代码,可以直接写,也可以用递归,也可以调用prod函数
function result = factorial( n )

%UNTITLED3 此处显示有关此函数的摘要

%   求n的阶乘,使用while循环

if n<0

    return;%n小于0直接返回

else

    i=1;

    result=1;

    while i<n

        i=i+1;

        result=result*i;

    end

end

prod(1:n)=n!
prod([1 3 5 7])=1*3*5*7=105

4.for语句

for 计数器=初始值:增量:终止值%或是初始值:终止值,这时增量默认为1
运算命令
end

六、防止和检查代码问题的方法
①高亮显示或提供关于代码错误、低效率及潜在问题的报告:MATLAB可以通过消息(M-Lint消息)为代码检查错误和推荐改法,以使程序性能和可维护性最大化,这成为代码分析的功能
②高亮显示在你的文件中函数和变量的使用:高亮显示函数和变量以跟踪他们的作用域和使用情况。

代码分析:
自动对代码文件生成代码分析报告
打开一个现有的代码文件:tools->Code Analyzer->Show Code Analyzer Report
生成包含M-Lint消息的代码反洗报告,根据这些消息修改文件,保存文件,再生成新的代码分析报告看是否你的修改已经解决了消息中涉及的问题

对于调试程序而言:
设置断点运行程序,程序在断点处暂停
命令行出现K>>
输入变量,显示变量值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab
相关文章推荐