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

36 次查看(过去 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 CenterFile Exchange 中查找有关 数値積分と微分 的更多信息

产品


版本

R2021b

Community Treasure Hunt

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

Start Hunting!