MATLAB中只存在变量,不存在不可修改的常量,变量的定义不像C语言一样需要类型,当MATLAB遇到一个新的变量名时,会自动为其分配合适的存储空间。
如下图所示,定义变量时需要同时为其赋值,否则MATLAB无法正确识别,如果是已存在的变量,输入其名称后在命令行窗口会自动输出该变量的值。若输入数据(如数值、矩阵、通过单引号" ’ "括起来的字符串)则会默认赋给特殊变量ans。
变量名区分大小写,并且最多包含63个字符,必须以字母开头,不允许标点符号。
MATLAB中存在特殊变量,部分特殊变量名及介绍如下表所示。
特殊变量名 | 说明 |
---|---|
ans | 默认变量名 |
pi | 圆周率(显示在工作区为3.1416) |
realmin | 最小的正浮点数(实数)(默认2.2251e-308) |
realmax | 最大的正浮点数(实数)(默认1.7977e+308) |
inf | 无穷大(比如1/0的结果) |
eps | 浮点运算相对精度(2.2204e-16) |
nan | 非数(结果不确定,比如0/0、inf/inf的结果) |
特殊变量同样可以当成普通变量赋值,比如pi=3会生效,原本的值则被覆盖。
同时,MATLAB中具有不能作为变量名的字符串,这些字符串也被称为关键字,在命令行中输入iskeyword即可查看,如下图所示。
接下来介绍MATLAB中各种变量类型,也就是数据类型。
MATLAB中的数值采用十进制,可以带小数点和正负号。可以通过科学计数法表示数值,也可以通过i或j表示虚数,如下面的程序所示。
%普通数据
a=2203
b=-336
c=0.09
%科学计数法
d=3.14e3
e=9e-9
%虚数
f=2i+6
g=-6j
运行后如下图所示。(在语句结尾添加了分号";"防止大量输出)
一般情况下MATLAB的每一个数据都为双精度浮点数,当然显示的时候不一定,可以通过format命令设置数据显示格式,使用方法为
format 格式名
。双精度浮点数占8个字节(64位),最高位为符号位(0为正,1为负),52 ~ 62位为指数部分,0 ~ 51为小数部分。(当然显示时会根据数据大小自动调整,除非通过format设置)
MATLAB同样存在逻辑变量,定义变量时将其赋值为true或false即可,逻辑变量输出时会增加标识logical表示该变量为逻辑变量,如下图所示。
由于MATLAB与C不同的变量存储形式,字符可以视为仅有一个字符串的字符,其创建、调用方式完全一致,可视为数组。存储时每个字符占用两个字节。
1.通过单引号" ’ “或双引号括起相应字符串并赋给变量即可(不括起会被认为是变量名)
2.通过方括号”[“和”]“与单引号" ’ "括起相应字符
通过变量名可直接调用整个字符串,也可以类似数组调用,通过()和下标调用字符串中的某一个字符,或通过()、:、下标调用一连串的字符。
函数名 | 使用 | 说明 |
---|---|---|
blanks | blanks(n) | 创建含n个空格符的字符串(n可以为0或其它数字) |
cell2mat | cell2mat(元胞数组名) | 将元胞数组转换为数值数值或字符串数组(具体效果可自行尝试) MATLAB有些函数返回值为元胞数组,且元胞数组存储数据较方便 |
hex2dec | hex2dec(str) | 将字符串表示的十六进制转换为十进制数(因此字符串中的字符只能为0 ~ 9或a ~ f) |
num2str | num2str(num) | 将数值转换为字符串,即234转为‘234’ |
sort | sort(数组名) | 使数组元素按值的大小排序(字符串也是数组) |
str2double | str2double(str) | 与num2str相反,将字符串转换为对应的数值,即‘234’转为234,此时str中的字符只能为十进制数字 |
strcat | strcat(str1,str2,……) | 将str1、str2、……等字符串依次连接 |
strcmp | strcmp(str1,str2) | 比较str1和str2是否相同,是则返回逻辑1,否则返回逻辑0 |
strfind | strfind(str1,str2) | 在str1中查找str2,并返回应该矩阵,矩阵元素为索引值。 |
数据形式是指数据存储的方式,MATLAB中的数据格式包括数组、元胞数组和结构体。
MATLAB中的数组常常被当成矩阵,个人认为两者不同,MATLAB中的数组只是多了矩阵的计算方式而已,具体可查看标量、向量、数组和矩阵。
MATLAB中几乎所有数据都默认存储为数组格式,包括数值、逻辑变量、字符和字符串等(单个则为1×1矩阵)。MATLAB中的数组和其它编程语言中的数组类似,不同之处在于MATLAB中的数组可以扩容,并且不止是作为数据的集合,而是拥有类似矩阵的计算方式。
注意,该方法只能创建一维数组和二维数组。
num1:num2 %创建以num1为第一个元素,最后一个元素小于num2,元素间隔为1的一维数组
num1:inc:num2 %创建以num1为第一个元素,最后一个元素小于num2,元素间隔为inc的一维数组
如果num1无法通过增加inc的方式接近num2,那么返回空数组。
注意,该方法只能创建一维数组。
函数名 | 示例 | 说明 |
---|---|---|
ones | ones(行数,列数) | 生成相应行列数的数据,并赋初值为1 |
zeros | zeros(行数,列数) | 生成相应行列数的数据,并赋初值为0 |
rand | rand(行数,列数) | 生成相应行列数的数据,并赋初值为0 ~ 1间的任意数 |
diag | diag(一维数组名,对角线数) | 将一维数组元素作为对应数字对角线的元素,构成类对角数组(对角线数为0则为对角数组:对角线外元素为0) 注意:当一维数组名位置为二维数组名时,将二维数组对应数字的对角线元素返回(形式为一维数组) |
eye | eye(行数,列数) | 生成相应行列数的单位数组 (说成单位矩阵可能更容易懂,但编程语言只有数组) |
magic | magic(num) | 生成相应长度(num×num)的魔方数组(魔方阵) |
randn | randn(行数,列数) | 生成相应行列数的数组,数组元素为正态分布值 |
注意:上述构造数组的函数不止有示例中的用法,一般在括号中可以有多个数字,通过逗号“,”隔开,生成相应维度的数组。
通过其它文件,比如txt文件或者m文件同样可以创建数组
load 123.txt
即可生成元素为1~9、0的数组1 2 3 4 5 6 7 8 9 0
data
即可根据该文件中的数组创建相同的数组示例(假设Array,Array1,Array2为已存在数组的数组名) | 说明 |
---|---|
Array(num1:inc:num2) | 组合数组Array中第num1个元素开始,每隔inc步长,到第num2个元素为新的数组 |
Array([num1 num2 ……]) | 组合数组Array中第num1,num2个元素为新的数组 |
Array(num,:) | 组合数组Array中第num行所有元素为新的数组(单行多列) |
Array(:,num) | 组合数组Array中第num列所有元素为新的数组(多行单列) |
Array(num1:num2,:) | 组合数组Array中第num1 ~ num2行所有元素为新的数组(num2-num1+1行多列) |
Array(:,num3:num4) | 组合数组Array中第num3 ~ num4列所有元素为新的数组(多行num4-num3+1列) |
Array(num1:num2,num3:num4) | 组合数组Array中第num1 ~ num2行,第num3 ~ num4列中的元素为新的数组(num2-num1+1行num4-num3+1列) |
(Array1,Array2) | 将两个数组进行横向拼接,此时两个数组行数应该相同,组合后也不变 |
(Array1;Array2) | 将两个数组进行纵向拼接,此时两个数组列数应该相同,组合后也不变 |
对数组的访问只能通过下标进行访问,下标的格式很多,对3×3的矩阵Array,可以通过Array(2,2)或Array(5)访问中心的元素,对更高维的数组,同样可以用更低维的表示方式去获取元素。(毕竟,不管用Array(2,2)还是Array(5),最后都会被计算为Array(5),也就是对应的数组下标,而不是通过维度数获取)
matlab的数组与其它编程语言最大的不同之处在于,添加了类似矩阵的计算方式,下面假设Array1,Array2为已存在数组的数组名。
进行算数运算时,两个数组的行列数必须相等。
符号 | 示例 | 作用 |
---|---|---|
+ | Array1+Array2 | 将两个数组对应下标的元素取和 |
- | Array1-Array2 | 将两个数组对应下标的元素取差 |
.* | Array1.*Array2 | 将两个数组对应下标的元素取积 |
./ | Array1./Array2 | 求数组Array1对应下标的元素除以Array2对应元素的商(左除) |
.\ | Array1.\Array2 | 求数组Array2对应下标的元素除以Array1对应元素的商(右除) |
.^ | Array1.^Array2 | 根据数组下标,求对应元素的幂 |
.’ | Array1.’ | 共轭转置 |
’ | Array1’ | 转置 |
对于只含有一个元素的数组变量,后四个运算符号可以将小数点"."去除,效果一致。
matlab中的关系运算符包括小于(<)、大于(>)、等于(==)、小于等于(<=)、大于等于(>=)、不等于(~=)6种,可用于判断两个数组对应下标的元素关系,因此,两个数组的行列数必须相等,返回的结果是一个行列数相同的数组,对应下标表示结果,1表示关系符合相应运算符,0表示关系不符合相应运算符。(当然,也可以和常数进行比较,即将数组中每个元素都和该元素比较)
round函数用于取整。
运算符 | 运算符示例 | 等效运算函数 | 运算函数示例 | 作用 |
---|---|---|---|---|
& | Array1&Array2 | and | and(Array1,Array2) | 与 |
| | Array1|Array2 | or | or(Array1,Array2) | 或 |
~ | ~Array1 | not | not(Array1) | 非 |
xor | xor(Array1,Array2) | 异或 | ||
&& | Array1&&Array2 | 快速与 | ||
|| | Array1||Array2 | 快速或 |
上述逻辑运算符同样可以用于数值变量,毕竟数值变量在matlab属于1×1矩阵。
快速与和与的区别在于,前者只能对1×1矩阵(也就是变量)进行运算,当判断Array1为0时,不再继续判断Array2。(快速或和或同)
符号 | 示例 | 作用 |
---|---|---|
* | Array1*Array2 | 矩阵乘法,Array1乘以Array2(Array1的列数和Array2的行数需要一致) |
/ | Array1/Array2 | 矩阵除法,Array1乘以Array2的逆矩阵 |
\ | Array1\Array2 | 矩阵除法,Array1的逆矩阵乘以Array2 |
^ | Array1^num | 求数组Array1对应的乘法(Array1必为方阵) |
注意,实际上矩阵是没有除法这种东西的,当使用除号时,实际上是将作为除数的矩阵求逆,再乘上另一个矩阵。而可以求逆的矩阵必须是方阵。(使用时还需要注意除数和被除数的行列数)
优先级 | 运算符 |
---|---|
最高 | 转置(.‘)、共轭转置(’)、乘方( .^ )、矩阵乘方(^) |
一元加法(+)、—元减法(-)、逻辑非(~) | |
乘法(.* )、矩阵乘法(*)、右除(./)、左除(.\)、矩阵右除(/)、矩阵左除(\) | |
加法(+)、减法(-) | |
冒号运算符(:) | |
小于(<)、小于等于(<=)、大于(>)、大于等于(>=)、等于(==)、不等于(~=) | |
逻辑与(&) | |
逻辑或(|) | |
快速与(&&) | |
最低 | 快速或(||) |
一元加法也就是数字前面用于表示正负的符号。
matlab中取反效果和逻辑非效果一致。
元胞数组,即一个数组,该数组每个元素都是一个元胞,而每个元胞都可以保存不同形式的数据,包括元胞数组。元胞数组和数组的区别,与数组和数值的区别几乎完全一致。(唯一不同在于数组不能将其它数组作为元素)
元胞数组的创建需要通过大括号"{",其中各个元素通过,隔开,元素可以为数值、数组、元胞数组等,如下图所示,定义一个包含数值、数组、元胞数组的元胞数组c。
当然也可以定义成多维的元胞数组,与定义数组一致通过;隔开即可,如下图所示。
当然,元胞数组创建时与矩阵创建一致,内容可以为空,比如a={}即创建一个空的元胞数组,名为a。
通过元胞数组名{num}
可以将元胞数组中的第num个元胞提取出来,格式为矩阵,如下图所示,提取元胞数组a的第2个元胞,并将其赋给变量array。
通过元胞数组名{num1}(num2)
可以将num1个元胞中的第num2个元素提取出来,如下图所示,a{2,1}提取出矩阵‘sea’,(1,2)提取第1行第2列的数据。
MATLAB中具有大量元胞数组操作函数,一般只会使用到cell2mat和用于判断是否为元胞数组的iscell函数,其它函数可参考元胞数组操作函数。
结构体通过struct定义,其格式为如下所示,其中field为字段,只能为字符串(字符串变量或通过’'括起来都行),value为对应字段的值,可以为数值、字符串、结构体等。
struct(field1,value1,...,fieldN,valueN) %fieldN为属性名,value为对应属性的值
通过结构体名.属性名
会返回相应属性的值,也可以通过这种方法赋值或扩展结构体。
函数名 | 使用 | 说明 |
---|---|---|
struct | struct(field1,value1,…,fieldN,valueN) | 定义结构体变量 |
fieldnames | fieldnames(结构体名) | 返回以结构体中的field1、field2、……、fieldN为元胞的元胞数组,即相应的属性名 |
isstruct | isstruct(任意名称) | 返回该名称是否代表一个结构体变量,是则返回逻辑1,否则返回逻辑0 |
isfield | isfield(结构体名称,字符串) | 判断该字符串是否为该结构体其中一个属性名 |
getfield | getfield(结构体名称,属性名) | 获取该结构体中相应属性的值,等效于结构体名.属性名 ,但该函数有更深入的使用,具体可以参考getfield应用 |
setfield | setfield(结构体名称,属性名,值) | 将该结构体中相应属性赋予对应值,等效于结构体名.属性名=值 ,但该函数有更深入的使用,具体可以参考setfield应用 |
rmfield | rmfield(结构体名称,属性名) | 删除该结构体中的相应属性,也可以将多个属性形成元胞数组后一次性删除(属性名变为元胞数组名) |
数据分析:利用适当的统计方法,对相应数据进行分析,以提取有效信息并形成结论。
函数名 | 作用 | 示例 | 说明 |
---|---|---|---|
mean | 求数据均值(期望) | mean(Array) mean(Array,num) |
返回Array中各列元素的平均值(形成1*列数大小的矩阵),若为单行或单列则返回对应平均值 取对应维数的平均值(num为1时和 mean(Array) 等效,为2时取各行元素的平均值……) |
sort | 进行列向排序 | sort(Array) sort(Array) [Y,I]=sort(Array) sort(Array,num) |
返回Array按各列排序后的矩阵(形成1*列数大小的矩阵),若为单行或单列则直接全体排序 使指定列 返回矩阵Y和矩阵I,Y和 sort(Array) 一致,I中元素为Y对应下标元素在Array中的位置在对应维数内排序 |
range | 求最大值和最小值的差 | range(Array) | 返回Array中各列中最大值和最小值的差(形成1*列数大小的矩阵),若为单行或单列则返回最大值和最小值的差 |
var | 求样本方差 | var(Array) | 返回Array中各列的样本方差(形成1*列数大小的矩阵),若为单行或单列则返回全部元素的样本方差 方差可以使用var(Array,1) |
std | 求样本标准差 | std(Array) | 标准差可以使用std(Array,1) |
cov | 求协方差 | cov(Array) | 返回Array中各列的协方差(返回方阵,对角线元素为各列方差),若为单行或单列则返回其协方差值 |
corrcoef | 求相关系数 | 参数可以为单个矩阵或两个维数相等的 |
与C语言不同的是,matlab中的数组、结构体等可以通过赋值直接扩容,比如如下所示的代码在matlab是合法的。
a=[1 2 3]
a(4)=4