Matlab基本数据结构

Matlab基本数据结构

Matlab作为早期的科研软件之一,对数据的处理有强大的功能。最近需要做信号处理相关的部分,将之前对Matlab不熟悉的数据操作熟悉一下。最后准备附上Numpy中对两者之间基本操作的比较。

1、基本数据结构总览(仅含常用类型)

matlab基本数据结构

2、数值类型基本操作
2.1 数据变量的创建

doubleMatlab的默认数据类型,基本上可以满足大部分的计算任务。single和double的创建方式一致

%% 创建数组
x = 10;
Y = double(x);  % 转换为double型数组
y = 10;

%% 查看数据类型
class(Y)
2.2 查看数据类型和值
函数名称函数功能
isinteger确定输入是否为整数数组
isfloat确定输入是否为浮点数组
isnumeric确定输入是否为数值数组
isnan确定那些数组为NaN
class查看数据类型

注:以上函数的返回值均为0(结果为假)或1(结果为真)

3、字符和字符串
3.1 字符串创建
% 创建字符串
str = "Hello, world"
>>> str = 
"Hello, world"

% 创建字符串数组
str = ["Mercury" "Gemini" "Apollo";
       "Skylab" "Skylab B" "ISS"]
       
>>> str = 2x3 string
    "Mercury"    "Gemini"      "Apollo"
    "Skylab"     "Skylab B"    "ISS" 
  
% 传入参数转换为字符串数组
str = string(A)   % 将输入的数组转换为字符串数组
str = string(A, datetFmt)   % 将传入的A转换指定的时间格式,所以传入的A是datetime或者duration

A的输入格式决定了如何将A转换字符串数组

输入类型转换说明示例输入示例输出
char每一行变为字符串的一个标量1×3 char array 'foo'1×1 string array "foo"
cell元胞数组的每一个元素都转换为1 * 1的字符串{137,'foo'}["137" "foo"]
数值数组相当于compose%g格式[137 3.1e-3 8.5e-6]["137" "0.0031" "8.5e-06"]
datetime要指定格式和区域设置datetime(2020,6,1)"01-Jun-2020"
逻辑数组logical 函数不接受字符串输入,因此转换是单向的。logical([0 1])["false" "true"]

注:在matlab中要区分字符和字符串的差异。

示例:

% A表示的是字符向量
A = 'Four score and seven years ago'
c = size(A)   
>>> c = 1×2

     1    30
str = string(A)
s = size(str)
>>> s = 1×2

     1     1
% 通过strlength可求的str中字符串的长度
n = strlength(str)
>>> n = 30


% 转换元胞数组
A = {'Mercury','Gemini','Apollo';...
     'Skylab','Skylab B','ISS'}
>>> A = 2x3 cell
    {'Mercury'}    {'Gemini'  }    {'Apollo'}
    {'Skylab' }    {'Skylab B'}    {'ISS'   }
str = string(A)
>>> str = 2x3 string
    "Mercury"    "Gemini"      "Apollo"
    "Skylab"     "Skylab B"    "ISS" 
    
% 转换表示数字的字符串
str = ["256","3.1416","8.9e-3"]
>>> str = 1x3 string
    "256"    "3.1416"    "8.9e-3"
X = double(str)
>>> X = 1×3

  256.0000    3.1416    0.0089
Y = str2double(str)
>>>Y = 1×3

  256.0000    3.1416    0.0089

注:

1、erase可以删除字符串中的指定符号

2、str2double适用于输入参数可能是字符串数组、字符向量或字符向量元胞数组,本质上说明str2double对字符串的转换有更加广泛的适用

3.2 字符串数组的访问

按照数组访问的方式对字符串进行访问,可通过下标的方式对数组进行切片和访问。

4、结构体

结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型。每个字段都可以包含任意类型的数据。可以使用structName.fieldName 格式的圆点表示法来访问字段中的数据。

形式上和Python的字典的创建方式类似。但是数组的维度取决于对应值的形式,通过字段名的方式对相应的value进行访问。

4.1 创建结构体
%% 创建一个字段的结构体
field = 'f';
value = {'some text';
         [10, 20, 30];
         magic(5)};
s = struct(field,value)

% 查看每个元素在内容
>>> ans = 
'some text'
ans = 1×3

    10    20    30

ans = 5×5

    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

%% 创建多个字段的结构体
field1 = 'f1';  value1 = zeros(1,10);
field2 = 'f2';  value2 = {'a', 'b'};
field3 = 'f3';  value3 = {pi, pi.^2};
field4 = 'f4';  value4 = {'fourth'};

s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
>>> s=1×2 struct array with fields:
    f1
    f2
    f3
    f4
% 输出上述字段的结果
>>> s(1)
ans = struct with fields:
    f1: [0 0 0 0 0 0 0 0 0 0]
    f2: 'a'
    f3: 3.1416
    f4: 'fourth'
>>> s(2)
ans = struct with fields:
    f1: [0 0 0 0 0 0 0 0 0 0]
    f2: 'b'
    f3: 9.8696
    f4: 'fourth'

%% 创建空字段的结构体
s = struct('f1','a','f2',[])
>>> s = struct with fields:
    f1: 'a'
    f2: []
%% 创建包含元胞数组的字段
field = 'mycell';
value = {{'a','b','c'}};
s = struct(field,value)
>>> s = struct with fields:
    mycell: {'a'  'b'  'c'}

%% 结构体字段循环添加数据
%% 创建一个空结构体,定义两个字段名,字段均为空,通过循环添加数据到结构体中,结果如图所示
>>>a.name = [];
>>> a.data = [];
>>> a(1).name = 'hello';
>>> a(1).data = 5;
>>> a(2).name = 'world';
>>> a(2).data = 5;

在这里插入图片描述

注:创建多个字段的结构体时value2value3 的元胞数组是 1×2 数组,因此 s 也是 1×2 数组。因为 value1 是数值数组而不是元胞数组,所以 s(1).f1s(2).f1 具有相同的内容。类似地,因为 value4 的元胞数组具有单一元素,所以 s(1).f4s(2).f4 具有相同的内容。

4.2 结构体中的函数
函数名称函数功能
struct创建按结构体数组
fieldnames结构体的字段名称
getfield获取结构体数组字段
isfield确定输入是否为结构体数组字段
orderfields结构体数组的字段顺序
rmfield删除结构体中的字段
setfield为结构体数组字段赋值
table2struct将表转换为结构体数组
struct2table将结构体数组转换为表
cell2struct将元胞数组转换为结构体数组
struct2cell将结构体转换为元胞数组
5 元胞数组
5.1 创建与访问
创建空字符串
a = cell()
a = {}
5.2 转换和检查数据类型
从元胞转换
函数名称函数功能
cell2mat将元胞数组转换为普通数组
cell2struct将元胞数组转换为结构体

注:

  • 元胞数组中的结构体转换为结构体数组时,结构体必须包含相同的字段(结构体的类型有点像Python中的键值的方式,只是访问的方式不同)
转换为元胞
函数名称函数功能
cellstr将字符向量转变为元胞数组
mat2cell将数组转换包含子数组的元胞数组.原始数组可通过参数dimNDist划分为更小的数组。
num2cell将数组转换为相同大小的元胞数组
struct2cell将结构体转换为元胞数组
table2cell将表转换为元胞数组。元胞数组中不含字段名称。通过fieldnames函数可以得到原始结构体的字段名称
5.3 元胞数组的操作
将元胞添加到元胞数组
C = {1, 2, 3}
>>> C=1×3 cell array
    {[1]}    {[2]}    {[3]}

C{4,4} = 44
>>> C=4×4 cell array
    {[       1]}    {[       2]}    {[       3]}    {0x0 double}
    {0x0 double}    {0x0 double}    {0x0 double}    {0x0 double}
    {0x0 double}    {0x0 double}    {0x0 double}    {0x0 double}
    {0x0 double}    {0x0 double}    {0x0 double}    {[      44]}
对元胞数组的访问
  • 对元胞切片用圆括号()来访问
  • 使用花括号{}对特定的内容进行访问
C = {'one', 'twC=2×3 cell array
    
>>> C=2×3 cell array
    {'one'}    {'two'}    {'three'}
    {[  1]}    {[  2]}    {[    3]}   
通过()切片
upperLeft = C(1:2,1:2)
>>> upperLeft=2×2 cell array
    {'one'}    {'two'}
    {[  1]}    {[  2]}
通过切片修改值
% 修改第1行 1,2,3列的值
C(1,1:3) = {'first','second','third'}
>>> C=2×3 cell array
    {'first'}    {'second'}    {'third'}
    {[    1]}    {[     2]}    {[    3]}
将元胞中的数值数据抓换为数值数组
numericCells = C(2,1:3)
>>> numericCells=1×3 cell array
    {[1]}    {[2]}    {[3]}
    
numericVector = cell2mat(numericCells)
>>> numericVector = 1×3

     1     2     3
通过{}对元胞的特定内容访问 / 或者修改特定内容的值
% 访问元胞的值
last = C{2,3}
>>> last = 3

C{2,3} = 300
>>> C=2×3 cell array
    {'first'}    {'second'}    {'third'}
    {[    1]}    {[     2]}    {[  300]}
访问某一行的值并保存到数值数组中
% 访问数组中某一行的值并转换为数值数组
nums = [C{2,:}]
>>> nums = 1×3

     1     2   300
访问元胞的多级索引
myNum = [1, 2, 3];
myCell = {'one', 'two'};
myStruct.Field1 = ones(3);
myStruct.Field2 = 5*ones(5);

C = {myNum, 100*myNum;
     myCell, myStruct}
     
>>> C=2×2 cell array
    {[ 1 2 3]}    {[100 200 300]}
    {1x2 cell}    {1x1 struct   }
    
% 访问元胞的内容
C{1,2}
>>> ans = 1×3

   100   200   300
  
c{1, 2}(1, 2)
>>> ans = 2

C{2,1}{1,2}
>>> ans = 'two'

注:

  • 将元胞添加到元胞数组内,如果当前的索引不存在,会自动对当前的数组扩容,不存在的用空元胞来代替
  • 通过追加索引,并使用与内容的数据类型匹配的语法,来访问元胞的部分内容。
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab中,字典数据结构可以使用cell数组或struct结构来表示。引用中提到了使用struct函数创建结构的方法,可以通过指定field和value来创建字典。例如,可以使用struct函数创建一个包含姓名、年龄和成绩的学生字典: Student=struct('name',{'Deni','Sherry'},'age',{22,24},'grade',{2,3}) 这将创建一个1x2的struct数组,每个元素都包含name、age和grade字段。可以根据需要自定义字段的名称和值。在这个示例中,字段的名称与相应的值是一致的。引用中还提到了使用cell数组来表示字典数据结构。可以将字符串或数字存储在cell数组中,并使用string函数将其转换为字符串类型。例如,可以使用cell数组创建一个包含多个城市的字典: A = {'Beijing','Shanghai','Guangzhou'} 然后,可以使用string函数将其转换为字符串类型: str = string(A) 这将创建一个包含城市名称的2x1字符串数组。还可以将表示数字的字符串转换为double类型或使用str2double函数将其转换为double类型。例如: str = ["256","3.1416","8.9e-3"] X = double(str) Y = str2double(str) 这将分别创建一个1x3的字符串数组和一个1x3的double数组,其中字符串数组中的值被转换为相应的double类型。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Matlab基本数据结构](https://blog.csdn.net/MTALAB/article/details/128833441)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [matlab中的数据结构](https://blog.csdn.net/qq_17320163/article/details/105474320)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值