MATLAB(2)数据

数据

       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.通过方括号”[“和”]“与单引号" ’ "括起相应字符

注意,MATLAB中字符变量和字符串变量完全不同,字符变量可以通过数组,形成字符串,但不是字符串变量。具体可以通过双引号创建字符串变量然后通过whos查看大小

字符串变量可以转化为字符变量,转化方法为:字符串名{1},这样看来,字符串数组更类似于元胞数组,每个元胞都是1个字符数组。

调用

       通过变量名可直接调用整个字符串,也可以类似数组调用,通过()和下标调用字符串中的某一个字符,或通过()、:、下标调用一连串的字符。

相关函数

函数名使用说明
blanksblanks(n)创建含n个空格符的字符串(n可以为0或其它数字)
cell2matcell2mat(元胞数组名)元胞数组转换为数值数值或字符串数组(具体效果可自行尝试)
MATLAB有些函数返回值为元胞数组,且元胞数组存储数据较方便
hex2dechex2dec(str)将字符串表示的十六进制转换为十进制数(因此字符串中的字符只能为0 ~ 9或a ~ f)
num2strnum2str(num)将数值转换为字符串,即234转为‘234’
sortsort(数组名)使数组元素按值的大小排序(字符串也是数组)
str2doublestr2double(str)与num2str相反,将字符串转换为对应的数值,即‘234’转为234,此时str中的字符只能为十进制数字
strcatstrcat(str1,str2,……)将str1、str2、……等字符串依次连接
strcmpstrcmp(str1,str2)比较str1和str2是否相同,是则返回逻辑1,否则返回逻辑0
strfindstrfind(str1,str2)在str1中查找str2,并返回应该矩阵,矩阵元素为索引值。

字符串连接

       在调试的时候可能需要将字符串连接后打印出来,当然有可能还要打印数字,此时可以通过num2str将数字转化为字符串,再通过[]将其组合,如下所示:

['ads',num2str(2)]

       此时会输出ads2。

数据形式

       数据形式是指数据存储的方式,MATLAB中的数据格式包括数组、元胞数组和结构体。

数组

       MATLAB中的数组常常被当成矩阵,个人认为两者不同,MATLAB中的数组只是多了矩阵的计算方式而已,具体可查看标量、向量、数组和矩阵

       MATLAB中几乎所有数据都默认存储为数组格式,包括数值、逻辑变量、字符和字符串等(单个则为1×1矩阵)。MATLAB中的数组和其它编程语言中的数组类似,不同之处在于MATLAB中的数组可以扩容,并且不止是作为数据的集合,而是拥有类似矩阵的计算方式。

创建

  1. 元素直输法
           通过方括号"[“和”]“创建数组,行元素用空格或逗号隔开,列数组用分号”;"隔开,如下图所示。

在这里插入图片描述

注意,该方法只能创建一维数组和二维数组。

  1. 冒号":"创建
num1:num2     %创建以num1为第一个元素,最后一个元素小于num2,元素间隔为1的一维数组
num1:inc:num2 %创建以num1为第一个元素,最后一个元素小于num2,元素间隔为inc的一维数组

如果num1无法通过增加inc的方式接近num2,那么返回空数组。

注意,该方法只能创建一维数组。

  1. 函数生成特殊数组(部分)
函数名示例说明
onesones(行数,列数)生成相应行列数的数据,并赋初值为1
zeroszeros(行数,列数)生成相应行列数的数据,并赋初值为0
randrand(行数,列数)生成相应行列数的数据,并赋初值为0 ~ 1间的任意数
diagdiag(一维数组名,对角线数)将一维数组元素作为对应数字对角线的元素,构成类对角数组(对角线数为0则为对角数组:对角线外元素为0)
注意:当一维数组名位置为二维数组名时,将二维数组对应数字的对角线元素返回(形式为一维数组)
eyeeye(行数,列数)生成相应行列数的单位数组
(说成单位矩阵可能更容易懂,但编程语言只有数组)
magicmagic(num)生成相应长度(num×num)的魔方数组(魔方阵)
randnrandn(行数,列数)生成相应行列数的数组,数组元素为正态分布值

注意:上述构造数组的函数不止有示例中的用法,一般在括号中可以有多个数字,通过逗号“,”隔开,生成相应维度的数组。

  1. 文件创建

       通过其它文件,比如txt文件或者m文件同样可以创建数组

  • 在123.txt文件中输入以下代码,并通过load 123.txt即可生成元素为1~9、0的数组
1 2 3 4 5 6 7 8 9 0
  • 在data.m文件中定义数组,并在命令行输入文件名data即可根据该文件中的数组创建相同的数组
  1. 合并及拆分
示例(假设Array,Array1,Array2为已存在数组的数组名)说明
Array( : )将数组Array按下标,形成单列的一维矩阵
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&Array2andand(Array1,Array2)
|Array1|Array2oror(Array1,Array2)
~~Array1notnot(Array1)
|xorxor(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为对应属性的值

调用

       通过结构体名.属性名会返回相应属性的值,也可以通过这种方法赋值或扩展结构体。

相关函数

函数名使用说明
structstruct(field1,value1,…,fieldN,valueN)定义结构体变量
fieldnamesfieldnames(结构体名)返回以结构体中的field1、field2、……、fieldN为元胞的元胞数组,即相应的属性名
isstructisstruct(任意名称)返回该名称是否代表一个结构体变量,是则返回逻辑1,否则返回逻辑0
isfieldisfield(结构体名称,字符串)判断该字符串是否为该结构体其中一个属性名
getfieldgetfield(结构体名称,属性名)获取该结构体中相应属性的值,等效于结构体名.属性名,但该函数有更深入的使用,具体可以参考getfield应用
setfieldsetfield(结构体名称,属性名,值)将该结构体中相应属性赋予对应值,等效于结构体名.属性名=值,但该函数有更深入的使用,具体可以参考setfield应用
rmfieldrmfield(结构体名称,属性名)删除该结构体中的相应属性,也可以将多个属性形成元胞数组后一次性删除(属性名变为元胞数组名)

分析

       数据分析:利用适当的统计方法,对相应数据进行分析,以提取有效信息并形成结论。

函数名作用示例说明
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
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值