matlab結構體的創建與元素訪問
覺得有用的話,歡迎一起討論相互學習~
參考文獻
https://ww2.mathworks.cn/help/matlab/structures.html?searchHighlight=結構體&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.html
概念
- 對於一個結構體而言,(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: []
訪問結構體中的元素
- 結構體也分為標量結構體和結構體數組,結構體數組可以通過結構體數組的索引進行訪問,而標量結構體可以通過結構體名稱進行訪問。
訪問標量結構體
- 要訪問字段的一部分內容,請添加適合字段中數據的大小和類型的索引
- 如果特定的字段包含 元胞數組 ,使用 花括號{} 訪問數據
訪問非標量結構體數組的屬性
- 通過將文件 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*3的結構體s,其中包含字段f:
s(1).f = 1;
s(2).f = 'two';
s(3).f = 3 * ones(3);
- 盡管數組中的 每個結構體必須具有相同的字段數和相同的字段名稱,但字段的類型和大小可以不同 引用多個元素的同一字段
s(1:3).f
或者s.f
- matlab 以逗號分隔列表的形式返回元素中的數據
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};
- 如果所有字段均包含相同類型的數據並且可以構成超矩形,則可以串聯列表項。例如,創建一個包含字段 f(具有數值標量)的結構體 nums,然后串聯字段中的數據:
nums(1).f = 1;
nums(2).f = 2;
nums(3).f = 3;
allNums = [nums.f]
該代碼返回
allNums =
1 2 3
- 如果要使用相同運算處理數組的每個元素,請使用 arrayfun 函數。例如,統計數組 s 中每個結構體的字段 f 的元素數。
numElements = arrayfun(@(x) numel(x.f), s)
語法 @(x) 可以創建匿名函數。此代碼對數組 s 的每個元素調用 numel 函數,例如 numel(s(1).f),並返回
numElements =
1 3 9