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

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

2 votes

cellfunはいかがでしょうか?

4 commentaires

yuta
yuta le 27 Mar 2022
コメントいただきありがとうございます。
ドキュメンテーションを参考に、cellfunを使用してみたのですが、
'cell' タイプのオペランドに対して、演算子 '+' はサポートされていません。
入力引数が不足しています。
最初の入力は関数ハンドルでなければなりません。
などのエラーがでてしまい上手く使えませんでした。
A = cellfun(trapz, 0.001,xmin_base);
A = cellfun(trapz,xmin_base);
A = cellfun(trapz(0,001),xmin_base);
A = cellfun(trapz, 0.001,xmin_base);
色々試しましたが、全てエラーが返ってしまいました。
何か根本的に使用方法が間違っておりますでしょうか?
Atsushi Ueno
Atsushi Ueno le 29 Mar 2022
横やり失礼致します。
  • trapzの前に@を付ける必要があります
  • スカラ0.001もxmin_baseと同じセル配列構造にする必要があり、下記の様に面倒です
fctr = num2cell(ones(size(xmin_base)) * 0.001);
A = cellfun(@trapz, fctr, xmin_base);
>「trapz(X,Y)X*trapz(Y) と等価です」との事なので
A = 0.001 * cellfun(@trapz, xmin_base);
でも良いですね。
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

Produits

Version

R2021b

Community Treasure Hunt

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

Start Hunting!