MathWorks社のMATLAB - MATLAB研究では、12ノート一緒に学びます
12_4構造
rmfield、arrayfun、structfun、struct2cell、cell2struct
一緒に相互学習を議論することを歓迎し、便利な検索- フォローミー
参考
https://ww2.mathworks.cn/help/matlab/ref/rmfield.html
https://ww2.mathworks.cn/help/matlab/ref/arrayfun.html
https://ww2.mathworks.cn/ヘルプ/ MATLAB / REF / structfun.html
https://ww2.mathworks.cn/help/matlab/ref/struct2cell.html
https://ww2.mathworks.cn/help/matlab/ref/cell2struct.html
refield
- フィールドの構造を削除します。
- S = rmfield(S、フィールド)
- S = Sで構造アレイから指定された1つまたは複数のフィールドを削除するrmfield(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構造でなければならないことを除いて、各アレイ素子に印加されます。
文法
- B = arrayfun(FUNC、A)
- B = arrayfun(FUNC、A)は関数func要素、時間要素に1つに印加されます。次に、出力配列Bに連結された出力FUNCのarrayfunは、AのI番目の要素のために、B(I)= FUNC(ある (I))。FUNC関数ハンドル入力パラメータは、この関数は、入力パラメータを受け取り、スカラーを返す関数です。このタイプのオブジェクトを直列に接続することができるようにFUNC出力データがあれば、任意のタイプであってもよいです。配列AとBは同じサイズでなければなりません。
あなたは、各要素Bについて計算順序arrayfunを指定することはできません、我々は彼らが特定の順序で計算を完了するために期待することはできません。
- B = arrayfun(FUNC、A)は関数func要素、時間要素に1つに印加されます。次に、出力配列Bに連結された出力FUNCのarrayfunは、AのI番目の要素のために、B(I)= FUNC(ある (I))。FUNC関数ハンドル入力パラメータは、この関数は、入力パラメータを受け取り、スカラーを返す関数です。このタイプのオブジェクトを直列に接続することができるようにFUNC出力データがあれば、任意のタイプであってもよいです。配列Aと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、...、アン)は、FUNC A1の配列に適用され...、要素の、B(i)は、FUNC(A1(I)、...、アン(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(___、名前、値)
- B = arrayfun(___、名前、値) FUNCアプリケーションと1つまたは複数の名前、値パラメータは、他のオプションのグループを指定します。例えば、細胞アレイを形成するために、出力値を返すために、偽、「UniformOutput」を指定します。値は、アレイにFUNC系列を返されないと、B細胞アレイの形で返されるとき あなたは名前、上記の構文のいずれかと組み合わせて使用されるパラメータの入力パラメータセットの値であってもよいです。
`` `
非スカラー構造体配列を作成します。各フィールドは、値のマトリックスを含む構造を有しています。
- B = arrayfun(___、名前、値) FUNCアプリケーションと1つまたは複数の名前、値パラメータは、他のオプションのグループを指定します。例えば、細胞アレイを形成するために、出力値を返すために、偽、「UniformOutput」を指定します。値は、アレイにFUNC系列を返されないと、B細胞アレイの形で返されるとき あなたは名前、上記の構文のいずれかと組み合わせて使用されるパラメータの入力パラメータセットの値であってもよいです。
S(1).f1 =ランド(3,5)。
S(2).f1 =ランド(6,10)。
S(3).f1 =ランド(4,2)
フィールドを持つS = 1×3構造体の配列:
F1
Sは、各フィールドの平均arrayfun関数を用いて計算されます。戻り値は、ベクトルは、各列の平均値が含まれているので、平均値の配列を返すことはできませんを意味します。値のペア - 平均の細胞配列の形に戻るには、「UniformOutput」、偽の名前を指定します。
= arrayfun(@(x)の平均値(x.f1)、S、 'UniformOutput'、false)を
A = 1×3セルアレイ
{1×5ダブル} {1×二重} {1×2の二重}
`` `
- [B1、...、Bmの] = arrayfun(___)
- m個の出力値がFUNCに戻ったとき、[B1、...、Bmの] = arrayfun(___)は出力B1の複数の配列を返し、...、Bmを。funcが異なるデータ型の出力パラメータを返すことがあり、各出力のデータ型は、呼び出しが同じでなければなりませんFUNCたびに返されます。これは、使用される上記入力パラメータ文法構文のいずれかと組み合わせることができます。
- FUNCから返される出力パラメータの数は、A1と異なる場合があり...、指定された入力パラメータの量。
创建一个非标量结构体数组。
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)はSの関数funcスカラー構造、各時間フィールドに、各フィールドに適用されます。次に、列ベクトルAに連結された出力FUNCのstructfun FUNC関数ハンドル入力パラメータは、この関数は、入力パラメータを受け取り、スカラーを返す関数です。このタイプのオブジェクトを直列に接続することができるようにFUNC出力データがあれば、任意のタイプであってもよいです。フィールドの数Sに等しい要素の数。
`
フィールドは、異なる大きさの値の配列を含有するスカラー構造を作成します。
- A = structfun(FUNC、S)はSの関数funcスカラー構造、各時間フィールドに、各フィールドに適用されます。次に、列ベクトルAに連結された出力FUNCのstructfun FUNC関数ハンドル入力パラメータは、この関数は、入力パラメータを受け取り、スカラーを返す関数です。このタイプのオブジェクトを直列に接続することができるようにFUNC出力データがあれば、任意のタイプであってもよいです。フィールドの数Sに等しい要素の数。
S.f1 = 1:10;
S.f2 = [2。4; 6]。
S.f3 = []
フィールドを持つS =構造体:
F1:[1 2 3 4 5 6 7 8 9 10]
F2:3×ダブル]
F3:[]
各アレイの平均値を計算し、平均値の配列を返します。
= structfun(@平均、S)
A = 3×1
5.5000
4.0000
のNaN
* 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。6 7]。
S.f3 =ランド(4,4)
S =フィールドを持つ構造体:
F1:[1 2 3 4 5 6 7 8 9 10]
F2:[3×2ダブル]
F3:[4x4の二重】
各行列の平均値を計算します。戻り値は、ベクトルは、各列の平均値が含まれているので、平均値の配列を返すことはできませんを意味します。値のペア - 平均構造フォームに戻るには、「UniformOutput」、偽の名前を指定します。
= structfun(@平均、S、 'UniformOutput'、false)を
A =フィールドを持つ構造体:
F1:5.5000
F2:[4]
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。6 7]。
S.f3 =ランド(4,4)
S =フィールドを持つ構造体:
F1:[1 2 3 4 5 6 7 8 9 10]
F2:[3×2ダブル]
F3:[4x4の二重】
これは、各配列のサイズSを計算します。数字の3×1アレイの行と列の数です。
[NROWS、ncolsの] = structfun(@サイズ、S)
NROWS = 3×1
1
3
4
ncolsの= 3×1
10
2
4
`` `
struct2cell
- 細胞アレイ構造を変換することです
- C = struct2cell(S)
- C = struct2cell(S)は、細胞アレイ構造を変換します。フィールドからコピーされたC Sの値を含む細胞アレイ。
- struct2cell機能は、フィールド名を返しません。携帯配列内のフィールド名に戻るには、フィールド名の関数を使用します。
创建一个结构体。
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(セルアレイ、フィールド、DIM)
- structArray = cell2struct(セルアレイ、フィールド、dim)は含まれている情報を介して構造structArrayセルラーアレイセルアレイのアレイを作成します。
- 構造体の配列パラメータを指定したフィールド名のフィールド。このパラメータは、文字列、文字列またはアレイのベクトル細胞配列です。
- MATLAB®DIMパラメータは、使用される細胞アレイ構造のアレイを作成するために軸を示しています。指定された値の二重薄暗いを使用します。
- 構造体の配列を作成するために、細胞アレイ内のN行からフィールドを取得するために、Nフィールドは、デジタルDIMパラメータで指定されたフィールドで名前パラメータを指定します。Mパラメータフィールド名のフィールドを指定し、構造体の配列を作成し、携帯M列のアレイからの場を得るために、DIM内の番号2のパラメータを指定します。
- structArray出力部材は、Nは、パラメータを入力フィールドのフィールドの数に等しいN個のフィールドを有する構造体の配列です。構造体のフィールドの数は、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の寸法に沿って細胞アレイを変換
- 5つのフィールドを有する構造を構築する最初の次元3×1に沿って細胞コンバータ5×3アレイ。アレイ1の各列に沿った細胞の寸法は、構造体の配列のフィールドになる:
次のように、最初の寸法(すなわち、垂直方向の寸法)を横断する5つの行を備え、各行ヘッダがあります。
rowHeadings = { '開発'、 '販売'、 '管理'、 '品質'、 'ドキュメント'}。
- 構造体のこの配列に関連付けられているディメンションへの細胞の配列はDEPTS:
depts = cell2struct(employees, rowHeadings, 1)
depts =
3x1 struct array with fields:
development
sales
management
quality
documentation
- この行指向の構造では、同社が開発スタッフでの10年以上を持っている作品の名前を見つけるために:
depts(1:2).development
ans =
'Lee' 'Reed' 'Hill'
ans =
'Dean' 'Frye'
ディメンションに沿ってセル構造体2への同じ配列
- 三つのフィールドを有する5×1構造を構築するための第2の次元に沿って細胞コンバータ5×3アレイ。アレイ内のフィールドに構造体の各列2の次元に沿って細胞アレイ。
- 第二次元(または水平次元)に沿って細胞アレイを横断します。列見出しの変更生成されたフィールド構造:
colHeadings = {'fiveYears' 'tenYears' 'fifteenYears'};
years = cell2struct(employees, colHeadings, 2)
years =
5x1 struct array with fields:
fiveYears
tenYears
fifteenYears
- ボディ構造に列を使用する場合には、従業員の数は、少なくとも5年間の営業部門やファイルに働いている示しています。
[~, sales_5years, ~, ~, docu_5years] = years.fiveYears
sales_5years =
'Howe' 'Burns'
docu_5years =
'Lloyd' 'Young'
細胞アレイ構造の一部のみを変換することです。
- 唯一の細胞アレイの最後の行最初の行を変換します。この2つのフィールドを持つ構造体の3×1の配列を生成します。
rowHeadings = {'development', 'documentation'};
depts = cell2struct(employees([1,5],:), rowHeadings, 1)
depts =
3x1 struct array with fields:
development
documentation
- ディスプレイは、すべての3つの期間のためのこれらの部門の従業員に属します。
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'}