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

34 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で求めるにはどうしたら良いでしょうか?

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
Edited: 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)の入力引数が未定義です。
となってしまいます。

Categories

Find more on 数学 in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!