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

36 views (last 30 days)
yuta
yuta on 27 Mar 2022
Commented: yuta on 3 Apr 2022
4 × 10 のcell配列があり、それぞれ4999×1 doubleが格納されています。
それら1つ1つの 4999×1 double に対し、
trapz(0.001,c);
の関数を当てはめ、台形積分値を求めたいのですが、上手くいきません。
何か方法があればご教示いただければと思います。
よろしくお願いします。

Accepted Answer

Hernia Baby
Hernia Baby on 27 Mar 2022
cellfunはいかがでしょうか?
  4 Comments
Hernia Baby
Hernia Baby on 29 Mar 2022
Edited: Hernia Baby on 29 Mar 2022
コメントし忘れていました。すみません…
せっかくなので無名関数を使って返したいと思います。
-------------------------
まずは準備から
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 on 3 Apr 2022
ご回答いただきありがとうございます。解決致しました!!

Sign in to comment.

More Answers (0)

Categories

Find more on 数値積分と微分 in Help Center and File Exchange

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!