matlab學習筆記12_4rmfield,arrayfun,structfun,struct2cell,cell2struct

一塊兒來學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.htmlhtml

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 的輸入參數必須是標量結構體。git

    語法

  • 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

在這裏插入圖片描述

  • 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:
f1github

使用 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

structfun

  • 對標量結構體的每一個字段應用函數--和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: []spa

計算每一個數值數組的均值,而後以數組的形式返回這些均值。3d

A = structfun(@mean,S)
A = 3×1code

5.5000
4.0000
NaNorm

* 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

```


struct2cell

  • 將結構體轉換爲元胞數組
  • C = struct2cell(S)
  • C = struct2cell(S) 將結構體轉換爲元胞數組。元胞數組 C 包含從 S 的字段複製的值。
  • struct2cell 函數不返回字段名稱。要返回元胞數組中的字段名稱,請使用 fieldnames 函數。
建立一個結構體。

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 的元胞數。

示例

  • 建立下表以用於此部分中的示例。表中列出了有關一個小型工程公司的員工的信息。按行讀取該表將顯示按部門列出的員工姓名。按列讀取該表將顯示每一個員工已在該公司工做的年數。
    在這裏插入圖片描述
輸入如下命令以建立初始元胞數組 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}

在這裏插入圖片描述

將元胞數組轉換爲沿維度1的結構體

  1. 轉換沿其第一個維度的 5×3 元胞數組以構造一個具備 5 個字段的 3×1 結構體。沿元胞數組的維度 1 的每一行將變爲結構體數組中的一個字段:
    遍歷第一個維度(即垂直維度),包含 5 行,每行的標題以下:

rowHeadings = {'development', 'sales', 'management', 'quality', 'documentation'};
在這裏插入圖片描述

  1. 將元胞數組轉換爲與此維度相關的結構體數組 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 的每一列將變爲結構體數組中的一個字段:
    在這裏插入圖片描述
  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

在這裏插入圖片描述

  1. 顯示對於全部三個時間段屬於這些部門的員工:
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'}
相關文章
相關標籤/搜索