赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 编程语言

常用的编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN


首页 > 专业技术 > 编程语言 > MATLAB语言基础
MATLAB语言基础

MATLAB是由MathWorks公司开发的主要用于数值计算及可视化图形图像处理的工程软件,为科学研究、工程应用提供了功能强大、效率高、可扩展的编程工具。MATLAB语言易学易用,比较简洁直观,可快速上手,因此广泛应用于科学计算和工程应用中。
MATLAB是由Matrix和Laboratory两个英文词汇组合而成,即矩阵实验室的含义。其最早是美国新墨西哥州大学计算机科学系主任Cleve Moler博士讲授线性代数课时设计的一组程序接口,是用Fortran编写。1984年,John Little、Cleve Moler和Steve Bangert合伙成立了MathWorks公司,专门从事MATLAB软件开发并推向市场,其内核采用C语言编写,除原有数值计算能力外,还增加了数据图视功能。经过多年的发展,目前MATLAB成为科学技术领域最普遍使用的一种软件。

一、MATLAB基础:

1. 注释:
MATLAB中使用百分号%来注释,百分号后面是不执行的注释段。

2.. 变量和表达式:
MATLAB变量在使用前不需要预声明,也不需要指定类型。
1)变量定义的规则:
·变量名的大小写敏感
·变量名的第一个字母为英文字母,长度不超过63个字符,指令namelengthmax返回变量名长度
·变量名可以包含字母、下划线、字符、数字,但不能为空格、标点等
2)预定义变量:

变量

说明

变量

说明

ans

预设的计算结果的变量名

intmax

8位、16位、32位或64位整型的最大值

eps

正极小值2.2204e-16

intmin

8位、16位、32位或64位整型的最小值

pi

π值

realmax

最大的正实数

inf

无限大

realmin

最小的正实数

NaN

无法定义为一个数值

computer

计算机类型

i或j

虚数单位

version

MATLAB版本

3)检查MATLAB内存变量:
who或whos命令查看当前工作间的内存变量。其中 who只显示变量名,使用whos命令会显示Name、Size、Bytes、Class、Attributes。
可以使用clear命令删除变量。
4)表达式规则:
·表达式由变量名、运算符和函数名组成
·表达式按与常规相同优先级自左至右执行运算
·优先级规定顺序:指数运算、乘除运算、加减运算,括号可以改变它们的优先级
·赋值符=和运算符两侧允许空格
·如果一个指令过长可以在结尾加上...代表此行指令与下一行连续

3. 调用系统程序:

为了与操作系统交互,MATLAB是惊叹号!来调用系统程序或命令,后面加上&表示采用后台模式运行。

4. help命令:

可以使用help命令后跟函数名、类名或其他来获得帮助。

二、MATLAB数组:

MATLAB的运算是基于矩阵的,矩阵可以用数组来表示。涉及数组的操作最复杂。

1. 数组的产生:

MATLAB中对矩阵的维数不需要说明,系统会自动配置。数组可以按元素排列输入、内部函数或语句生成、m文件创建、外部数据文件导入、内存变量编辑器输入等几种方式,还可以由已有数组产生新数组。
1)逐个元素输入:
一维数组,使用一组方括号表示首位,元素间用空格或逗号“,”分隔,用分号“;”或回车键进行数组分行。
2)冒号输入:
格式:x=a:inc:b
主要针对一维数组,a表示数组的第一个元素,inc为采样点之间的间隔(即步长)。若<b-a)是inc的整数倍,则生成的最后一个元素为b,否则小于b。inc省略时默认为1;当inc>0时需要a<b,当inc<0时需要a>b;当inc=0时创建的数组为空。
3)采样法:
采样法主要用于一维数组产生,包含linspace和logspace两个函数,分别表示线性采样法和对数采样法。格式:
y=linspace(a,b,n)
其中,a、b分别表示数组的第一个和最后一个元素,n为采样总点数,缺省时n=100。该指令等价于y=a:(b-a)/(n-1):b。
y=logspace(a,b,n)
生成一维数组的第一个元素为10的a次幂,最后一个元素为10的b次幂,n为采样总点数,缺省时默认50。logspace还有另一种形式:
y=logspace(a,pi)
此采样点数组常用于数字信号处理频率响应。
4)标准数组生成函数:
MATLAB提供了创建特殊类型数组的函数:

函数

说明

函数

说明

ones

产生全1数组

randn

产生正态分布随机数组

zeros

产生全0数组

randperm

随机排列数组

diag

产生对角形数组

invhilb

逆hilbert数组

eye

产生单位数组

pascal

pascal数组

magic

产生魔方数组

accumarray

积聚数组

rand

产生均匀分布随机数组

hilb

hilbert数组

一般格式:ones(row,col),产生row行col列的数组,也可以使用ones(n)产生一维数组
diag(v, k)返回n+abs(k)列的正方形数组,其中n为向量v长度,根据向量v创建一个对角数组,元素放在对角线上,由k决定向上或向下偏移的程度。
5)通过文件产生:
有时需要处理大量的数据,可以把数据作为数组输入M文件中,或作为变量保存到mat文件中。mat文件中的数据在使用时可以直接导入工作空间。
6)产生特殊数组:
⑴空矩阵:
没有元素的数组称为空矩阵。创建方法:
A=[];
空矩阵也可以用函数产生,如A=zeros(0,5)
空矩阵认为是二维的。
⑵标量:
MATLAB中,任何一个实数或复数都被认为是1x1数组,称为标量。但使用ndims()方法可以获取其维数为2。
⑶矢量:
矢量只有一行或一列的数组。
⑷稀疏数组:
一些数组,含有大量的0,就称为稀疏数组。稀疏数组有一种有效的方法,只存储非零的元素及其索引。生成稀疏数组的函数为:
S=sparse(A)
S=sparse(i,j,s,m,n,nzmax)
S=sparse(i,j,s,m,n)
S=sparse(i,j,s)
S=sparse(m,n)
函数是将全元素矩阵转化为稀疏矩阵。在mxn维稀疏矩阵中,A(i(k),j(k))等于S(k)所对应的元素值,k为稀疏数组S的索引,nzmax指定稀疏矩阵S的存储空间大小。缺省情况下:
nzmax=length(s),m=max(i),n=max(j)。
sparse(m,n)是sparse([],[],[],m,n,0)的简化,生成mxn的空稀疏数组。

2. 数组的运算:

1)数学运算:
数学上,矩阵最基本的运算就是加、减、乘、除以及乘方(幂)。MATLAB数组运算符有:

运算

运算符

表达式

运算

运算符

表达式

+

a+b

^

a^b

-

a-b

点乘

.*

a.*b

*

a*b

点除

./或.\

a./b或a.\b

/或\

a/b或a\b

点幂

.^

a.^b

数组可以与常量或数组进行加、减运算,但数组间加、减运算需保持维数一致。数组乘运算即为点乘运算,矩阵乘运算使用*。一般情况下,数组运算和矩阵运算是等价的,只是含义方面有差别。
2)关系运算和逻辑运算:
MATLAB提供的关系运算有:

指令

说明

指令

说明

指令

说明

<

小于

>

大于

==

等于

<=

小于等于

>=

大于等于

!=

不等于

逻辑运算符:

指令

说明

指令

说明

指令

说明

&

逻辑and

|

逻辑or

~

逻辑not

逻辑关系函数有:

函数

说明

函数

说明

xor

不相同取1,否则取0

ismember

两个矩阵是属于关系取1,否则取0

any

只要有非0就取1,否则取0

isempty

矩阵为空取1,否则取0

all

全为1取1,否则为0

isletter

是字母取1,否则取0(可以是字符串)

isnan

为数NaN取1,否则为0

isstudent

学生版取1

ininf

为数inf取1,否则为0

isprime

质数取1,否则取1

isfinite

有限大小元素取1,否则取0

isreal

实数取1,否则取0

ischar

是字符串取1,否则为0

isspace

空格位置取1,否则取1

isequal

相等取1,否则为0

 

 

3)运算函数:
MATLAB还提供了大量的运算函数,通过这些函数可以对数组进行运算。如三角函数、指数对数函数等。

3. 数组的查询和赋值:

1)数组的下标:
表示数组中的单个元素,可以用单下标方式A(i),也可以使用多下标A(i,j),由数组维数决定。MATLAB在存储数组时,是以列向量为顺序存储的,即先存储第一列第一行的数据,再存储第一列第二行的数据,当第一列的数据都存储完后再存储第二列的数据。以此类推直到存储完最后一个数据。单个元素在整个矩阵存储中的位置只有下标i值,从1开始计数,这是单下标法,这种方式常用于行向量或列向量,也可以用于多维矩阵,但多维矩阵用多下标表示更直观一些。A(i,j)表示矩阵A的第i行第j列的元素。
数组的线性索引就对应于数组的存储位置。数组的下标转换成线性索引可以使用sub2ind函数来转换,示例:
linearindex=sub2ind(size(A),3,2)
使用ind2sub函数可以由索引获取数组的下标。示例:
[row col]=ind2sub(size(A),6)
2)一维数组的查询和赋值:
x=[1 2 3 4 5 6 7 8 9 0] %产生一个数组
x(5) %查询数组x的第5个元素
x([2 5 7]) %查询数组x的第2、5、7个元素
x(6:end) %查询数组x的第6个元素之后的元素
x(3:-1:1) %由前三个元素倒排
x(find(c>5)) %查询大于5的所有元素
x(5)=30 %给第5个元素重新赋值
x([1 4 7])=[40 50 20] %给第1、4、7个元素重新赋值
3)二维数组的查询和赋值:
x=rand(5,6) %创建一个5x6的随机数数组
x(4,5) %查询第4行第5列所对应的元素
x(3) %查询第3个元素(以列为顺序)
x(3,:) %查询第3行元素
x(:,3) %查询第3列元素
x(:) %把数组的每列以左右次序首位相连成一个长列数组
x([2 4;5 6]) %读取第2、4行和第5、6列所对应的数值
x(find(x>0.5)) %查询大于0.5的元素
x([3 20]) %查询一维数组[3 20]元素所对应x中的元素
x(3,2)=100 %修改下标(3,2)的值为100
x(:,4:5)=ones(5,2) %把第4、5列的元素赋值
x(1:20)=2 %把1:20分别作为数组索引,以列存储的方式赋值

4. 数组的变换:

MATLAB可以对已经生成的数组进行修改、扩展、收缩、重组等操作。
1)串联扩展:
串联,是指用一个或者多个数组创建一个新数组,方括号“[]”不仅用来直接构造数组,还是串联操作符。
·表达式C=[A B]表示水平串联数组A和B
·表达式C=[A;B]表示垂直串联数组A和B
为正确地串联数组,水平串联数组需要相同的行数,垂直串联数组需要相同的列数。
2)扩展函数:
大多数情况下,扩展方法要使用扩展函数,这也是多维数组的生成方法。
⑴reshape函数:在总元素不变下改变数组的行列数
A=reshape(a,3,3) %把数组a重排成3x3的数组
⑵repmat函数:按指定的行数、列数复制数组模块以形成更大的数组
repmat(A,2,3) %把A数组整体扩展成2x3的数组
⑶cat函数:把大小相同的若干数组沿指定维方向串联成多维数组
·cat(2,A,B)等价[A,B]
·cat(1,A,B)等价[A;B]
⑷horzcat、vertcat函数:水平和垂直串联函数
·horzcat(A,B)等价[A,B]
·vertcat(A,B)等价[A;B]
⑸blkdiag函数:以对角线的方法生成一个大数组,其他元素补0
out=blkdiag(A,B)
3)其他扩展:
⑴数组的赋值扩展:
x=reshape(1:9,3,3)
x(4,4)=100 %扩展成4x4的数组,并将元素(4,4)赋值0,其他补0
x(:,5)=50 %扩展成4x5的数组,第5列元素都为50
⑵查询扩展:
c=x(:,[1:5,1:5]) %等价于c=repmat(x,1,2)

5. 多维数组:

对于二维数组,习惯把数组第一维称为行Row,把第二晚称为列Column,对第三维可采用页Page。
1)创建多维数组:
Z(:,:,1)=A
Z(:,:,1)=B
使用低维数组生成多维数组。
MATLAB的函数ones、zeros、rand和randn可以直接创建标准的多维数组:
B=randn(4,3,2)
还可以借助cat、repmat、reshape等函数构造多维数组。
2)多维数组的引用:
⑴ndims指令获取数组维数:
行数组和列数组是一维的,矩阵是二维的,空数组也定义为二维的。没有0维的。
⑵size指令获取数组大小:
size给出数组各维上的大小。
⑶length指令获取数组的长度
向量的长度就是元素的个数;二维数组或多维数组的长度为数组中所有维中的最大长度。
⑷引用数组元素:
多维数组的元素也可以采用下标引用。
3)多维数组的操作:
MATLAB中很多函数支持多维数组,也有一些矩阵函数不能用于多维数组。支持多维数组的一些函数有:

函数

说明

函数

说明

cat

串联数组

permute

多维数组序列变换

circshift

数组环转换

shiftdim

维数变换移动

ipermute

多维数组序列逆变换

squeeze

删除一堆

ndgrid

生成多个数组

flipdim

以指定维平分面交换对称位置元素

ndims

获取数组维数

 

 

6. 字符数组:

字符串作为字符数组的子集。
1)创建字符数组:
⑴字符串:
MATLAB中用单引号来输入字符串,每个字符占用两个字节存储,可以使用class和ischar来查看变量是否为字符数组。
A='Hello!' %输入字符串Hello!
class(A) %判断变量A的类型
length(A) %获取字符串的长度
size(A) %获取字符数组大小
⑵输入多行字符串:
当采用输入数值数组的方式输入多行字符串时,应保证每行字符串的长度相同。如果输入的行长度不一致,应以最长的字符串为基准,其余的字符串以补足空格的方式来调节各行的长度。
⑶利用串操作函数创建多行字符串:
生成字符数组最简单的方法是使用专门函数char、str2mat、strvcat来创建多行字符串。使用这些函数创建多行字符串时,总是按最长行设置其他行字符串的长度,并且在其他行的尾部用空格填充。
B=char('This is a example.','The example has nultiple rows.')
⑷空串:
空串可以用blanks函数创建,deblank函数可以删除串尾部的空格符。
blanks(2) %创建n个空格串
⑸利用元胞数组创建复杂字符串:
在元胞数组中可以存放并操作不同类型和不同大小的数据。
c=[{'Matlab8.5'},{'http://www.mathworks.com'};{'图形图像处理'},{'学习笔记'}]
disp([c{1,1}])
2)字符数组的操作:
图形设计中需要把数值数组转换成字符串标示在图形界面上,或从输入的数值字符串转换成数组。
①字符串与数值转换常用的函数有:

函数

说明

函数

说明

num2str

把数值转换成字符串

str2num

把字符串转换成数值

int2str

把整数转换成字符串

sprintf

以控制格式把数值转换成字符串

mat2str

把数值矩阵转换成eval可调用的格式

sscanf

在格式控制下把字符串转换成数值

str2double

把字符串转换成双精度数值

fprintf

格式化数据输出到文件中或屏幕上

示例:
Bstr=num2str(B,3) %保持3位有效数字,转换为字符串
Bstr=mat2str(B,4) %保持4位有效数字,转换成数组输入的形式的字符串
Str=sprintf('%15.5f',[1/eps,pi]) %小数点前15位,小数点后5位的浮点数转换成字符串
sscanf(Cstr,'%f',[3,2]) %浮点格式把字符串转换成3x2数值数组
fid=fopen('exp.txt','w') %打开文件exp.txt
fprintf(fid,'%6.2f%12.8f\n',y) %把结果输出到文件中
fclose(fid) %关闭文件句柄
②MATLAB中字符采用2字节来存储,字符串与ASCII码的转换函数有:

函数

说明

函数

说明

double

把字符转换成ASCII码

char

把ASCII码转换成字符

abs

把字符转换成ASCII码

setstr

把ASCII码转换成字符

示例:
nNum=abs(mStr) %把字符串转换成ASCII码
char(nNum) %把ASCII码转换成字符串
③字符串英文大小写转换:

函数

说明

函数

说明

lower

把字符串中的英文字母转换成小写

upper

把字符串中的英文字母转换成大写

④字符串比较:

函数

说明

函数

说明

strcmp

比较两个字符串是否相等

strncmp

比较两个字符串前n个字符是否相等

strcmpi

忽略大小写比较两个字符串是否相等

strncmpi

忽略大小写比较两个字符串前n个字符是否相等

示例:
strcmp(str1, str2)
strncmp(str1, str2, 3)
⑤查找和置换字符串中的子串:

函数

说明

函数

说明

findstr

给出子串在字符串中的位置

strmatch

字符串匹配查询

strfind

可以用于元胞数组的查找函数

regexp

使用正则表达式查询

strtok

返回字符串中特定字符前面的所有字符

regexpi

忽略大小写的使用正则表达式查询

strrep

把字符串中的子串置换成新的子串

regexpreg

使用正则表达式置换字符串

findstr函数是以两个参数字符串的长短来判断查询与被查询的关系,位置用子串的第一个字符所在的位置表示。strfind函数的两个参数中前一个表示被查询的字符串,后一个表示子串。两个函数都区分大小写。strrep函数有三个参数,中间一个为查询子串,后一个为替换子串。
示例:
findstr(s, 'the')
strfind(s,'in')
[token,rem]=strtok(s) %默认的特定元素为空格,token为前面的字符串
str=strrep(s1,'good','great')
x=strmatch('max',strvcat('max','minimax','maximum')) %在多行字符串中查询匹配串
x=strmatch('max',strvcat('max','minimax','maximum'),'exact') %查询绝对匹配字符串
s1=regexp(str,'[A-Z]') %使用正则表达式查询
s2=regexp(str,'\s')

三、控制语句:

MATLAB是一种结构化的编程语言,包括一些控制程序流程的语句。

1. 循环结构:

有些循环可直接转化成向量操作,称为循环的矢量化,以提高程序的执行速度。
1)for语句:
for语句是一种循环语句,通常用来执行循环次数已知的情况,可以按指定的次数来重复执行循环体中的语句。常用格式:
for x=初值 : 步长 : 终值
  循环体
end
其中,变量x通常称为循环变量,初值和终值可以是标量,也可以是表达式。实际工程中,如果在进入for循环和for嵌套循环体之前,利用子程序创建变量和数组,而且可以通过zeros函数指定数组大小,就可以明显缩短循环程序的执行时间,这种方法称为阵列预分配。否则MATLAB在执行for循环体时自动分配内存,从而导致数据的覆盖。
2)while语句:
while语句也是一种循环语句,根据一个控制表达式的值来确定程序的运行,一般用于事先不能确定循环次数的情况。常用格式:
while 表达式
  循环体
end

2. 选择结构:

1)if-end选择结构:
if语句是一种条件选择结构语句,根据不同逻辑表达式的值来判断程序在执行过程中需要执行哪些语句。常用格式:
if 逻辑表达式
  命令语句体
end
如果逻辑表达式的值为真,程序就会执行命令语句体的语句;如果为假,程序就会跳过命令语句体,执行end之后的语句。
if语句可以嵌套使用,格式为:
if 逻辑表达式1
  语句体1
elseif 逻辑表达式2
  语句体2
......
elseif 逻辑表达式n
  语句体n
else
  语句体n+1
end
2)switch多分支选择结构:
switch语句可以根据一个变量或表达式的值执行特定的语句。常用格式:
switch 表达式0
  case 表达式1的值
    语句体1
  case 表达式2的值
    语句体2
  ......
  case 表达式n的值
    语句体n
  otherwise
    语句体n+1
end
先计算switch后面的表达式0的值,然后检查case子句后面的值是否与表达式0的值相等,值相等就执行相应语句体,否则继续检查下面的case语句,以此类推。如果所有case子句的值都不等于表达式0的值则执行otherwise子句后面的语句体。

3. 程序流控制:

1)return语句:
return语句用来终止当前正在执行的函数中的指令,返回调用它的函数。也可以用来终止键盘输入的模式,把控制权移交给键盘。如果在被调用函数中的适当位置加入return语句,则可以提前返回调用函数。
2)echo命令:
echo on:切换到显示其后所有被执行命令文件指令状态
echo off:切换到其后所有被执行命令文件指令不被显示的状态
还有一些echo调用格式:
echo FileName on:使FileName指定文件的指令在执行中被显示出来
echo FileName off:终止显示FileName文件的执行过程
Echo on all:显示其后所有被执行文件的过程
Echo off all:使其后所有被执行文件的过程不被显示
3)pause命令:
Pause命令是程序运行暂停,等待用户按任何键继续。Pause命令在程序调试以及需要看中间结果时特别有用。Pause用法有两种:
·pause暂停执行程序
·pause(n)在继续执行前暂停n秒
4)break语句:
break语句一般包含在while、for结构中,当条件满足时使循环提前终止,可以返回到上一级的循环。

四、文件操作:

1. 变量的保存与调用:

使用save来将MATLAB工作空间的变量保存到文件中,以便以后可以调用这些变量。格式:
save filename variables
从文件中调用变量的格式:
load filename variables
这里文件的扩展名为mat。

2. 文件的打开与关闭:

使用fopen和fclose可以对普通的文件实现打开、关闭及处理的功能。格式:
fp=fopen(fname, ftype)
st=fclose(fp)

3. 文件的输入与输出:

1)不定格式读取:
从文件fp中读取数据保存到矩阵a中。
a=fread(fp, size)
2)指定格式读取:
从句柄fp指定的文件中按字符串format所指定的格式读取数据,把它们保存到矩阵a中:
a=fscanf(fp, format, size)
示例:
a=fscanf(fp, '%s')
3)将数据写入文件中:
将字符串所指定的数据写入到fp所指定的文件中:
fprintf(fp, format, A, B, ...)
示例:
fprintf(fp, '%s', t, A)

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659