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

17 vues (au cours des 30 derniers jours)
Saito
Saito le 19 Déc 2019
Commenté : Saito le 21 Déc 2019
xの値は秒を表すのですが、例えば、xが1秒から10秒の間のY(各々が1)サンプルABのYの総和をmatlabで求めるにはどうしたら良いでしょうか?

Réponse acceptée

Kojiro Saito
Kojiro Saito le 20 Déc 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 commentaires
Kenta
Kenta le 21 Déc 2019
Modifié(e) : Kenta le 21 Déc 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 le 21 Déc 2019
有難うございます。この方法も用途によって使う事もありのではないかと思います。

Connectez-vous pour commenter.

Plus de réponses (1)

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

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!