Clear Filters
Clear Filters

cell内に格納され​た時系列データの平均​値を算出するにはどう​すればいいですか?

4 views (last 30 days)
Kohei Yoshino
Kohei Yoshino on 22 Apr 2024
Commented: Kohei Yoshino on 23 Apr 2024
以下のcellデータの時系列の平均を算出したいと考えています。
それぞれのcellに格納された変数のうち(:,6)の列を32個抽出して行平均を出したいと考え以下のコードを作成しましたが、meandataが32列目のデータしか格納されません。いい方法はありませんでしょうか?
data = cell(1, length(A.Pelvic)) % Aに格納されているPelvicという変数を参照
for i = 1:length(A.Pelvic)
data{i} = A.Pelvic{i}(:,6);
meandata = arrayfun(@mean, data{i}); % cellfunだと変数が'double'なので実行できないというエラーが出るためarrayfunを使用
end
for n = 1:length(A.Pelvic);
plot(A.Pelvic{n}(:,6), 'b')
hold on
plot(meandata, 'r'); % dataをあらかじめ作成し、そこにmeandataを格納するつもりでしたが、meandataが全体の平均ではなくA.Pelvicの最後の列のみが反映されており平均できていない
end

Accepted Answer

Kojiro Saito
Kojiro Saito on 23 Apr 2024
meandataが32列目のデータしか格納されないのは、for ループの meandata = arrayfun(@mean, data{i});同じ変数名で上書きされているので、最後のループのi=32だけが格納されているためです。
forループを使わないでcellfunで一度で格納できます。
meandata = cellfun(@(x) mean(x(:,6)), A.Pelvic); % 1x32 double
また、プロットする際もそれぞれの6列目に対する平均値を示そうとされていると思いますので、meandata(n)でやってみたらいかがでしょうか。plot よりも定数値の線を引くyline も使えます。
for n = 1:length(A.Pelvic)
figure;
plot(A.Pelvic{n}(:,6), 'b')
hold on
%plot(meandata, 'r');
yline(meandata(n), 'r');
hold off
end
  1 Comment
Kohei Yoshino
Kohei Yoshino on 23 Apr 2024
ご回答ありがとうございます。ご提案いただいた構文ですと、1×32のデータしか得られず、やりたいこととしては、1×100(もしくは100×1)のデータにしたいです。自分がお示しした構文にて、A.Pelvic{1:n}(:,6)のグラフを以下のようにグラフ化(青線)し、その平均(赤線)を図示したいのですが、明らかに平均値ではない値が得られてしまいます。
また、グラフを見やすくするために、最終的には標準偏差を算出して以下のようなグラフ化を目指しています。このグラフはPythonのfill_betweenというメソッドを使用して作成しました。

Sign in to comment.

More Answers (0)

Products


Release

R2023b

Community Treasure Hunt

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

Start Hunting!