MATLAB Answers

範囲を指定して演算する。

3 views (last 30 days)
Saito
Saito on 19 Dec 2019
Commented: Saito on 21 Dec 2019
xの値は秒を表すのですが、例えば、xが1秒から10秒の間のY(各々が1)サンプルABのYの総和をmatlabで求めるにはどうしたら良いでしょうか?

  0 Comments

Sign in to comment.

Accepted Answer

Kojiro Saito
Kojiro Saito on 20 Dec 2019
コード例はこちらです。
t = readtable('timestamps EX.xlsx','Range', 'A3:D49','ReadVariableNames', false);
% Aのデータ
tA = t(:,1:2);
tA.Properties.VariableNames = {'x', 'y'};
% Bのデータ
tB = t(:,3:4);
tB.Properties.VariableNames = {'x', 'y'};
% xが1から10の間のインデックスを取得
idxA = (tA.x >= 1) & (tA.x <=10);
idxB = (tB.x >= 1) & (tB.x <=10);
% 上記インデックスのAとBのyの合計を計算
result = sum(tA.y(idxA)) + sum(tB.y(idxB));
tAやtBの記述は冗長かもしれませんが、処理が分かりやすくなるかと思い入れました。
MATLAB本体だけでできます。

  2 Comments

Kenta
Kenta on 21 Dec 2019
こんにちは、指定時間内の値の総和であれば、上の回答者さまの方法が良いと思いました。
一方、適宜内挿して、時間内の変化量のようなものを見たければ、下のような方法でもよいと思いました。参考までに載せさせてください。お役に立ては幸いです。
内挿をわかりやすくするために、Yの値を変更しました。もとの点を黄色でプロットしています。
close all;clear;clc
%xlsxデータの読み込み
data =xlsread('timestamps EX.xlsx');
% Aのデータを読み込み
dataA = data(:,1:2);
%dataAのYの値を書き換え
dataA(:,2)=rand(size(dataA,1),1)+(abs(dataA(:,1)-10)).^2;
%Yの値を内挿
X_int = (1:0.01:round(dataA(:,1)));%内挿の間隔を指定
Y_interp = interp1(dataA(:,1),dataA(:,2),X_int,'pchip');
%サンプルと内挿された値をプロット
figure;plot(dataA(:,1),dataA(:,2),'o','color','y')
hold on
XY=horzcat([dataA(:,1);X_int'],[dataA(:,2);Y_interp']);
XY=sortrows(XY,1);
plot(XY(:,1),XY(:,2))
% xが1~10の場所を検索
idxA = (XY(:,1) >= 1) & (XY(:,1) <=10);
% xが1から10の間の面積を計算(=値を補完した後の総和)
distance = trapz(XY(idxA ,1),XY(idxA ,2),1);
title(sprintf('distance is %d',distance))
Saito
Saito on 21 Dec 2019
有難うございます。この方法も用途によって使う事もありのではないかと思います。

Sign in to comment.

More Answers (1)

Saito
Saito on 20 Dec 2019
symbolic math toolbox等のツールボックスを使って見たのですが、関数symsum(タイプdouble)の入力引数が未定義です。
となってしまいます。

  0 Comments

Sign in to comment.