matlab學習筆記12_3串聯結構體,按屬性建立含有元胞數組的結構體,filenames,isfield,isstruct,orderfields

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

12_3 結構體

串聯結構體,按屬性建立含有元胞數組的結構體,filenames,isfield,isstruct,orderfields

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

參考文獻
https://ww2.mathworks.cn/help/matlab/matlab_prog/concatenate-structures.html
https://ww2.mathworks.cn/help/matlab/ref/struct.html#d117e1320181
https://ww2.mathworks.cn/help/matlab/ref/fieldnames.html
https://ww2.mathworks.cn/help/matlab/ref/isfield.html
https://ww2.mathworks.cn/help/matlab/ref/isstruct.html
https://ww2.mathworks.cn/help/matlab/ref/orderfields.htmlhtml

串聯結構體

  • 要串聯結構體,他們必須具備相同的字段集,但這些字段無需包含相同的大小或數據類型。
  • 建立標量 (1×1) 結構體數組 struct1 和 struct2,而且每一個數組都具備字段 a 和 b
struct1.a = 'first';
struct1.b = [1,2,3];
struct2.a = 'second';
struct2.b = rand(5);
struct1,struct2
struct1 = struct with fields:
    a: 'first'
    b: [1 2 3]

struct2 = struct with fields:
    a: 'second'
    b: [5x5 double]
  • 正如串聯兩個標量值(如 [1,2])會建立一個 1×2 數值數組同樣,串聯 struct1 和 struct2 也會建立一個 1×2 結構體數組
combined = [struct1,struct2]
combined = 1x2 struct array with fields:
    a
    b
  • 當要訪問特定字段的內容時,請指定數組中的結構體的索引。例如,訪問第一個結構體的字段 a。
combined(1).a
ans =
'first'
  • 串聯也適用於非標量結構體數組。例如,建立一個名爲 new 的 2×2 結構體數組。因爲 1×2 結構體 combined 和 2×2 結構體 new 都包含兩列,所以您可使用分號分隔符垂直串聯它們。
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;

larger = [combined; new]
larger = 3x2 struct array with fields:
    a
    b
  • 訪問結構體 larger(2,1) 的字段 a。它與 new(1,1).a 包含相同的值。
larger(2,1).a
ans = 1

按屬性建立含有元胞數組的結構體

  • 能夠直接使用"."的方式向一個結構體添加屬性,例如a.b即向a結構體中添加屬性b
  • 使用構造函數的方式
    • s = struct(field,value)
    • s = struct(field1,value1,...,fieldN,valueN)
建立包含多個字段的非標量結構體。

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 = 1x2 struct array with fields:
    f1
    f2
    f3
    f4

value2 和 value3 的元胞數組是 1×2 數組,所以 s 也是 1×2 數組。由於 value1 是數值數組而不是元胞數組,因此 s(1).f1 和 s(2).f1 具備相同的內容。相似地,由於 value4 的元胞數組具備單一元素,因此 s(1).f4 和 s(2).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'

filenames

  • fields = fieldnames(S) 返回結構體數組S的字段名稱。
建立一個結構體數組。

S(1,1).x = linspace(0,2*pi);
S(1,1).y = sin(S(1,1).x);
S(1,1).title = 'y = sin(x)';
S(2,1).x = linspace(0,2*pi);
S(2,1).y = cos(S(2,1).x);
S(2,1).title = 'y = cos(x)'
S = 2x1 struct array with fields:
    x
    y
    title
  • 使用 fieldnames 函數返回元胞數組中的字段名稱。
fields = fieldnames(S)
fields = 3x1 cell array
    {'x'    }
    {'y'    }
    {'title'}
  • 要返回字段的值,請使用 struct2cell 函數。 struct2cell 和 fieldnames 以相同的順序返回值和字段名稱。
values = struct2cell(S)
values = 3x2 cell array
    {1x100 double}    {1x100 double}
    {1x100 double}    {1x100 double}
    {'y = sin(x)'}    {'y = cos(x)'}

isfield

  • 肯定輸入是否爲結構體數組字段
  • TF = isfield(S,field)
  • 若是 field 是結構體數組 S 的一個字段的名稱,則 TF = isfield(S,field) 返回 1。不然,將返回 0
  • 若是 field 是包含多個名稱的數組,則 TF 是大小相同的邏輯數組。

isstruct

  • 肯定輸入是否爲結構體數組
  • tf = isstruct(A)
  • 若是 A 爲 MATLAB的結構體,則 tf = isstruct(A) 返回邏輯值1(true);不然返回邏輯值0(false)。

orderfields

  • 結構體數組的順序字段git

    語法

  • S = orderfields(S1)
    • S = orderfields(S1) 按名稱對 S1 中的字段排序。
      因爲字段名稱只能包含字母、數字和下劃線,此語法按 ASCII 順序對字段名稱進行排序。全部大寫字母排在全部小寫字母以前。
      ```
      建立一個包含多個字段的結構體。

S1 = struct('b',1,'B',2,'a',3,'A',4)
S1 = struct with fields:
b: 1
B: 2
a: 3
A: 4github

對字段排序。此語法基於 ASCII 順序按字段名稱對字段排序。數組

S = orderfields(S1)
S = struct with fields:
A: 4
B: 2
a: 3
b: 1函數

* S = orderfields(S1,S2)
  * S = orderfields(S1,S2) 返回 S1 的副本,其字段已從新排序以匹配 S2 的字段順序。輸入結構體數組 S1 和 S2 必須具備相同的字段名稱。

建立兩個結構體,它們具備相同字段,只是字段順序不一樣。字段名稱相同,但字段值不一樣。學習

S1 = struct('b',1,'B',2,'a',3,'A',4)
S1 = struct with fields:
b: 1
B: 2
a: 3
A: 4spa

S2 = struct('a',0,'b',20,'B',10,'A',0)
S2 = struct with fields:
a: 0
b: 20
B: 10
A: 0code

對 S1 中的字段進行排序以匹配 S2 中的字段順序。htm

S = orderfields(S1,S2)
S = struct with fields:
a: 3
b: 1
B: 2
A: 4排序

* S = orderfields(S1,C)
  * S = orderfields(S1,C) 按輸入數組 C 匹配名稱順序。S1 中每一個字段的名稱必須在 C 中出現一次。

建立一個結構體。

data.x = linspace(0,2*pi);
data.y = sin(data.x);
data.title = 'y = sin(x)'
data = struct with fields:
x: [1x100 double]
y: [1x100 double]
title: 'y = sin(x)'

經過以元胞數組形式列出字段名稱來對字段排序。

C = {'title','x','y'};
data = orderfields(data,C)
data = struct with fields:
title: 'y = sin(x)'
x: [1x100 double]
y: [1x100 double]

* S = orderfields(S1,P)
  * S = orderfields(S1,P) 按置換向量 P 匹配順序。
  若是 S1 有 n 個字段,則 P 的元素是從 1 到 n 的整數,按任意順序排列。例如,若是 S1 有三個字段,P 是 [3 1 2],則 S1 的第三個字段是輸出 S 的第一個字段。當須要以相同的方式對多個結構體數組進行排序時,此語法很是有用。

建立一個結構體。

data.x = linspace(0,2*pi);
data.y = sin(data.x);
data.title = 'y = sin(x)'
data = struct with fields:
x: [1x100 double]
y: [1x100 double]
title: 'y = sin(x)'

經過以另外一順序列出字段的原始位置來對字段排序。例如,移動第三個字段,使其成爲輸出結構體的第一個字段。

P = [3 1 2];
data = orderfields(data,P)
data = struct with fields:
title: 'y = sin(x)'
x: [1x100 double]
y: [1x100 double]

```

相關文章
相關標籤/搜索