在matlab中创建类似字典的数据结构方式

目录
  • matlab中创建类似字典的数据结构
  • matlab基本数据结构说明
    • 1、基本数据结构总览(仅含常用类型)
    • 2、数值类型基本操作
    • 3、字符和字符串
    • 4、结构体
    • 5 元胞数组
  • 总结

matlab中创建类似字典的数据结构

Matlab中创建struct:

d = struct('a','1','b','2')

在Matlab中通过字符串形式的fieldname来查找value(Using Dynamic FielNames):

d.('a')
d.('b')

在Matlab中修改已经存在的field的value:

d.('b')='9'

在Matlab中添加新的field:

d.('c')='3'

在Matlab中删除stuct的field:

d=struct('b', '9','c', '3', 'a', '1')
d=rmfield(b,'9')

在Matlab中删除struct所有field:

d=struct()

matlab基本数据结构说明

Matlab作为早期的科研软件之一,对数据的处理有强大的功能。最近需要做信号处理相关的部分,将之前对Matlab不熟悉的数据操作熟悉一下。

最后准备附上Numpy中对两者之间基本操作的比较。

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

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'}

注:创建多个字段的结构体时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'

注:

  • 将元胞添加到元胞数组内,如果当前的索引不存在,会自动对当前的数组扩容,不存在的用空元胞来代替
  • 通过追加索引,并使用与内容的数据类型匹配的语法,来访问元胞的部分内容。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python中3种内建数据结构:列表、元组和字典

    Python中有3种内建的数据结构:列表.元组和字典.参考简明Python教程 1. 列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个 序列 的项目.假想你有一个购物列表,上面记载着你要买的东西,你就容易理解列表了.只不过在你的购物表上,可能每样东西都独自占有一行,而在Python中,你在每个项目之间用逗号分割. 列表中的项目应该包括在方括号中,这样Python就知道你是在指明一个列表.一旦你创建了一个列表,你可以添加.删除或是搜索列表中的项目.由于你可以增加或删除项目,

  • 详解python读取matlab数据(.mat文件)

    我们都知道,matlab是一个非常好用的矩阵计算分析软件,然额,matlab自带的绘图效果极为锯齿,所以,这里分享一个在python中读取matlab处理后的数据.mat文件. 1.首先,我们这里先打开matlab,随便在命令行窗输入两个变量, matlab_x=1:0.01:10; matlab_y=sin(matlab_x); 2.计算处理后,matlab右边的工作区会有两个变量值,分别为matlab_y.matlab_x 3.然后,我们将鼠标放置在工作区空白位置右键,选择保存,也可以在工作

  • 在 Python 中创建DataFrame的方法

    目录 方法一:创建空的DataFrame ​方法二:使用List创建DataFrame​ ​方法三:使用字典创建DataFrame​ ​方法四:使用数组创建带索引DataFrame​ 方法五:从字典列表创建DataFrame ​方法六:使用zip()函数创建DataFrame​ ​方法七:从序列的字典创建DataFrame​ 前言: DataFrame是数据的二维集合. 它是一种数据结构,其中数据以表格形式存储. 数据集按行和列排列: 我们可以在DataFrame中存储多个数据集. 我们可以执行

  • python pickle存储、读取大数据量列表、字典数据的方法

    先给大家介绍下python pickle存储.读取大数据量列表.字典的数据 针对于数据量比较大的列表.字典,可以采用将其加工为数据包来调用,减小文件大小 #列表 #存储 list1 = [123,'xiaopingguo',54,[90,78]] list_file = open('list1.pickle','wb') pickle.dump(list1,list_file) list_file.close() #读取 list_file = open('list1.pickle','rb')

  • 在matlab中创建类似字典的数据结构方式

    目录 matlab中创建类似字典的数据结构 matlab基本数据结构说明 1.基本数据结构总览(仅含常用类型) 2.数值类型基本操作 3.字符和字符串 4.结构体 5 元胞数组 总结 matlab中创建类似字典的数据结构 Matlab中创建struct: d = struct('a','1','b','2') 在Matlab中通过字符串形式的fieldname来查找value(Using Dynamic FielNames): d.('a') d.('b') 在Matlab中修改已经存在的fie

  • Android中创建类似Instagram的渐变背景效果

    我在我最近的项目用到这个效果,给大家分享下 https://github.com/zhaoweihaoChina/hnuplus 1. 在drawable文件夹创建一些渐变颜色的资源 color1.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <

  • 对Python中创建进程的两种方式以及进程池详解

    在Python中创建进程有两种方式,第一种是: from multiprocessing import Process import time def test(): while True: print('---test---') time.sleep(1) if __name__ == '__main__': p=Process(target=test) p.start() while True: print('---main---') time.sleep(1) 上面这段代码是在window

  • Numpy中创建数组的9种方式小结

    目录 1.使用empty方法创建数组 2.使用array创建数组 3.使用zeros/ones创建数组 4.使用arange创建数组 5.使用linspace创建数组 6.使用numpy.random.rand创建数组 7.使用numpy.random.randn创建数组 8.使用numpy.random.randint创建数组 9.使用fromfunction创建数组 1.使用empty方法创建数组 该方式可以创建一个空数组,dtype可以指定随机数的类型,否则随机采用一种类型生成随机数. i

  • JS中创建函数的三种方式及区别

    1.函数声明 function sum1(n1,n2){ return n1+n2; }; 2.函数表达式,又叫函数字面量 var sum2=function(n1,n2){ return n1+n2; }; 两者的区别:解析器会先读取函数声明,并使其在执行任何代码之前可以访问:而函数表达式则必须等到解析器执行到它所在的代码行才会真正被解释执行. 自执行函数严格来说也叫函数表达式,它主要用于创建一个新的作用域,在此作用域内声明的变量,不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,

  • Python中列表、字典、元组、集合数据结构整理

    本文详细归纳整理了Python中列表.字典.元组.集合数据结构.分享给大家供大家参考.具体分析如下: 列表: 复制代码 代码如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] 字典: 复制代码 代码如下: di = {'a':123,'b':'something'} 集合: 复制代码 代码如下: jihe = {'apple','pear','apple'} 元组: 复制代码 代码如下: t = 123,456,'hello' 1.列表 空

  • Python中创建字典的几种方法总结(推荐)

    1.传统的文字表达式: >>> d={'name':'Allen','age':21,'gender':'male'} >>> d {'age': 21, 'name': 'Allen', 'gender': 'male'} 如果你可以事先拼出整个字典,这种方式是很方便的. 2.动态分配键值: >>> d={} >>> d['name']='Allen' >>> d['age']=21 >>> d[

  • Python中元组,列表,字典的区别

    Python中,有3种内建的数据结构:列表.元组和字典. 1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目.列表中的项目应该包括在方括号中,这样python就知道你是在指明一个列表.一旦你创建了一个列表,你就可以添加,删除,或者是搜索列表中的项目.由于你可以增加或删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的,并且列表是可以嵌套的. 实例: #coding=utf-8 animalslist=['fox','tiger','ra

  • JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】

    本文实例讲述了JS中创建自定义类型的常用模式.分享给大家供大家参考,具体如下: 虽然在 ES6 中,已经出了 class 的语法,貌似好像不用了解 ES5 中的这些老东西了,但是越深入学习,你会发现理解这些模式的重要性. 在本文中,我会描述 7 种常用的创建自定义类型的模式:工厂模式.构造函数模式.原型模式.组合使用构造函数模式.动态原型模式.寄生构造函数模式.稳妥构造函数模式.分别给出他们的示例代码,并分析他们的利弊,方便读者选择具体的方式来构建自己的自定义类型. 最后,我会指出 ES6 中的

随机推荐