cell配列に対し関数を適応したい

35 ビュー (過去 30 日間)
yuta
yuta 2022 年 3 月 27 日
コメント済み: yuta 2022 年 4 月 3 日
4 × 10 のcell配列があり、それぞれ4999×1 doubleが格納されています。
それら1つ1つの 4999×1 double に対し、
trapz(0.001,c);
の関数を当てはめ、台形積分値を求めたいのですが、上手くいきません。
何か方法があればご教示いただければと思います。
よろしくお願いします。

採用された回答

Hernia Baby
Hernia Baby 2022 年 3 月 27 日
cellfunはいかがでしょうか?
  4 件のコメント
Hernia Baby
Hernia Baby 2022 年 3 月 29 日
編集済み: Hernia Baby 2022 年 3 月 29 日
コメントし忘れていました。すみません…
せっかくなので無名関数を使って返したいと思います。
-------------------------
まずは準備から
load xmin_base.mat
xmin_base
xmin_base = 4×10 cell array
{4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double} {4999×1 double}
ここで無名関数を使います。
@(変数) [関数or式] で書くことができます。
A = cellfun(@(x) 0.001*trapz(x),xmin_base)
A = 4×10
0.1856 0.5671 0.3200 0.4267 0.6559 0.4134 0.2607 0.1873 0.1695 0.1444 1.0199 1.0275 1.7450 1.9073 2.0044 1.0605 1.2187 1.0819 1.7845 1.1829 0.5189 0.4310 0.4065 0.5101 0.4511 0.5113 0.3943 0.4507 0.4331 0.4514 1.2537 1.3170 2.9950 10.2523 17.3155 1.3769 1.0153 0.9009 1.0603 1.1104
ーーーーーーーーーーーーーーーーーー
■おまけ
無名関数の何がうれしいか説明します
今回の結果はすべてのcell要素がスカラー値だったためうまくいきました。
では各要素の結果がベクトルのような配列ではどうでしょうか?
各cell要素の計算結果がスカラー値ではない場合はcell型で返す必要があります
その場合はoptionである 'UniformOutput' を false にします
B = cellfun(@(x) reshape([0;x],[],2) ,xmin_base,'UniformOutput',false)
B = 4×10 cell array
{2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double} {2500×2 double}
もうこの時点で恩恵受けてるんですが、cell型で返す場合スカラーの掛け算はできません
たとえば以下のようなコードを書くと
A2 = 0.001*cellfun(@trapz ,xmin_base,'UniformOutput',false)
'cell' タイプのオペランドに対して、演算子 '*' はサポートされていません。
のようなエラーがでます
無名関数であればそれらも処理が可能です
A2 = cellfun(@(x) 0.001*trapz(x),B,'UniformOutput',false)
A2 = 4×10 cell array
{[0.1104 0.0753]} {[0.2332 0.3338]} {[0.1936 0.1265]} {[0.1356 0.2909]} {[ 0.3542 0.3015]} {[0.2809 0.1326]} {[0.0881 0.1725]} {[0.0792 0.1079]} {[0.0630 0.1063]} {[0.0821 0.0623]} {[0.5473 0.4722]} {[0.5425 0.4852]} {[0.8243 0.9205]} {[0.9656 0.9418]} {[ 1.1120 0.8920]} {[0.5288 0.5315]} {[0.5974 0.6212]} {[0.5662 0.5155]} {[0.9278 0.8566]} {[0.6076 0.5749]} {[0.2455 0.2735]} {[0.2162 0.2148]} {[0.2625 0.1440]} {[0.2623 0.2478]} {[ 0.2684 0.1827]} {[0.2186 0.2928]} {[0.2129 0.1814]} {[0.1864 0.2642]} {[0.1950 0.2380]} {[0.2424 0.2090]} {[0.6672 0.5862]} {[0.6448 0.6721]} {[1.5585 1.4359]} {[4.9033 5.3469]} {[11.1503 6.1664]} {[0.7111 0.6653]} {[0.5251 0.4897]} {[0.4669 0.4338]} {[0.5563 0.5038]} {[0.6204 0.4899]}
yuta
yuta 2022 年 4 月 3 日
ご回答いただきありがとうございます。解決致しました!!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchange数値積分と微分 についてさらに検索

製品


リリース

R2021b

Community Treasure Hunt

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

Start Hunting!