精华内容
下载资源
问答
  • Matlab-结构体数组的索引

    万次阅读 2017-01-03 12:53:48
    %% 结构体数组的索引 (Structure Array)% 注意:结构体的创建 与 矩阵/元胞数组 不同,元胞数组以元胞的方式进行储存,而结构体...%% 1.n * 1 的结构体数组 imname = dir(['C:\Users\ncf\Desktop\' '*.doc']) imname

    版本:matlab2014a(如果运行有错误,可以对应版本的help进行修正。这里是我当时总结的笔记,供大家参考,具体查阅相应版本的help)

    %% 结构体数组的索引 (Structure Array)
    % 注意:结构体的创建 与 矩阵/元胞数组 不同,元胞数组以元胞的方式进行储存,而结构体是以 fields 储存的(而不是以对象个数储存的)
    % 所以元胞数组创建时,提供元胞的大小,而结构体的创建
    %% 1.n * 1 的结构体数组
    imname = dir(['C:\Users\ncf\Desktop\' '*.doc'])
    imname.name % 返回所有的 name ,name 相当于一个结构体的变量,一个属性(注意这个和 cell 的联系)
    imname(:).name %返回所有的 name
    imname(1).name % 返回第一个对象的 name 
    imname(1) % 返回第一个对象的所有属性2
    %% 2.使用 [] 连接结构体数组
    % To concatenate structures, they must have the same set of fields, 
    % but the fields do not need to contain the same sizes or types of data.
    % 前提结构体必须要有相同 set of fields 属性集,但是对于某一个属性不需要包含相同大小和类型的数据
    struct1.a = 'first';
    struct1.b = [1,2,3];
    struct2.a = 'second';
    struct2.b = rand(5);
    combined = [struct1, struct2] % combined 为 1*2 的 struct
    %% 3.create a 2-by-2 struct array 创建一个 2*2 的结构体数组
    new(1,1).a = 1;
    new(1,1).b = 10;
    new(1,2).a = 2;
    new(1,2).b = 20;
    new(2,1).a = 3;
    new(2,1).b = 30;
    new(2,2).a = 4;
    new(2,2).b = 40;
    % 理解 a b 相当于结构体的属性,每一个对象都有 a b 属性
    % 而对象的索引就是 new(2,2) :第四个对象,第二行第二列的对象,这种可以理解成将矩阵一样,实际不是以二维储存的,而是 new(3)
    % 将二维转成列 
    larger = [combined; new] % 因为 combined new 都含有 a b 属性则可以合并
    % [] 可以连接矩阵也可以连接结构体
    % [ ; ] 竖直连接 相当于函数 vertcat
    % [   ] 水平连接 相当于函数 horzcat 
    
    % % % % n * n 结构体的初始化和创建 (与矩阵,元胞数组的初始化不同)
    newStruct(1:25,1:50) = struct('a',ones(20),'b',zeros(30),'c',rand(40)); % 指定初始化值
    % or 
    newStruct(1:25,1:50).a = ones(20); % 指定初始化值
    newStruct(1:25,1:50).b = zeros(30);
    newStruct(1:25,1:50).c = rand(40);
    % or
    newStruct(1:25,1:50).a = []; % 不指定初始化值
    newStruct(1:25,1:50).b = [];
    newStruct(1:25,1:50).c = [];
    % or
    newStruct(1:25,1:50) = struct('a',[],'b',[],'c',[]); % 不指定初始化值
    
    %% 4.结构体的储存方式
    % A structure is a data type that groups related data using data containers called fields. 
    % Each field can contain data of any type or size.
    % 结构体使用 fields 这样的数据容器将 结构体与数据联系在一起,每一个 field 可以包含不同大小数据类型的数据
    %% 5.结构体数组(由每一个结构体组成(即对象),每一个结构体(对象)有相同的属性集(名字和数量相同) fields,不同结构体里的相同属性值,数据类型/大小可以不同)
    % /1.All structs in the array have the same number of fields
    % /2.All structs have the same field names
    % /3.Fields of the same name in different structs can contain different types or sizes of data.
    patient(1).name = 'John Doe';
    patient(1).billing = 127.00;
    patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];
    patient(3).name = 'New Name';
    patient(3)
    % 对于 patient(3) 对象的 billing test 未指定时为空
    %% 6.Comma-Separated Lists 
    % 1.Comma-Separated List
    % Typing in a series of numbers separated by commas gives you what is called a comma-separated list
    1,2,3 % 用,分开
    
    % 2.Generating a Comma-Separated List:
    
    % 2/1.Generating a List from a Cell Array (由元胞数组产生)
    C = cell(4,6);
    for k = 1:24
        C{k} = k*2;
    end
    C
    C{:,5} % extracting the fifth column generates the following comma-separated lis
    % C{1,5},C{2,5},C{3,5},C{4,5} 上面的那个相当于这个
    
    % 2/2.Generating a List from a Structure (由结构数组生成)
    S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
    S.f5
    % S(1).f5,S(2).f5,S(3).f5,S(4).f5 上面的与这个相同
    
    % 2/3.Assigning Output from a Comma-Separated List (指定输出)
    C = cell(4,6);
    for k = 1:24
        C{k} = k*2;
    end
    [c1,c2,c3,c4,c5,c6] = C{1,1:6};
    c5
    % 2/3/1.对于指定少的输出时,舍弃其他的,对于结构体也一样
    % You also can use the deal function for this purpose 也可以使用函数 deal
    [c1,c2,c3] = C{1,1:6}
    
    S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
    [sf1,sf2,sf3] = S.f5;
    sf3
    
    % 3.使用 Comma-Separated Lists 
    % 3/1.Constructing Arrays (重建数组)
    % When you specify a list of elements with C{:, 5}, 
    % MATLAB inserts the four individual elements
    A = {'Hello',C{:,5},magic(4)}
    % 3/2.Displaying Arrays (显示数组0)
    % Use a list to display all or part of a structure or cell array
    A{:}
    % 3/3.Concatenation (合并)
    % 提取出数据再合并
    A = [C{:,5:6}]
    % 3/4.Function Call Arguments (作为函数的输入)
    X = -pi:pi/10:pi;
    Y = tan(sin(X)) - sin(tan(X));
    C = cell(2,3);
    C{1,1} = 'LineWidth';
    C{2,1} = 2;
    C{1,2} = 'MarkerEdgeColor';
    C{2,2} = 'k';
    C{1,3} = 'MarkerFaceColor';
    C{2,3} = 'g';
    figure
    plot(X,Y,'--rs',C{:})
    % 3/5.Function Return Values (函数返回值) 
    % These values are returned in a list with each value separated by a comma
    % Instead of listing each return value, you can use a comma-separated list with a structure or cell array
    % 函数的返回值在返回时,是有逗号隔开的,可以用 a comma-separated list with a structure or cell
    % array 代替列出每一个返回值
    C = cell(1,3);
    [C{:}] = fileparts('work/mytests/strArrays.mat')
    %% 7.Access Elements of a Nonscalar Struct Array (从结构数组中获取元素,与之前的内容有交集)
    % 1.access data from multiple elements of a nonscalar structure array (获取数据)
    s(1).f = 1;
    s(2).f = 'two';
    s(3).f = 3 * ones(3);
    s(1:3).f
    % or
    s.f 
    % MATLAB? returns the data from the elements in a comma-separated list,
    % 你不能指定这个 list 到 一个变量中  syntax v = s.f (错,这个默认获取第一个数据,舍弃后两个)
    % 可以采取以下两种方式:
    [v1, v2, v3] = s.f % 指定 list 到等个数的变量中
    c = {s.f}; % 指定 list 到元胞数组中
    % 2.process data from multiple elements of a nonscalar structure array (处理数据)
    % 如果你想对数组中的每一个元素(具体到每一个结构体的某一属性的元素)施以相同处理,使用 arrayfun 函数
    numElements = arrayfun(@(x) numel(x.f), s)
    % 数出每一个结构体中的 f 属性元素数目,相当于下面的表达式(这样可以扩展函数的使用范围,使输入的可以是很多类型的数据)
    [numel(s(1).f) numel(s(2).f) numel(s(2).f)]
    %% 8.Ways to Organize Data in Structure Arrays (组织数据的方法)
    % 1.Plane Organization 
    img.red = RED;
    img.green = GREEN;
    img.blue = BLUE;
    adjustedRed = .9 * img.red; % 对某一属性的面操作
    % 2.Element-by-Element Organization 
    patient(1).name = 'John Doe';
    patient(1).billing = 127.00;
    patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205]; % 对某一对象操作
    %% 9.Memory Requirements for a Structure Array (结构体的内存分配)
    % Structure arrays do not require completely contiguous memory. 
    % However, each field requires contiguous memory, 
    % as does the header that MATLAB? creates to describe the array.
    % For very large arrays, incrementally increasing the number of fields or the number of elements in a field results in Out of Memory errors.
    % However, in this case, MATLAB only allocates memory for the header, and not for the contents of the array.
    % matlab 只为 field(the header) 分配内存,而不是为数组中的内容
    % Structure arrays 不需要连续的内存,但是每一个 field 需要连续的内存
    %% 10.Access Data in Nested Structures (嵌套结构体)
    % syntax :
    % structName(index).nestedStructName(index).fieldName(indices)
    % structName(index) 是最大的类 ,nestedStructName(index)
    % 是较小的类(生成对象),fieldName(indices) 这个索引的是具体结构体的属性的内容
    s.n.a = ones(3);
    s.n.b = eye(4);
    s.n.c = magic(5);
    s(1).n(2).a = 2*ones(3);
    s(1).n(2).b = 2*eye(4);
    s(1).n(2).c = 2*magic(5);
    
    s(2).n(1).a = '1a';
    s(2).n(2).a = '2a';
    s(2).n(1).b = '1b';
    s(2).n(2).b = '2b';
    s(2).n(1).c = '1c';
    s(2).n(2).c = '2c';
    %  s(2).n(2).c :s 的第二个类下的 n 类的 第二个对象的 c 属性
    % Access part of the array in field b of the second element in n within the first element of s:
    part_two_eye = s(1).n(2).b(1:2,1:2)

     

    展开全文
  • 该示例比较元胞和结构体数组,并说明如何在每种类型数组中存储数据。使用元胞和结构体数组都可以存储不同类型和大小数据。 1.结构体数组 结构体数组中数据包含在可按名称访问字段中。 例如,将患者记录存储...

    目录

    元胞数组与结构体数组

    结构体数组

    元胞数组

    其他容器数组


    元胞数组与结构体数组

    该示例比较元胞和结构体数组,并说明如何在每种类型的数组中存储数据。使用元胞和结构体数组都可以存储不同类型和大小的数据。

    结构体数组

    结构体数组中数据包含在可按名称访问的字段中。

    例如,将运动员记录存储在一个结构体数组中。

    sportsman(1).name = 'John Doe';
    sportsman(1).times = 1.10;
    sportsman(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];
    
    sportsman(2).name = 'Ann Lane';
    sportsman(2).times = 2.10;
    sportsman(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169];
    
    sportsman
    
    
    sportsman=2×3 struct
        name
        times
        test

    为每位运动者的测试结果创建一个条形图。

    numsportsmans = numel(sportsman);
    for p = 1:numsportsmans
       figure
       bar(sportsman(p).test)
       title(sportsman(p).name)
       xlabel('Test')
       ylabel('Result')
    end

                                              

                                             

    元胞数组

    元胞数组中数据包含在可按数值索引访问的元胞中。元胞数组的常见应用包括存储单独的文本段,以及存储电子表格中的异类数据。

    例如,在一个元胞数组中存储一段时间中三个城市的温度数据。

    temperature(1,:) = {'2009-12-31', [45, 49, 0]};
    temperature(2,:) = {'2010-04-03', [54, 68, 21]};
    temperature(3,:) = {'2010-06-20', [72, 85, 53]};
    temperature(4,:) = {'2010-09-15', [63, 81, 56]};
    temperature(5,:) = {'2010-12-09', [38, 54, 18]};
    
    temperature
    
    
    
    temperature=5×2 cell
        {'2009-12-31'}    {1x3 double}
        {'2010-04-03'}    {1x3 double}
        {'2010-06-20'}    {1x3 double}
        {'2010-09-15'}    {1x3 double}
        {'2010-12-09'}    {1x3 double}

    按日期绘制每个城市的温度。

    allTemps = cell2mat(temperature(:,2));
    dates = datetime(temperature(:,1));
    
    plot(dates,allTemps)
    title('Temperature Trends for Different Locations')
    xlabel('Date')
    ylabel('Degrees (Fahrenheit)')

                                               

    其他容器数组

    结构体和元胞数组是存储异类数据的最常用容器。可以方便地使用表来存储异构的列向数据或表格数据。或者,使用映射容器或创建自己的类。

     

    展开全文
  • 结构体数组中数据组织方法 至少有两种方法可用来组织结构体数组数据:平面组织和按元素组织。最适合您数据方法取决于您计划访问数据方式,而对于...当创建结构体数组时,MATLAB®将有关每个元素和字段...

    目录

     

    结构体数组中数据的组织方法

    平面组织

    按元素组织


    结构体数组中数据的组织方法

    至少有两种方法可用来组织结构体数组中的数据:平面组织和按元素组织。最适合数据的方法取决于计划访问数据的方式,而对于大型数据集,取决于是否存在系统内存约束。

    使用平面组织更易于访问字段中的所有值。使用按元素组织更易于访问与单个元素或记录相关的所有信息。以下部分包括每种组织类型的示例:

    • 平面组织

    • 按元素组织

    当创建结构体数组时,MATLAB® 将有关每个元素和字段的信息存储于数组标头中。因此,具有多个元素和字段的结构体比包含相同数据的简单结构体需要更多的内存。

    平面组织

    以具有与颜色强度值对应的三个数组的 RGB 图像为例。如图所示:

                                        

    如果工作区中存在数组 REDGREEN 和 BLUE,则以下命令将创建一个使用平面组织、名为 img 的标量结构体:

    img.red = RED;
    img.green = GREEN;
    img.blue = BLUE;

    使用平面组织更易于提取整个图像平面以进行显示、筛选或其他处理。例如,将红色强度值乘以 0.9

    adjustedRed = .9 * img.red;

    如果有多幅图像,可以将它们添加到 img 结构体,一个元素 img(1),...,img(n) 包含一幅图像。对于将元素添加到结构体的示例,请看以下部分。

    按元素组织

    以包含运动员信息的一个数据库为例。每条记录包含一位运动员的姓名、测试结果和时间的数据。

                                                       

    以下语句在名为sportman的结构体数组中创建一个元素:

    sportman(1).name = 'John Doe';
    sportman(1).times = 127.00;
    sportman(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];

    附加运动员对应于结构体中的新元素。例如,为第二位运动员添加一个元素:

    sportman(2).name = 'Ann Lane';
    sportman(2).times = 28.50;
    sportman(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169];

    按元素组织支持简单索引以访问特定患者的数据。例如,计算第一位运动员的测试结果的平均值,按行(维度 2)而不是按列计算。

    aveResultsDoe = mean(sportman(1).test,2)

    该代码返回

    aveResultsDoe =
       75.6667
      178.5000
      212.0000

     

    展开全文
  • Matlab结构体数组预分配内存

    千次阅读 2018-10-17 14:06:38
    在编写一个循环来给结构体数组中的某个结构体单元赋值时,matlab会提示“变量‘xxx’似乎会随着迭代次数而改变,请预分配内存以提高算法...然后,确定在算法中自己所需的结构体数组的维度,如:30*40; 最后,调用...

    在编写一个循环来给结构体数组中的某个结构体单元赋值时,matlab会提示“变量‘xxx’似乎会随着迭代次数而改变,请预分配内存以提高算法效率”。下面介绍一种预分配内存的方式:

    首先,应该先定义好结构体数组中的单个结构体的数据结构,如:person=struct('name',[],'age',0,'sex',[]);

    然后,确定在算法中自己所需的结构体数组的维度,如:30*40;

    最后,调用repmat()函数,persons=repmat(person,[30 40]);

    这样一个预分配好30*40的结构体数组就初始化完毕并分配好了内存。

    展开全文
  • matlab结构体数组定义方法

    万次阅读 2019-03-21 14:47:58
    当需要定义参数变量较多时,往往需要用到结构体,Matlab结构体数组与python中字典概念差不多,使用方法也类似,下面详细介绍其定义方法。 方法一: 直接定义,如定义 // An highlighted block students.name = '...
  • MATLAB 定义结构体数组: for uu=1:50  sssss=svmtrain(Training,Group,Name,Value);%一个结构体变量,可以是动态的,也可以是定值这里是SVMStruct型的结构体变量 ddd(uu).str= sssss ; % 创立并存到...
  • 以下内容来自于:...1.结构数组的创建MATLAB提供了两种定义结构方式:直接法和使用struct函数法。1. 使用直接引用方式定义结构与建立数值型数组一样,建立新st...
  • 下面示例说明了如何创建结构体数组。结构体是使用被称为字段数据容器将相关数据组合在一起一种数据类型。每个字段都可以包含任意类型或任意大小数据。将记录存储在含有字段name、billing和test标量结构体...
  • MATLAB结构体数组
  • 1、多维数组第三维称为...这样就得到A三维数组为2*2*3double2、结构体数组(我学这个目的是为了将不同维度二维数组存放在一块,将不同二维数组赋值给新数组,方便循环遍历)结构体数组定义--赋值方式或者用...
  • 目录 访问结构体数组数据 1.访问标量结构体中数据 2.通过对结构体数组进行索引来访问数据 访问结构体数组数据 该示例演示了如何访问结构体数组的...
  • 要在MALTAB中实现比较复杂编程,就不能不用struct类型。而且在MATLAB中实现struct比C...4. 3.1 结构数组的创建MATLAB提供了两种定义结构方式:直接法和使用struct函数法。1. 使用直接引用方式定义结构与建立数...
  • matlab的编程中,用到了结构体数组保存结果。数组中每个结构体保存了一组测试参数的值及其对应的误差及标准差。程序运行完后想要根据这些结果画分析图,但是plot函数需要输入向量,所以需要将结构体中的误差及标准...
  • 每到开始吃螃蟹的季节,Matlab的一年一度的b版本的更新就开始了。这次的更新还是有不少内容是值得关注一下的。首先先说说Matlab自身的一些更新内容,后面会逐步介绍Simulink以及各个常用工具箱的更新内容。E...
  • 使用repmat是目前为止预分配结构体的最有效方法:N = 10000;b = repmat(struct('x',1), N, 1 );这是使用Matlab 2011a比预分配通过索引,〜10倍更快N = 10000;b(N).x = 1索引方法仅略微快于不预分配。No ...
  • % achieves the same as deal(newVals{:})唯一其他方式我知道如何做(没有foor循环)是使用arrayfun来迭代数组每个结构:% make a struct arrayarr = [ struct('val',0,'id',1), struct('val',0,'id',2),...
  • 最近使用MATLAB代码生成,结构体数组的问题困扰许久,先将支持代码生成的结构体数组创建方法总结如下,主要参考MATLAB帮助文档。 0. MATLAB中的结构体 结构体是使用被称为字段的数据容器将相关数据组合在一起的一种...
  • 当遇到结构体数组,而且需要对该结构体下相同字段做一些批量操作时,一般方法是进行for循环,但是这样看起来不太优雅。 批量操作结构体数组中特定字段 下面介绍一种快捷实用方法: 例如,现在有结构体 ...
  • 1、多维数组第三维称为...这样就得到A三维数组为2*2*3double2、结构体数组(我学这个目的是为了将不同维度二维数组存放在一块,将不同二维数组赋值给新数组,方便循环遍历)结构体数组定义--赋值方式或者用...
  • 1、多维数组 第三维称为页,需要注意是每一页存放二维数组维度要一致,也就是行列数要一致。。。 a=[1,2;...2、结构体数组 (我学这个目的是为了将不同维度二维数组存放在一块,将不同...
  • Matlab新建struct结构体数组

    万次阅读 2017-08-13 21:05:06
    struct在matlab中是用来建立结构体数组的。通常有两种用法:s = struct('field1',{},'field2',{},...) 这是建立一个空的结构体,field1,field2是域名称;s = struct('field1',values1,'field2',values2,...) 这是在...
  • 结构体数组 全页展开 说明 结构体数组是使用名为字段数据容器将相关数据组合在一起数据类型。每个字段都可以包含任意类型数据。可以使用structName.fieldName格式圆点表示法来访问字段中数据。 创建...
  • Matlab 结构体数组

    千次阅读 2015-01-05 18:57:32
    两种定义结构体的方式:直接引用和使用struct函数 直接引用 1. 建立struct对象不需要事先声明,直接使用就行 x.real = 0; % 创建字段(field)名为real,并为该字段赋值为0 x.imag = 0 % 为x创建一个新字段imag...
  • 文章目录matlab结构体数组和单元数组类型创建matlab结构体类型数组类型单元数组类型 matlab结构体类型 通过字段赋值创建结构体 创建格式: 结构体名称.字段名称 样例: >> student.name='Alan'; >&...
  • 怎么定义一个结构体数组,使数组每个元素是一个结构体变量。像这样:a=(1,2)a(1)=struct('name',0,'num',0)a(1)=struct('name',0,'num',0) 匿名|浏览 10361 次 发布于2013-04-01 17:34 ...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 349
精华内容 139
关键字:

matlab的结构体数组

matlab 订阅