Why do I get "Array indices must be positive integers or logical values" error when trying to calculate the average range for the last five observation in line 121?

load('ecgClear_1.mat')
x = ecgClear_1(:,1);
Fs = 257;
HF = butter2filtfilt( x, Fs, 20, 'high');
LF = butter2filtfilt( x, Fs, 0.15, 'low');
ecg = x-HF-LF;
figure();
plot(ecg);
%%
% figure()
% plot(x);
ecg_dif = [];
ecg_dif(1:4,1) = 0;
ecg_dif2 = [];
ecg_dif2(1:4,1) = 0;
for n =5:numel(ecg)
ecg_dif(n,1)= abs(ecg(n,1)-ecg(n-2,1));
ecg_dif2(n,1)= abs(ecg(n,1)-2*ecg(n-2,1)+ecg(n-4,1));
end
res = 1.3*ecg_dif+1.1*ecg_dif2;
%%
figure()
a1 = subplot(2,1,1);
plot(ecg);
a2 = subplot(2,1,2);
plot(res);
grid on;
a2.XLim = a1.XLim;
%%
A = 100;
id = res>=A;
fl = false(numel(id),1);
for i = 1:numel(id)-6
s = sum(id(i:i+6));
if s >= 4
fl(i) = true;
end
end
%%
T_Lim = fix(0.2*Fs);
i = 1;
Q_start = [];
while i<=numel(id)
if fl(i)
Q_start =[Q_start;i];
i=i+T_Lim;
else
i = i+1;
end
end
%%
T_Lim = fix(0.2*Fs);
i = 1;
Q_start = [];
R_end = [];
R_peak = [];
R_fl = false;
while i<=numel(id)
if fl(i)
Q_start =[Q_start;i];
[~,mID] = max(abs(ecg(i:i+fix(T_Lim*0.5))));
R_peak = [R_peak; mID+i-1];
R_fl = true;
i=i+T_Lim;
isPlus = ecg(mID+i-1)>0;
for j = mID+i:i+T_Lim
if isPlus && R_fl
if ecg(j)<0
R_end = [R_end ; j];
R_fl = false;
end
elseif ~isPlus && R_fl
if ecg(j)>0
R_end = [R_end;j];
R_fl = false;
end
end
end
if R_fl == true
R_end = [R_end; mID+i-1+mID];
end
i = i+T_Lim;
else
i =i+1;
end
end
%%
figure()
plot(ecg);
hold on;
stem(Q_start,ecg(Q_start));
stem(R_peak,ecg(R_peak));
stem(R_end,ecg(R_end));
grid on
%%
QS = [Q_start R_end];
Data = ecg;
N = size(QS,1);
for i=2:N
RR(i,1) = (R_peak(i)-R_peak(i-1))/Fs;
end
RR(1,1)= 0;
QSparams = struct();
N = size(QS,1);
for i =1:N
Q = QS(i,1);
S = QS(i,2);
QSparams.M(i,1) = mean(ecg(Q:S));
QSparams.std(i,1) = std(ecg(Q:S));
QSparams.max(i,1) = max(ecg(Q:S));
QSparams.min(i,1) = min(ecg(Q:S));
QSparams.range(i,1) = QSparams.max(i,1)- QSparams.min(i,1);
QSparams.L(i,1) = sum(abs(ecg(Q:S)));
QSparams.L2range(i,1) = QSparams.L(i,1)/QSparams.range(i,1);
QSparams.L2time(i,1) = QSparams.L(i,1)/((S-Q)/Fs);
R = QSparams.range;
AR = mean(R(end-5+1:end));
%relR = QSparams.range/AR;
if i~=1 && i~=N
QSparams.minRR(i,1) = min(RR(i,1),RR(i+1,1));
QSparams.minDist(i,1) = min((Q-QS(i-1,2))/Fs,(QS(i+1,1)-S)/Fs);
else
QSparams.minRR(i,1)= 0;
QSparams.minDist(i,1)=0;
end
end
figure()
P1 = QSparams.range;
P2 = QSparams.minRR;
P3 = QSparams.L2time;
scatter3(P1,P2,P3);
QRSstruct_clear = struct('Q_start',Q_start,'R_peak',R_peak,'R_end',R_end);
r = max(QS);

2 Comments

AR = mean(R(end-5+1:end));
This will throw error, if size of R is less than 5. You need to rethink on this.
Thank you bro. , The size of R = [1390 1] and the same problem

Sign in to comment.

 Accepted Answer

You should know that, the array indices in MATLAB should be positive integers or logicals. If not you will get this error.
Demo:
A = rand(10,1) ;
A(1) % no error, 1 is positive
A(10) % no error 10 is positve
A(0) % error index cannot be 0
A(-1) % error indices cannot be negative
%
idx = A>0.5 ;
A(idx) % no error, logical indexing
Check in your code, where you are going wrong with the indices. Learn about debugging code. Stop at the line, debug and check the indices.

2 Comments

good afternoon sir,please guide how to get 'ecgClear_1.mat' this data file
Good afternoon I didn't understand , could you explain your question please? You need this data file?

Sign in to comment.

More Answers (0)

Categories

Tags

Community Treasure Hunt

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

Start Hunting!