read specific data from a given row and column from table

조회 수: 10 (최근 30일)
AL
AL 2022년 12월 8일
댓글: Mathieu NOE 2023년 3월 20일
I have table of size 28000x3
and i want to biefuracte data which looks like this.
I am using slope condition to collect the data.
function bifercation(Data)
c = 1;
for i= c:length(Data.para)
find((Data.para(i+1)-Data.para(i)) / (Data.Time(i+1)-Data.Time(i)))
end
end
however; i am getting following errors.
Index exceeds the number of array elements. Index must not exceed 28000.
Error in tabular/dotParenReference (line 111)
b = b(rowIndices);
Error in bifercation (line 8)
find((Data.para(i+1)-Data.para(i)) / (Data.Time(i+1)-Data.Time(i)))
diffenrece between time is non zero throughout the period.
  댓글 수: 1
AL
AL 2022년 12월 8일
편집: Rik 2023년 3월 14일
function bifercation(Data)
c = 0;
para = [0 0];
l = size(Data,1);
for c1 = 1:9
for i= c:l(1)
array = find((Data.para(i+1)-Data.para(i)) / (Data.Time(i+1)-Data.Time(i)));
if array ~= 0
para(i,1) = Data(i,1);
para(i,2) = Data(i,3);
elseif array == 0
c = i;
break;
else
continue;
end
end
end
end
Array indices must be positive integers or logical values.
Error in tabular/dotParenReference (line 111)
b = b(rowIndices);
Error in bifercation (line 7)
array = find((Data.Thrust_Force(i+1)-Data.Thrust_Force(i)) / (Data.Time(i+1)-Data.Time(i)));
updated code

댓글을 달려면 로그인하십시오.

채택된 답변

Mathieu NOE
Mathieu NOE 2022년 12월 8일
hello
maybe you need a function to give you start / stop time indexes based on threshold crossing
like this
clc
clearvars
% dummy data
n=1000;
x= 10*(0:n-1)/n;
y1 = sign(sin(2*x -0.5));
y2 = sin(x.^2 -0.5);
threshold = max(y1)/2; % half amplitude
[t0_pos1,s0_pos1,t0_neg1,s0_neg1]= crossing_V7(y1,x,threshold,'linear'); % positive (pos) and negative (neg) slope crossing points
% ind => time index (samples)
% t0 => corresponding time (x) values
% s0 => corresponding function (y) values , obviously they must be equal to "threshold"
[t0_pos2,s0_pos2,t0_neg2,s0_neg2]= crossing_V7(y2,x,threshold,'linear'); % positive (pos) and negative (neg) slope crossing points
% periods
d1 = diff(t0_pos1)
period1 = [d1(1) d1];
d2 = diff(t0_pos2)
period2 = [d2(1) d2];
figure(1)
subplot(3,1,1),plot(x,y1,'b',t0_pos1,s0_pos1,'*r',t0_neg1,s0_neg1,'*g','linewidth',2,'markersize',12);grid on
legend('signal','signal positive slope crossing points','signal negative slope crossing points');
subplot(3,1,2),plot(x,y2,'b',t0_pos2,s0_pos2,'*r',t0_neg2,s0_neg2,'*g','linewidth',2,'markersize',12);grid on
legend('signal','signal positive slope crossing points','signal negative slope crossing points');
subplot(3,1,3),plot(t0_pos1,period1,t0_pos2,period2,'linewidth',2,'markersize',12);grid on
legend('signal 1 period','signal 2 period');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [t0_pos,s0_pos,t0_neg,s0_neg] = crossing_V7(S,t,level,imeth)
% [ind,t0,s0,t0close,s0close] = crossing_V6(S,t,level,imeth,slope_sign) % older format
% CROSSING find the crossings of a given level of a signal
% ind = CROSSING(S) returns an index vector ind, the signal
% S crosses zero at ind or at between ind and ind+1
% [ind,t0] = CROSSING(S,t) additionally returns a time
% vector t0 of the zero crossings of the signal S. The crossing
% times are linearly interpolated between the given times t
% [ind,t0] = CROSSING(S,t,level) returns the crossings of the
% given level instead of the zero crossings
% ind = CROSSING(S,[],level) as above but without time interpolation
% [ind,t0] = CROSSING(S,t,level,par) allows additional parameters
% par = {'none'|'linear'}.
% With interpolation turned off (par = 'none') this function always
% returns the value left of the zero (the data point thats nearest
% to the zero AND smaller than the zero crossing).
%
% check the number of input arguments
error(nargchk(1,4,nargin));
% check the time vector input for consistency
if nargin < 2 | isempty(t)
% if no time vector is given, use the index vector as time
t = 1:length(S);
elseif length(t) ~= length(S)
% if S and t are not of the same length, throw an error
error('t and S must be of identical length!');
end
% check the level input
if nargin < 3
% set standard value 0, if level is not given
level = 0;
end
% check interpolation method input
if nargin < 4
imeth = 'linear';
end
% make row vectors
t = t(:)';
S = S(:)';
% always search for zeros. So if we want the crossing of
% any other threshold value "level", we subtract it from
% the values and search for zeros.
S = S - level;
% first look for exact zeros
ind0 = find( S == 0 );
% then look for zero crossings between data points
S1 = S(1:end-1) .* S(2:end);
ind1 = find( S1 < 0 );
% bring exact zeros and "in-between" zeros together
ind = sort([ind0 ind1]);
% and pick the associated time values
t0 = t(ind);
s0 = S(ind);
if ~isempty(ind)
if strcmp(imeth,'linear')
% linear interpolation of crossing
for ii=1:length(t0)
%if abs(S(ind(ii))) >= eps(S(ind(ii))) % MATLAB V7 et +
if abs(S(ind(ii))) >= eps*abs(S(ind(ii))) % MATLAB V6 et - EPS * ABS(X)
% interpolate only when data point is not already zero
NUM = (t(ind(ii)+1) - t(ind(ii)));
DEN = (S(ind(ii)+1) - S(ind(ii)));
slope = NUM / DEN;
slope_sign(ii) = sign(slope);
t0(ii) = t0(ii) - S(ind(ii)) * slope;
s0(ii) = level;
end
end
end
% extract the positive slope crossing points
ind_pos = find(sign(slope_sign)>0);
t0_pos = t0(ind_pos);
s0_pos = s0(ind_pos);
% extract the negative slope crossing points
ind_neg = find(sign(slope_sign)<0);
t0_neg = t0(ind_neg);
s0_neg = s0(ind_neg);
else
% empty output
ind_pos = [];
t0_pos = [];
s0_pos = [];
ind_neg = [];
t0_neg = [];
s0_neg = [];
end
end
  댓글 수: 3
AL
AL 2023년 3월 18일
Extremely sorry for response, Thank you so much for youe efforts, with your help and using concept explained by you was really helpful and solved my doubt. once again I really appriciate your efforts. Thank you so much. Have a wonderful weekend.
Mathieu NOE
Mathieu NOE 2023년 3월 20일
Glad I could help
have a great day !

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 MATLAB에 대해 자세히 알아보기

제품


릴리스

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by