MATLAB(2)数据

目录

  • 数据
    • 数值
    • 逻辑
    • 字符和字符串
      • 创建
      • 调用
      • 相关函数
  • 数据形式
    • 数组
      • 创建
      • 访问
      • 运算
        • 算数运算
        • 关系运算
        • 逻辑运算
        • 特殊运算(矩阵运算)
        • 运算符优先级
    • 元胞数组
      • 创建
      • 元胞调用
      • 元胞内容调用
      • 相关函数
    • 结构体
      • 定义
      • 调用
      • 相关函数
  • 分析
  • 注意

数据

       MATLAB中只存在变量,不存在不可修改的常量,变量的定义不像C语言一样需要类型,当MATLAB遇到一个新的变量名时,会自动为其分配合适的存储空间。
       如下图所示,定义变量时需要同时为其赋值,否则MATLAB无法正确识别,如果是已存在的变量,输入其名称后在命令行窗口会自动输出该变量的值。若输入数据(如数值、矩阵、通过单引号" ’ "括起来的字符串)则会默认赋给特殊变量ans。

变量名区分大小写,并且最多包含63个字符,必须以字母开头,不允许标点符号。

MATLAB(2)数据_第1张图片

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(2)数据_第2张图片

       接下来介绍MATLAB中各种变量类型,也就是数据类型。

数值

       MATLAB中的数值采用十进制,可以带小数点和正负号。可以通过科学计数法表示数值,也可以通过i或j表示虚数,如下面的程序所示。

%普通数据
a=2203
b=-336
c=0.09

%科学计数法
d=3.14e3
e=9e-9

%虚数
f=2i+6
g=-6j

       运行后如下图所示。(在语句结尾添加了分号";"防止大量输出)

MATLAB(2)数据_第3张图片

一般情况下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中的数组可以扩容,并且不止是作为数据的集合,而是拥有类似矩阵的计算方式。

创建

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

MATLAB(2)数据_第4张图片

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

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

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

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

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

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

  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(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函数用于取整。

MATLAB(2)数据_第5张图片

逻辑运算

运算符 运算符示例 等效运算函数 运算函数示例 作用
& 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(2)数据_第6张图片

相关函数

       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

你可能感兴趣的:(matlab,开发语言)