matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct

时间:2023-01-26 23:10:59

一起来学matlab-matlab学习笔记12

12_4 结构体

rmfield,arrayfun,structfun,struct2cell,cell2struct

觉得有用的话,欢迎一起讨论相互学习~Follow Me

参考文献

https://ww2.mathworks.cn/help/matlab/ref/rmfield.html

https://ww2.mathworks.cn/help/matlab/ref/arrayfun.html

https://ww2.mathworks.cn/help/matlab/ref/structfun.html

https://ww2.mathworks.cn/help/matlab/ref/struct2cell.html

https://ww2.mathworks.cn/help/matlab/ref/cell2struct.html

refield

  • 删除结构体中的字段
  • s = rmfield(s,field)
  • s = rmfield(s,field) 从结构体数组 s 中删除指定的一个或多个字段。使用字符向量元胞数组或字符串数组指定多个字段。s 的维度保持不变。
定义一个包含 first、second、third 和 fourth 字段的标量结构体。

S.first = 1;
S.second = 2;
S.third = 3;
S.fourth = 4;
删除字段 first 和 fourth。 fields = {'first','fourth'};
S = rmfield(S,fields)
S = struct with fields:
second: 2
third: 3

arrayfun

  • 将函数应用于每个数组元素,区别在于structfun 的输入参数必须是标量结构体。

语法

  • B = arrayfun(func,A)
    • B = arrayfun(func,A) 将函数 func 应用于 A 的元素,一次一个元素。然后 arrayfun 将 func 的输出串联成输出数组 B,因此,对于 A 的第 i 个元素来说,B(i) = func(A(i))。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和 B 必须具有相同的大小。

      您不能指定 arrayfun 计算 B 的各元素的顺序,也不能指望它们按任何特定的顺序完成计算。
创建一个非标量结构体数组。每个结构体有一个包含随机数向量的字段。这些向量具有不同的大小。

S(1).f1 = rand(1,5);
S(2).f1 = rand(1,10);
S(3).f1 = rand(1,15)
S = 1x3 struct array with fields:
f1 使用 arrayfun 函数计算 S 中每个字段的均值。不能使用 structfun 完成此计算,因为 structfun 的输入参数必须是标量结构体。 A = arrayfun(@(x) mean(x.f1),S)
A = 1×3 0.6786 0.6216 0.6069
  • B = arrayfun(func,A1,...,An)
    • B = arrayfun(func,A1,...,An) 将 func 应用于数组 A1,...,An 的元素,因此 B(i) = func(A1(i),...,An(i))。函数 func 必须接受 n 个输入参数并返回一个标量。数组 A1,...,An 的大小必须全部相同。
创建一个结构体数组,其中每个结构体有两个包含数值数组的字段。

S(1).X = 5:5:100; S(1).Y = rand(1,20);
S(2).X = 10:10:100; S(2).Y = rand(1,10);
S(3).X = 20:20:100; S(3).Y = rand(1,5)
S = 1x3 struct array with fields:
X
Y 绘制数值数组。从 plot 函数返回一个图形线条对象的数组,并使用这些对象为每一组数据点添加不同的标记。arrayfun 可以返回任何数据类型的数组,只要该数据类型的对象可以串联即可。 figure
hold on
p = arrayfun(@(a) plot(a.X,a.Y),S);
p(1).Marker = 'o';
p(2).Marker = '+';
p(3).Marker = 's';
hold off

matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct

  • B = arrayfun( ___ ,Name,Value)
    • B = arrayfun( ___ ,Name,Value) 应用 func 并使用一个或多个 Name,Value 对组参数指定其他选项。例如, 要以元胞数组形式返回输出值,请指定 'UniformOutput',false。 当 func 返回的值不能串联成数组时,可以按元胞数组的形式返回 B。可以将 Name,Value 对组参数与上述任何语法中的输入参数结合使用。
    创建一个非标量结构体数组。每个结构体有一个包含数值矩阵的字段。
    
    

S(1).f1 = rand(3,5);

S(2).f1 = rand(6,10);

S(3).f1 = rand(4,2)

S = 1x3 struct array with fields:

f1

使用 arrayfun 函数计算 S 中每个字段的均值。mean 返回包含每列均值的向量,因此不能以数组的形式返回均值。要以元胞数组的形式返回均值,请指定 'UniformOutput',false 名称-值对组。

A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false)

A = 1x3 cell array

{1x5 double} {1x10 double} {1x2 double}


* [B1,...,Bm] = arrayfun( ___ )
* 当 func 返回 m 个输出值时,[B1,...,Bm] = arrayfun( ___ ) 返回多个输出数组 B1,...,Bm。func 可以返回不同数据类型的输出参数,但每一次调用 func 时返回的每个输出的数据类型必须相同。可以将此语法与前面语法中的任何输入参数结合使用。
* 从 func 返回的输出参数的数量可以不同于 A1,...,An 指定的输入参数的数量。

创建一个非标量结构体数组。

S(1).f1 = 1:10;

S(2).f1 = [2; 4; 6];

S(3).f1 = []

S = 1x3 struct array with fields:

f1

使用 arrayfun 函数计算 S 中每个字段的大小。行数和列数分别输出在两个 1×3 数值数组中。

[nrows,ncols] = arrayfun(@(x) size(x.f1),S)

nrows = 1×3

 1     3     0

ncols = 1×3

10     1     0

--- # <font color=Red>structfun</font>
* 对标量结构体的每个字段应用函数--**和arrayfun不同,arrayfun对所有元素应用函数,structfun对所有字段应用函数** * A = structfun(func,S)
* A = structfun(func,S) 将函数 func 应用于标量结构体 S 的每个字段,每次一个字段。然后 structfun 将 func 的输出串联成列向量 A。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。A 中的元素数等于 S 中的字段数。

创建一个标量结构体,其字段中包含不同大小的数值数组。

S.f1 = 1:10;

S.f2 = [2; 4; 6];

S.f3 = []

S = struct with fields:

f1: [1 2 3 4 5 6 7 8 9 10]

f2: [3x1 double]

f3: []

计算每个数值数组的均值,然后以数组的形式返回这些均值。

A = structfun(@mean,S)

A = 3×1

5.5000

4.0000

NaN

* A = structfun(func,S,Name,Value)
* A = structfun(func,S,Name,Value) 应用 func 并使用一个或多个 Name,Value 对组参数指定其他选项。例如,要以结构体形式返回输出值,**请指定 'UniformOutput',false。** 当 func 返回的值不能合并为数组时,可以按结构体形式返回 A。返回的结构体具有与 S 相同的字段。

创建一个标量结构体,其字段中包含矩阵。

S.f1 = 1:10;

S.f2 = [2 3; 4 5; 6 7];

S.f3 = rand(4,4)

S = struct with fields:

f1: [1 2 3 4 5 6 7 8 9 10]

f2: [3x2 double]

f3: [4x4 double]

计算每个矩阵的均值。mean 返回包含每列均值的向量,因此不能以数组的形式返回均值。要以结构体形式返回均值,请指定 'UniformOutput',false 名称-值对组。

A = structfun(@mean,S,'UniformOutput',false)

A = struct with fields:

f1: 5.5000

f2: [4 5]

f3: [0.6902 0.3888 0.7627 0.5962]


* [A1,...,Am] = structfun( ___ )
* 当 func 返回 m 个输出值时,[A1,...,Am] = structfun(_ __ ) 返回多个输出数组 A1,...,Am。func 可以返回不同数据类型的输出参数,但每次调用 func 时返回的每个输出的数据类型必须相同。可以将此语法与前面语法中的任何输入参数结合使用。

创建一个标量结构体。

S.f1 = 1:10;

S.f2 = [2 3; 4 5; 6 7];

S.f3 = rand(4,4)

S = struct with fields:

f1: [1 2 3 4 5 6 7 8 9 10]

f2: [3x2 double]

f3: [4x4 double]

计算 S 中每个数组的大小。行数和列数都是一个 3×1 数值数组。

[nrows,ncols] = structfun(@size,S)

nrows = 3×1

 1
3
4

ncols = 3×1

10
2
4

--- # <font color=Red>struct2cell</font>
* 将结构体转换为元胞数组
* C = struct2cell(S)
* C = struct2cell(S) 将结构体转换为元胞数组。元胞数组 C 包含从 S 的字段复制的值。
* struct2cell 函数不返回字段名称。要返回元胞数组中的字段名称,请使用 fieldnames 函数。 ```matlab
创建一个结构体。 S.x = linspace(0,2*pi);
S.y = sin(S.x);
S.title = 'y = sin(x)'
S = struct with fields:
x: [1x100 double]
y: [1x100 double]
title: 'y = sin(x)' 将 S 转换为元胞数组。 C = struct2cell(S)
C = 3x1 cell array
{1x100 double}
{1x100 double}
{'y = sin(x)'} 元胞数组不包含字段名称。要返回元胞数组中的字段名称,请使用 fieldnames 函数。fieldnames 和 struct2cell 以相同的顺序返回字段名称和值。 fields = fieldnames(S)
fields = 3x1 cell array
{'x' }
{'y' }
{'title'}

cell2struct

  • 将元胞数组转换为结构体数组
  • structArray = cell2struct(cellArray, fields, dim)
  • structArray = cell2struct(cellArray, fields, dim) 通过元胞数组 cellArray 中包含的信息创建一个结构体数组 structArray。
  • fields 参数指定结构体数组的字段名称。此参数是一个字符数组、字符向量元胞数组或字符串数组。
  • dim 参数向 MATLAB® 指示创建结构体数组时要使用的元胞数组的轴。使用数值 double 指定 dim。
  • 要使用从元胞数组的 N 行中获取的字段创建一个结构体数组,请在 fields 参数中指定 N 个字段名称,在 dim 参数中指定数字 1。要使用从元胞数组的 M 列中获取的字段创建一个结构体数组,请在 fields 参数中指定 M 个字段名称,在 dim 参数中指定数字 2。
  • structArray 输出是具有 N 个字段的结构体数组,其中 N 等于 fields 输入参数中的字段数。生成的结构体中的字段数必须等于沿要转换的维度 dim 的元胞数。

示例

  • 创建下表以用于此部分中的示例。表中列出了有关一个小型工程公司的员工的信息。按行读取该表将显示按部门列出的员工姓名。按列读取该表将显示每个员工已在该公司工作的年数。

    matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct
输入以下命令以创建初始元胞数组 employees:

devel = {{'Lee','Reed','Hill'}, {'Dean','Frye'}, ...
{'Lane','Fox','King'}};
sales = {{'Howe','Burns'}, {'Kirby','Ford'}, {'Hall'}};
mgmt = {{'Price'}, {'Clark','Shea'}, {'Sims'}};
qual = {{'Bates','Gray'}, {'Nash'}, {'Kay','Chase'}};
docu = {{'Lloyd','Young'}, {'Ryan','Hart','Roy'}, {'Marsh'}}; employees = [devel; sales; mgmt; qual; docu]
employees = {1x3 cell} {1x2 cell} {1x3 cell}
{1x2 cell} {1x2 cell} {1x1 cell}
{1x1 cell} {1x2 cell} {1x1 cell}
{1x2 cell} {1x1 cell} {1x2 cell}
{1x2 cell} {1x3 cell} {1x1 cell}

matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct

将元胞数组转换为沿维度1的结构体

  1. 转换沿其第一个维度的 5×3 元胞数组以构造一个具有 5 个字段的 3×1 结构体。沿元胞数组的维度 1 的每一行将变为结构体数组中的一个字段:

    遍历第一个维度(即垂直维度),包含 5 行,每行的标题如下:

rowHeadings = {'development', 'sales', 'management', 'quality', 'documentation'};

matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct

2. 将元胞数组转换为与此维度相关的结构体数组 depts:

depts = cell2struct(employees, rowHeadings, 1)
depts =
3x1 struct array with fields:
development
sales
management
quality
documentation
  1. 使用此面向行的结构体查找已在公司工作超过 10 年的开发员工的姓名:
depts(1:2).development
ans =
'Lee' 'Reed' 'Hill'
ans =
'Dean' 'Frye'

将相同的元胞数组转换为沿维度 2 的结构体

  1. 转换沿其第二个维度的 5×3 元胞数组以构造一个具有 3 个字段的 5×1 结构体。沿元胞数组的维度 2 的每一列将变为结构体数组中的一个字段:

    matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct
  2. 沿第二个维度(或水平维度)遍历元胞数组。列标题将变为生成的结构体的字段:
colHeadings = {'fiveYears' 'tenYears' 'fifteenYears'};

years = cell2struct(employees, colHeadings, 2)
years =
5x1 struct array with fields:
fiveYears
tenYears
fifteenYears
  1. 使用列向结构体时,将显示已在公司工作至少 5 年的销售和文件部门的员工数。
[~, sales_5years, ~, ~, docu_5years] = years.fiveYears
sales_5years =
'Howe' 'Burns'
docu_5years =
'Lloyd' 'Young'

仅将元胞数组的一部分转换为结构体:

  1. 仅转换元胞数组的第一行和最后一行。这将生成一个具有 2 个字段的 3×1 结构体数组:
rowHeadings = {'development', 'documentation'};

depts = cell2struct(employees([1,5],:), rowHeadings, 1)
depts =
3x1 struct array with fields:
development
documentation

matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct

2. 显示对于所有三个时间段属于这些部门的员工:

for k=1:3
depts(k,:)
end ans =
development: {'Lee' 'Reed' 'Hill'}
documentation: {'Lloyd' 'Young'}
ans =
development: {'Dean' 'Frye'}
documentation: {'Ryan' 'Hart' 'Roy'}
ans =
development: {'Lane' 'Fox' 'King'}
documentation: {'Marsh'}

matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct的更多相关文章

  1. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  2. matlab学习笔记 bsxfun函数

    matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...

  3. matlab学习笔记&lpar;一)单元数组

    matlab学习笔记(一)单元数组 1.floor(x) :取最小的整数 floor(3.18)=3,floor(3.98)=3 ceil(x)  :取最大的整数 ceil(3.18)=4,ceil( ...

  4. matlab学习笔记---(1)

    Matlab学习笔记 一. Desktop Basics (Matlab 基础知识) 当你打开Matlab的时候,matlab按照以下默认的方式展示出来. 该桌面主要包括以下几部分内容: 当前文件夹: ...

  5. 【数学建模】MATLAB学习笔记——函数式文件

    MATLAB学习笔记——函数式文件 引入函数式文件 说明: 函数式文件主要用于解决计算中的参数传递和函数调用的问题. 函数式的标志是它的第一行为function语句. 函数式文件可以有返回值,也可以没 ...

  6. matlab学习笔记12&lowbar;3串联结构体,按属性创建含有元胞数组的结构体&comma;filenames&comma;isfield&comma;isstruct&comma;orderfields

    一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...

  7. matlab学习笔记13&lowbar;3创建函数句柄

    一起来学matlab-matlab学习笔记13函数 13_3 创建函数句柄 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help ...

  8. matlab学习笔记13&lowbar;2匿名函数

    一起来学matlab-matlab学习笔记13函数 13_2 匿名函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help/m ...

  9. matlab学习笔记12单元数组和元胞数组 cell&comma;celldisp&comma;iscell&comma;isa&comma;deal&comma;cellfun&comma;num2cell&comma;size

    一起来学matlab-matlab学习笔记12 12_1 单元数组和元胞数组 cell array --cell,celldisp,iscell,isa,deal,cellfun,num2cell,s ...

随机推荐

  1. CSS实现的手风琴特效

    CSS样式: //图像个数 @imageN:5; //图像hover之前的总宽度 @w:800px; //图像hover之后的宽度 @imageL:640px; //图像hover之前的宽度 @ima ...

  2. C&plus;&plus;语言-08-命名空间

    概述 命名空间通常作为附加信息来区分不同库中相同名称的函数.类.变量.命名空间的本质是定义一个范围,该范围即为一个上下文,一个上下文中通常不允许出现相同名称的函数.类.变量. 定义 定义格式 普通的命 ...

  3. php使用位与运算符【&amp&semi;】或【&vert;】实现权限管理

    权限值是这样的2^0=1,相应2进数为”0001″(在这里^我表示成”次方”,即:2的0次方,下同)2^1=2,相应2进数为”0010″2^2=4,相应2进数为”0100″2^3=8,相应2进数为”1 ...

  4. NOIP1998 拼数

    http://www.luogu.org/problem/show?pid=1012 题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,3 ...

  5. 函数fsp&lowbar;try&lowbar;extend&lowbar;data&lowbar;file

    扩展表空间 /***********************************************************************//** Tries to extend t ...

  6. fmri降噪,利用spatial&plus;temporal信息

    1.基于小波+高斯模型 <SPATIOTEMPORAL DENOISING AND CLUSTERING OF FMRI DATA>

  7. javascript读取xml的方法【转载】

    jquery读取xml文件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  8. Leetcode&lowbar;101&lowbar;Symmetric Tree

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42087039 Given a binary tree, c ...

  9. 一&period;Django 学习 —— 环境搭建

    Ⅰ.前言 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C. 我们先搭建一个Django项目运行的环境. 需要准备的有: 1- Py ...

  10. Java集合List、Set、Map

    集合是 java 基础中非常重要的一部分,同样也是 Java 面试中很重要的一个知识点.所以,给王小整理了这篇关于集合的文章. 1.接口继承关系以及实现 集合类存放于 Java.util 包中,主要有 ...