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

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

Réponse acceptée

Hernia Baby
Hernia Baby le 27 Mar 2022
cellfunはいかがでしょうか?
  4 commentaires
Hernia Baby
Hernia Baby le 29 Mar 2022
Modifié(e) : Hernia Baby le 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 le 3 Avr 2022
ご回答いただきありがとうございます。解決致しました!!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur 数値積分と微分 dans Help Center et File Exchange

Produits


Version

R2021b

Community Treasure Hunt

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

Start Hunting!