セル配列、構造体、構​造体配列の各要素に対​して、for文を用い​ずに同じ関数を一括し​て適用する方法はあり​ますか?

18 ビュー (過去 30 日間)
MathWorks Support Team
MathWorks Support Team 2013 年 10 月 25 日
編集済み: MathWorks Support Team 2024 年 5 月 30 日
セル配列、構造体、構造体配列の各要素に対して、for文を用いずに同じ関数を一括して適用する方法はありますか?

採用された回答

MathWorks Support Team
MathWorks Support Team 2024 年 5 月 8 日
編集済み: MathWorks Support Team 2024 年 5 月 30 日
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 件)

カテゴリ

Help Center および File Exchangeデータ型 についてさらに検索

製品


リリース

R2006a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!