MATLAB Answers

Array indices must be positive integers or logical values.

26 views (last 30 days)
I am writing a program to simulate an F1 car laptime. Imagibe the car has come out of a corner and is accelerating doen a straight until it has to brake for the next corner. The times for this acceleration and deceleration have to be counted seperately as they are governed by seperate functions. There is a part of the code where the time taken to accelerate on a staright (t1) has to be reset to 0 to then start the the clock for the time taken to decelerate for the upcoming corner (t2) to be counted. I keep getting the same error "Array indices must be positive integers or logical values." no matter what i do.
% Calculate the straights
strTimes = zeros(num_str,1);
sLap = zeros(nseg*nds,1); %sLap = distance around lap
vCar = zeros(nseg*nds,1); %vCar = velocity of car around lap
str = 1;
smax = 0;
for i=1:nseg
rad = track(i,2);
dist = track(i,1);
s = linspace(0,dist,nds)'; %nds = 500 (no. of iterations)
nstart = ((i-1)*nds+1);
nend = (i*nds);
sLap(nstart:nend) = smax + s;
smax = max(sLap);
% Straight
if rad == 0
ds = s(2)-s(1);
% Corner segment numbers
pcsn = i-1; %previous corner segment number
ncsn = i+1; %next corner segment number
if pcsn < 1
pcsn = max(cnrNum);
if ncsn>nseg
ncsn = min(cnrNum);
pcn = find(pcsn==cnrNum);
ncn = find(ncsn==cnrNum);
[Va,P,G,WE,t1] = calc_acceleration(nds,rho,cd,A,m,s,Rw,cnrVel(pcn));
[Vd,t2] = calc_deceleration(ds,cnrVel(ncn),nds,rho,A,cd,m,cz);
[V,I] = min([Va,Vd],[],2);
vCar(nstart:nend) = V;
% Reset the clock for the braking time, ncn = next corner number
%cnrVel = corner velocity, t1 = acceleration time
%t2 = deceleration time
if max(V) > cnrVel(ncn)
ta = t1(I==3);
tb = t2(I==3);
tb = tb+(ta(end)-tb(1));
t = [ta;tb];
t = t1;
strTimes(str) = max(t);
str = str+1;
vCar(nstart:nend) = ones(nds,1)*cnrVel(i==cnrNum);


Show 3 older comments
Alastair Combe
Alastair Combe on 11 Apr 2019
They're not meant to be empty they should have values of time in them.
Torsten on 11 Apr 2019
Maybe I is never 3 ? Or t1 and t2 don't have the same length as I ? We don't know.
Alastair Combe
Alastair Combe on 11 Apr 2019
There was a problem with that as well, i put 3 in to stop an error occuring there as well, it was originally 1. it creates
> I==1
ans =
500×1 logical array
ans =
500×1 logical array
The only difference is that I==1 creates some 1's and 0's in the array as opposed to I==3 creates a list of only 0's

Sign in to comment.

Accepted Answer

Guillaume on 11 Apr 2019
They're not meant to be empty
Well, then you go back through the code to find out why they're empty.
Going up we see,
ta = t1(I==3);
So clearly if I doesn't contain 3 exactly, ta will be empty. So what is I?
[V,I] = min([Va,Vd],[],2);
It's the colum index where a minimum is found. I don't know what Va and Vd are. if they are column vectors then [Va, Vd] only has two columns, and obviously, you're never going to find a minimum in the 3rd column. If Va and or Vd have more than one column, the the minimum could be found in column 3 but there is absolutely no guarantee of that.
As it is, either you're guaranteed they're empty (if Va and Vb both have only one column) or they could be empty if no row of [Va, Vb] has its minimum in the 3rd column.


Show 8 older comments
Alastair Combe
Alastair Combe on 12 Apr 2019
function [V,P,G,WE,D,t] = calc_acceleration(nds,rho,cd,A,m,s,Rw,V0)
ni = [13.506352;
V = zeros(nds,1);
P = zeros(nds,1);
G = zeros(nds,1);
WE = zeros(nds,1);
D = zeros(nds,1);
gear = 1;
ds = s(2)-s(1);
t = zeros(nds,1);
gchange_time = 0.001;
tsgc = 0;
% Loop
for i=1:nds
dt = ds/V0;
% Calculate drag
D = 0.5*rho*cd*(V0^2)*A;
% Choose gear and get power
if tsgc < gchange_time
power = getPower((ni(gear)*V0)/Rw);
tsgc = tsgc + dt;
power = zeros(numel(ni),1);
for g=1:numel(ni)
power(g) = getPower((ni(g)*V0)/Rw);
[power,newgear] = max(power);
if newgear ~= gear
tsgc = 0;
gear = newgear;
We = (ni(gear)*V0)/Rw;
WE(i) = We;
P(i) = power;
G(i) = gear;
% Calculate torque at wheel
Te = (power/We)*0.85;
Tw = Te*ni(gear);
%Add wheel inertia
WI = 4*(10*(0.335)^2);
% Calculate net force
Fw = (Tw+WI)/Rw;
F = Fw-D;
% Calculate acceleration
a = F/m;
% Calculate new veloicty
V(i) = V0;
V0 = sqrt(V0^2 + (2*a*ds));
if i>1
t(i) = t(i-1) + dt;
This is calc_acceleration
Torsten on 12 Apr 2019
calc_acceleration has 6 outputs while your call to calc_acceleration only uses five of them.
[Va,P,G,WE,~,t1] = calc_acceleration(nds,rho,cd,A,m,s,Rw,cnrVel(pcn));
instead of your call.
Alastair Combe
Alastair Combe on 12 Apr 2019
That was it, it's running now and producing a time. Thanks very much!

Sign in to comment.

More Answers (0)

Sign in to answer this question.