1.930 views (last 30 days)

Why do I get the following error message:

Subscript indices must either be real positive integers or logicals.

MathWorks Support Team
on 3 Jan 2019

This error occurs when you attempt to index into an array using indices that are not positive integers or logical values. Here are some tips for common situations that cause this error message:

1) Double check that your indices are positive integers. Indices in MATLAB cannot be 0, and by default, start with 1.

2) If you are using logical indexing to index into an array, be sure that your index array is of type 'logical', and not a 'double' array of 1s and 0s. You can convert a 'double' array to a logical array before attempting to use logical indexing. For example:

A = [1 2 3 4; 5 6 7 8];

ind_double = [0 1 0 1; 0 1 0 1];

ind_logical = logical(ind_double);

A(ind_logical)

For an index array 'ind', you can check its data type using the 'whos' function:

whos ind

3) If you use floating-point arithmetic to compute an index array, then the array values may not be exact integers. The 'round' function is handy when you know you have an index value that is nearly the integer index that you want. For example,

A = [1 2 3 4; 5 6 7 8];

ind_float = 2.00001;

ind_int = round(ind_float);

A(ind_float)

Below is a way to check if an index array 'ind'' contains exact integer values. This command returns a 'logical' array, where 1 indicates the index value is an exact integer, and 0 indicates it is not.

ind == round(ind)

4) If you assign a variable to the same name as a built-in function in MATLAB, then you will overwrite that function and encounter the error when you attempt to call it. For example,

max = rand(5);

A = rand(5);

max(A)

In this event, rename your variable and clear the old one to proceed:

B = max;

clear max max(A)

For more information on indexing in MATLAB, see the following documentation page:

Antoine Pichot
on 19 Nov 2015

Iaredi Sabinas's comment should be a valid answer.

It may happen when you have a variable named after an existing matlab function, like min or diff. Matlab thinks you are using the variable instead of the builtin function.

Stephen Cobeldick
on 19 Nov 2015

Schrecklich Er
on 18 Mar 2017

Edited: Walter Roberson
on 4 Apr 2017

I got this message while I was trying process a image using 'imread', i had the following structure:

for i = 1 : f

for j = 1 : c

B(i,j)=([A1(i,j)*A2(i,j)]);

B1(i,j)=(A2(i,j)/A1(i,j));

end

end

i got the same error message so until 30 minutes of research I just switch the letter 'i' for a 'k' and the error message disapeared, I think that the error was there because the letter 'i' is used for imaginary numbers.

just a little hint! Hope it is useful.

Farah Nadiah
on 22 Apr 2016

how about this. the word that have star...how can i declare..if i run this prgoram it get error..thnx a lot

for i=0:1: maxrow-1

for j=0:1: maxcol-1

% inv([i, j]) = 255 - image([i, j]);

for k = 0: 1

*sto([i, j, k]) = image([i, j]);*

end

end

end

Walter Roberson
on 22 Apr 2016

MATLAB indexing starts at 1, not at 0. You need to add 1 to all of your indices.

Also remember that sto([i, j, k]) is indexing sto at 3 locations, sto(i), sto(j), sto(k). It is not an index into a 3 dimensional array: that would be sto(i, j, k)

Pratyush Lohumi
on 18 Mar 2017

Edited: Walter Roberson
on 18 Mar 2017

for n = 0:ns

s(n) = (ns-n)/ns; %slip

Tmech(n) = ph*V1eq^2*R2/((s(n)*omegas)*((R1eq + R2/s(n))^2+(X1+X2)^2)); %Electromechanical torque

end %End of slip loop

Error: Subscript indices must either be real positive integers or logicals. (Line 2)

Query: Couldn't seem to rectify the mistake?

If someone could provide a valid explanation or a corrected code for this loop, that would really help my project.

Walter Roberson
on 18 Mar 2017

In MATLAB, subscripts start at 1. Your n starts at 0, so s(n) is going to start at s(0) which is not permitted.

nvals = 0 : ns;

for nidx = 1 : length(nvals)

n = nvals(nidx);

s(nidx) = (ns-n)/ns; %slip

Tmech(nidx) = ph*V1eq^2*R2/((s(nidx)*omegas)*((R1eq + R2/s(nidx))^2+(X1+X2)^2)); %Electromechanical torque

end

This can be vectorized, no loop:

s = linspace(1, 0, ns+1);

Tmech = ph .* V1eq.^2 .* R2 ./ ((s .* omegas) .* ((R1eq + R2./s).^2 + (X1+X2).^2));

Walter Roberson
on 18 Mar 2017

If you insist on using the same structure of loop, then:

for n = 0:ns

s(n+1) = (ns-n)/ns; %slip

Tmech(n+1) = ph*V1eq^2*R2/((s(n+1)*omegas)*((R1eq + R2/s(n+1))^2+(X1+X2)^2)); %Electromechanical torque

end %End of slip loop

Imen BOUGRINE
on 4 Apr 2017

for m = 1:num_pulse_int

%Update sensor and target positions

[sensorpos,sensorvel] = sensormotion(1/prf);

[tgtpos,tgtvel] = tgtmotion(1/prf);

padmini kutturu
on 26 Apr 2017

Edited: Walter Roberson
on 26 Apr 2017

Can someone please help me with this? Thank you!

for j=1:n

y(j)= (T(j)-Ts)/(Tb-Ts);

h(j)=(1/427)*(-0.0717)*L*(Tb-Ts)*(y(j+1)-y(j-1)/2*deltas);

r(j)=(e*sigma*L^2*P*Ts^3)/(kAc)*(((T(j)/Ts)^3)+((T(j)/Ts)^2)+(T(j)/Ts)+1);

c(j)=1-(h(j)*deltas/2);

a(j)=-2+(r(j)*deltas^2);

b(j)=1+(h(j)*deltas/2);

end

Walter Roberson
on 26 Apr 2017

On the first iteration, j = 1. Then you have

h(j)=(1/427)*(-0.0717)*L*(Tb-Ts)*(y(j+1)-y(j-1)/2*deltas);

which uses y(j-1) which would be y(0) .

If you are going to use y(j-1) then your j must start at 2 or more.

Walter Roberson
on 25 Sep 2018

Ram: you had a k-5 subscript with k starting at 1. You need to start k at 6 or more.

Wellington Pereira Guedes
on 3 Oct 2017

Somenone can help me. I got this erro when using this code below:

W2=[];%will contain watermark signal extracted from the image

for t=1:wmsz

W2 = [W2(D_w(IND(t,1),IND(t,2))/D(IND(t,1),IND(t,2)))*10] %watermark extraction

end

Walter Roberson
on 4 Oct 2017

Let us match brackets. The number will be the count of open brackets "after" the character aligned with:

W2 = [W2(D_w(IND(t,1),IND(t,2))/D(IND(t,1),IND(t,2)))*10]

1 2 3 4 3 4 32 3 4 3 4 321 0

We see from this that W2 is being indexed by

D_w(IND(t,1),IND(t,2)) / D(IND(t,1),IND(t,2))

1 2 1 2 10 1 2 1 2 10

which contains a division. So for the index into W2 to be an integer, D_w(IND(t,1),IND(t,2)) would have to be an non-zero integer exact integer multiple of D(IND(t,1),IND(t,2)) . That condition is not impossible, but it is something I would tend to doubt.

Yago Veloso
on 6 Oct 2017

Edited: Walter Roberson
on 6 Oct 2017

Hi everyone! I get the same error in my code, I'm trying to connect a function to my main code, where the function supply my code with all variables of my system equation solution.

Below is part of my main code where I found this error:

[Y1des]= ANN (Z1,e1,s1,D);

[ ac, ao, at_coluna, kp, r1, r2, L, vj, ro_ar, visc_ar, k_ar, RA, P, t_ar, Tar_e, T_ar_ext, Urel_e, Urel, Uabs_e, cps, ro_p_ap, hparede, cal_lat, cpar, cpl, cpv, ro_p, dp, Ubs, u, Rep1, Nu, hp1, St, Rep2, hw1, e, ae1, aet, X1, t_seg, X, ae, hp, hw, d_xp, tt,z]= variaveis (h, Y1des, hi, uar, t_min);

[G ,u, Pvse, Pve, UAEsat, UAE, He]= prop_ar (ro_ar,uar,ac, ao, at_coluna,t_ar, Tar_e, Urel_e, P);

[vl, mg, mss]= prop_leito (ro_p_ap,ro_p,ro_ar,ac,hi,vj);

%%%Initial condition

Tp(1)= 298.15;

Tar_s(1)= Tar_e - ((1-exp(-X(1)))*(Tar_e-Tp(1)));

tar_s(1) = Tar_s(1)-273.15;

Here is the error message

Subscript indices must either be real positive

integers or logicals.

Error in Dif_finitas_plus_ANN (line 44)

Tar_s(1)= Tar_e -

((1-exp(-X(1)))*(Tar_e-Tp(1)));

Thanks for the help !!

MarkusP
on 5 Feb 2018

Edited: MarkusP
on 5 Feb 2018

hello guys, maybe someone of you is able to help me...I tried to fix my problem with the solution above but it wasn`t possible.

I get the same error message if I`m runnung the following skript. The skript is for solving a problem with methods of characteristic.

l=1;

d=0.01;

rho=1000;

f=0.1;

a=1;

p0=2e3;

v0=(p0*2*d/(l*rho*f))^0.5;

n=101;

h=l/(n-1);

v(1:n)=v0;

p(1)=p0;

for i=2:n

p(i)=p(i-1)-f*rho*v0^2*h/(2*d);

end

dt=h/a;

tmax=3;

itmax=tmax/dt;

fhr=f*h/(2*a*d);

for it=1:itmax

t=it*dt;

for i=2:n-1

pa=p(i-1);

pb=p(i+1);

va=v(i-1);

vb=v(i+1);

pc(i)=a/2*((pa+pb)/a+rho*(va-vb)+fhr*(vb*abs(vb)-va*abs(va)));

vc(i)=0.5*((pa-pb)/(a*rho)+va+vb-fhr*(vb*abs(vb)+va*abs(va)));

end

pc(1)=p0;

vb=v(2);

pb=p(2);

vc(1)=vb+(pc(1)-pb)/(a*rho)-fhr*vb*abs(vb);

vc(n)=v0*valve(t);

va=v(n-1);

pa=p(n-1);

pc(n)=pa-rho*a(vc(n)-va)+f*h*rho/(2*d)*va*abs(va); %%error is in this line

vres(it,1:n)=vc(1:n);

pres(it,1:n)=pc(1:n);

p=pc;

v=vc;

end

My valve(t) function looks like this:

function vrel = valve(t)

if t<.1

vrel=1;

else

vrel=exp(-10*(t-.1));

end

Here is the error message:

Subscript indices must either be real positive integers or logicals.

Error in MOCwaterhammer (line 45)

pc(n)=pa-rho*a(vc(n)-va)+f*h*rho/(2*d)*va*abs(va);

Thanks for you help!

Hamza saeed khan
on 21 Dec 2018

I think it may help. I myself remove (t) from c(t) and m(t) as follows:

clc

close all

clear all

%let values we asigned as followed

A1=4

A2=2

f1=5

f2=6

t=0.1:0.001:1

c=20*A1*cos(2*pi)*f1

m=12*A2*cos(2*pi)*f2

y=c*m

plot(y,t,'r')

xlabel('c(t)')

ylabel('m(t)')

grid on

Best wishes Hamza Pakistani lol

Miguel Angel Guzman de la Cruz
on 7 Oct 2019

¿How I put a range in for loop that starts in a negative number?

Something like that

for i=-10000:100:10000

delta_g(i,1)=((4*R1^3*sp*G)/3)*(z1/(i^2+z1^2)^(3/2));

end

Salu2

Jamal Nasir
on 31 Mar 2020

this error when a negative number or real number used as indecies of matrix

Sofia Santos
on 8 May 2020

Hello, I tried using round() and convert double to logical, bue when I type "whos maximum" or "whos minimum" nothing is show. I want to now the time in minimum and the time in maximum for calculate de rise time.

Can you look ate my code and see if you can help? Thank you very much!!

data_org = importdata(sinais,'\t',7); %text file with 7 columms

EDA=data_org.data;

EDA= EDA(:,6); %I just want the values in the 6th column

T=N/fs;

t = (1:N)/fs;

minimum= min(EDAuS_filter);

maximum= max(EDAuS_filter);

amp=maximo-minimo; %signal amplitude

tmin=t(minimo);

tmax=t(maximo);

rise_time= tmax-tmin;

Sofia Santos
on 8 May 2020

Thanks for the warning, I just forgot to copy the part of the script that filters the signal, like this:

[b,a] = butter(6,0.0035,'low');

EDAuS_filter = filtfilt(b,a,EDAuS); %filtering signal EDA

Walter Roberson
on 8 May 2020

Are you executing this in the context of a function? If so then the variables would disappear from your workspace after the function returns.

I suggest putting in a breakpoint in your code and stepping through observing which variables exist.

Sofia Santos
on 8 May 2020

Seahawkgo
on 27 May 2020

Edited: Walter Roberson
on 27 May 2020

Please help me to solve the mean of a function that i have error:

"Subscript indices must either be real positive integers or logicals."

Error in Chanprojectpart32 (line 36)

E(Zr)=mean(Zr);

=====================

for j=1:N-1

s1 = 0;

s2 = 0;

for k=1:No+1

Phi=(pi-(-pi))*rand-pi;%Phi-k

Fk = Fd.*(cos((2*pi*k)/M)); %Fk

Bk = pi/(No+1)*k; %k(pi/No+1)

..........

.........

y6 = cos(2*pi*Fd*t + Phi);

s1 = s1 + y1*y2;

s2 = s2 + y5*y2;

end

Zr = NN*s1 + MM*(y3*y6);

Zi = NN*s2 + MM*(y4*y6);

end

E(Zr)=mean(Zr);

E(Zi)=mean(Zi);

Walter Roberson
on 27 May 2020

Viktoriia Buliuk
on 3 Aug 2020

Hello! I try to perform the transforn of obtained data from .csv file. Could you, please, help me. I have the following errors:

Subscript indices must either be real positive integers or logicals.

Error in walvet>@(tau)hh(tau)*(2/(3^(1/2)*pi^(1/4))*exp(-((tau-ttt(j))/a(i))^2/2)*(1-((tau-ttt(j))/a(i))^2))

Error in integralCalc/iterateArrayValued (line 156)

fxj = FUN(t(1)).*w(1);

Error in integralCalc/vadapt (line 130)

[q,errbnd] = iterateArrayValued(u,tinterval,pathlen);

Error in integralCalc (line 103)

[q,errbnd] = vadapt(@minusInfToInfInvTransform,interval);

Error in integral (line 88)

Q = integralCalc(fun,a,b,opstruct);

Error in walvet (line 26)

Q = integral(F,-Inf,Inf, 'ArrayValued', true);

And the code is follofing:

type wet.csv

Test = importdata('wet.csv');

t = Test(:, 1);

h = Test(:, 2);

tt = max(t);

tr = min(t);

ttt = tr:4.0003*10^-11:tt;

hh = interp1(t, h, ttt);

figure(2);

plot(t, h, 'ro');

hold on;

plot(ttt, hh, 'g');

a = 0.3*10^-10:10^-11:10^-9;

for i = 1:length(a)

for j = 1:length(ttt)

F = @(tau) hh(tau)*(2/(3^(1/2)*pi^(1/4))*exp(-((tau-ttt(j))/a(i))^2/2)*(1 - ((tau-ttt(j))/a(i))^2));

Q = integral(F,-Inf,Inf, 'ArrayValued', true);

K = (1/(a(i)^(1/2)))*Q;

S = real(K);

end

end

contour (ttt, hh, a, S, 500)

Thank you very much!!!

Walter Roberson
on 3 Aug 2020

ttt = tr:4.0003*10^-11:tt;

That is a vector of numeric values.

hh = interp1(t, h, ttt);

so that is going to be a vector of numeric values.

F = @(tau) hh(tau)*(2/(3^(1/2)*pi^(1/4))*exp(-((tau-ttt(j))/a(i))^2/2)*(1 - ((tau-ttt(j))/a(i))^2));

hh is a vector of numeric values, so hh(tau) would be an attempt to index that vector at location given by tau . In order for that to be valid, tau would have to be positive integers.

Q = integral(F,-Inf,Inf, 'ArrayValued', true);

integral() inherently treats the function handle as designating a continuous function in its parameter, here given as values in the range -inf to +inf . Even if the process happened to start by chosing positive integers, you can be sure at some point it is going to ask for values with negative values of the parameter, and so is going to try to index hh at something that is not a positive integer.

You could potentially convert the reference to hh(tau) into a function that did the t / h interpolation at locations designated by tau, but since you did not specify an interpolation method, the default would be to generate nan for any tau value that is outside the t range -- and since your range is -Inf to +Inf you can be sure that nan would be generated, making the integer integral nan.

You need to reconsider what your function means. When tau is outside the tt range, then what value should hh(tau) have ?

Destaw Masresha
on 13 Dec 2020

Edited: Walter Roberson
on 13 Dec 2020

A=sort(fc);

B=A((c*d-n+1):c*d); % selete the top n of the variance

Subscript indices must either be real positive integers or logicals

please anyone can help me...??

Walter Roberson
on 13 Dec 2020

What are c and d ? What is n ?

I speculate that you constructed c and d such that you expect c*d to always be an integer, but that it is not always exactly an integer. For example if c were 0.1:0.1:1 and d were 10, then you might expect that c*d is always an integer, but that would be false:

format long g

c = 0.1 : 0.1 : 1;

mat2str(c)

d = 10;

mat2str(c * d)

mat2str(c * d - (1:10))

c(3) - 0.3

Lessions:

- 0.1 is not exactly representable in double precision
- multiplying a double precision number that is "mathematically" a fraction, by something that "mathematically" give you back an integer... doesn't always give you back an integer. 0.3 * 10 does not give 3
- numbers calculated by fractional increments on colon operators, such as the third value of 0.1:0.1:1, are not always exactly the same as the corresponding literal value you would expect. 0.1+0.1+0.1 does not give you the same value as you would get from writing 0.3

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

Start Hunting!
## 6 Comments

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_306413

⋮## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_306413

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_356090

⋮## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_356090

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_452817

⋮## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_452817

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_490006

⋮## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_490006

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_595572

⋮## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_595572

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_614365

⋮## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/102145-why-do-i-get-the-error-subscript-indices-must-either-be-real-positive-integers-or-logicals#comment_614365

Sign in to comment.