matlab學習筆記12_2建立結構體數組,訪問標量結構體,訪問非標量結構體數組的屬性,訪問嵌套結構體中的數據,訪問非標量結構體數組中多個元素的字段

一塊兒來學matlab-matlab學習筆記12

12_2 結構體

建立結構體數組,訪問標量結構體,訪問非標量結構體數組的屬性,訪問嵌套結構體中的數據,訪問非標量結構體數組中多個元素的字段

以爲有用的話,歡迎一塊兒討論相互學習~Follow Me

參考文獻
https://ww2.mathworks.cn/help/matlab/structures.html?searchHighlight=%E7%BB%93%E6%9E%84%E4%BD%93&s_tid=doc_srchtitle
https://ww2.mathworks.cn/help/matlab/matlab_prog/create-a-structure-array.html
https://ww2.mathworks.cn/help/matlab/matlab_prog/access-data-in-a-structure-array.html
https://ww2.mathworks.cn/help/matlab/matlab_prog/access-data-in-nested-structures.html
https://ww2.mathworks.cn/help/matlab/matlab_prog/access-multiple-elements-of-a-nonscalar-struct-array.htmlhtml

概念

  • 對於一個結構體而言,(1),(2),(3)...稱爲同一個結構體的不一樣元素,.1,.2,.3...稱爲一個結構體的屬性
  • 帶有能夠包含各類類型和大小的數據的命名字段的數組
  • 結構體數組是使用名爲字段的數據容器將相關數據組合在一塊兒的數據類型。每一個字段均可以包含任意類型的數據。使用 structName.fieldName 格式的圓點表示法來訪問結構體中的數據。

函數

建立結構體數組

  • 下面的示例說明了如何建立結構體數組。結構體是使用被稱爲字段的數據容器將相關數據組合在一塊兒的一種數據類型。每一個字段均可以包含任意類型或任意大小的數據。將患者記錄存儲在含有字段 name、billing 和 test 的標量結構體中
    在這裏插入圖片描述
  • 數組中的每條患者記錄都是 struct 類的結構體。由結構體構成的數組一般稱爲結構體數組。與其餘 MATLAB 數組相似,結構體數組能夠具備任意維度。
  • 結構體數組具備下列屬性:
    • 數組中的全部結構體都具備相同數目的字段。
    • 全部結構體都具備相同的字段名稱。
    • 不一樣結構體中的同名字段可包含不一樣類型或大小的數據。
    • 數組中新結構體的任何未指定字段均包含空數組。
    patient(3).name = 'New Name';
    patient(3)
    ans = struct with fields:
         name: 'New Name'
      billing: []
         test: []

    訪問結構體中的元素

  • 結構體也分爲標量結構體和結構體數組,結構體數組能夠經過結構體數組的索引進行訪問,而標量結構體能夠經過結構體名稱進行訪問。git

    訪問標量結構體

  • 要訪問字段的一部份內容,請添加適合字段中數據的大小和類型的索引
  • 若是特定的字段包含 元胞數組 ,使用 花括號{} 訪問數據
    在這裏插入圖片描述github

    訪問非標量結構體數組的屬性

  • 經過將文件 mandrill.mat 中的數據加載到數組 S 的 第二個元素 中來建立一個 非標量數組
S(2) = load('mandrill.mat')
  • 一個結構體數組的每一個元素都必須具備相同的字段。 clown.mat 和 mandrill.mat 都包含變量 X、map 和 caption。

S 是一個 1×2 的數組。數組

S =

  1×2 struct array with fields:

    X
    map
    caption

對於非標量結構體,訪問特定字段的語法爲 structName(indices).fieldName。 從新顯示 clown 圖像,並指定 clown 結構體的索引 (1):函數

image(S(1).X)
colormap(S(1).map)
添加索引以選擇並從新顯示字段內容的左上角:

upperLeft = S(1).X(1:50,1:80);
image(upperLeft)

注意

僅當引用結構體數組的 單個元素 時,才能爲字段的部份內容創建索引。 MATLAB® 不支持諸如 S(1:2).X(1:50,1:80) 的語句,後者嘗試爲結構體的多個元素的字段創建索引。學習

訪問嵌套結構體中的數據

  • 此示例演示瞭如何爲嵌套於另外一個結構體中的結構體創建索引。訪問特定字段中的數據的通常語法爲
    `structName(index).nestedStructName(index).fieldName(indices)``
  • 當結構體爲 標量 (1×1) 時,無需包括索引以引用單個元素。例如,建立一個標量結構體 s,其中字段 n 是一個嵌套的標量結構體,其中包含字段 a、b 和 c:
s.n.a = ones(3);
s.n.b = eye(4);
s.n.c = magic(5);
  • 訪問字段 b 的第三行:
third_row_b = s.n.b(3,:)
變量 third_row_b 包含 eye(4) 的第三行。

third_row_b =
     0     0     1     0
  • 擴展 s,以便 s 和 n 都爲非標量 (1×2):
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 如今包含下圖中所示的數據。

在這裏插入圖片描述

  • 訪問 n(位於 s 的第一個元素中)的第二個元素的字段 b 中的數組部份內容:
part_two_eye = s(1).n(2).b(1:2,1:2)
這將返回 2*eye(4) 的左上角 2×2 的部分:

part_two_eye =
     2     0
     0     2

訪問非標量結構體數組的元素

  • 訪問和處理一個非標量結構體數組的多個元素中的數據
  1. 建立一個1*3的結構體s,其中包含字段f:
s(1).f = 1;
s(2).f = 'two';
s(3).f = 3 * ones(3);
  • 儘管數組中的 每一個結構體必須具備相同的字段數和相同的字段名稱,但字段的類型和大小能夠不一樣 引用多個元素的同一字段 s(1:3).f 或者 s.f
  • matlab 以逗號分隔列表的形式返回元素中的數據scala

    ans =
     1
    
     ans =
     two
    
     ans =
     3     3     3
     3     3     3
     3     3     3
    • 不能使用v=s.f語法將該列表分配給單個變量,由於各個字段包含的數據類型可能不一樣,可是能夠 將列表項分配給相同數量的變量 或者 分配給元胞數組
    [v1, v2, v3] = s.f;
    c = {s.f};
  1. 若是全部字段均包含相同類型的數據而且能夠構成超矩形,則能夠串聯列表項。例如,建立一個包含字段 f(具備數值標量)的結構體 nums,而後串聯字段中的數據:
nums(1).f = 1;
nums(2).f = 2;
nums(3).f = 3;

allNums = [nums.f]
該代碼返回

allNums =
     1     2     3
  1. 若是要使用相同運算處理數組的每一個元素,請使用 arrayfun 函數。例如,統計數組 s 中每一個結構體的字段 f 的元素數。
numElements = arrayfun(@(x) numel(x.f), s)
語法 @(x) 能夠建立匿名函數。此代碼對數組 s 的每一個元素調用 numel 函數,例如 numel(s(1).f),並返回

numElements =
     1     3     9
相關文章
相關標籤/搜索