セル配列、構造体、構造体配列の各要素に対して、for文を用いずに同じ関数を一括して適用する方法はありますか?
20 views (last 30 days)
Show older comments
MathWorks Support Team
on 25 Oct 2013
Edited: MathWorks Support Team
on 30 May 2024
セル配列、構造体、構造体配列の各要素に対して、for文を用いずに同じ関数を一括して適用する方法はありますか?
Accepted Answer
MathWorks Support Team
on 8 May 2024
Edited: MathWorks Support Team
on 30 May 2024
MATLAB 7.1(R14SP3)以降のバージョンでは、機能拡張された関数cellfun や、新規に追加された関数structfun、関数arrayfun を用いることで、データの各要素に任意の関数を一括して適用することができます。
各関数の概要と実行例を下記に示します。
● cellfun :セル配列の各要素に対して関数を適用
● structfun:構造体の各フィールドに対して関数を適用
● arrayfun :構造体配列を含む配列の各要素に対して関数を適用
(複数の入出力を持つ関数に対しても適用可能)
■セル配列の各要素に対して関数lengthを実行する場合の例
>> cellArray = {'abcde', 3; [5 6], 'mnopqr'};
>> b = cellfun(@length, cellArray)
b =
5 1
2 6
■構造体の各フィールドに関数std を適用する場合の例
>> sensorData.sensor1 = [12 34 23 28 43];
>> sensorData.sensor2 = [14 38 44 38 56];
>> result = structfun(@std, sensorData)
result =
11.6404
15.2971
■構造体配列のDataフィールドに5より大きな値を含むかどうかを調べる例
>> sArray(1).Data = [12 5 10];
>> sArray(2).Data = [];
>> sArray(3).Data = [4];
>> sArray(4).Data = [12];
>> output = arrayfun(@(y) ~isempty(find(y.Data > 5)), sArray)
output =
1 0 0 1
なお、関数cellfun は、MATLAB 7.1 (R14SP3)より前のバージョンにおいては、下記の関数をセル配列の各要素に適用する関数として提供されています。
'isreal' -- 実数セル要素に対して、真
'isempty' -- 空セル要素に対して、真
'islogical' -- 論理セル要素に対して、真
'length' -- セル要素の長さ
'ndims' -- セル要素の次元数
'prodofsize' -- セル要素の中の要素数
下記 URL にも本件に関する情報が記載されています。
●MATLAB Digest - March 2006:New Functions for Vectorizing Operations on Any Data Type
0 Comments
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!