Asked by BOB
on 12 Sep 2018

Hi folks,

I've managed to loop my function to (correctly) determine the distance travelled by each line through the grid cells it intersects. It is as follows:

if true

for Z = 1:length(ev_longitude)

x1 = -4:10; %Grid x-range

A = min(ev_longitude(Z),st_longitude(Z)); %Determine min x coordinate of line

B = max(ev_longitude(Z),st_longitude(Z)); %Determine max x coordiante of line

x = [A B]; %x-range of line

y1 = 56:63; %Grid y-range

C = min(ev_latitude(Z),st_latitude(Z)); %Determine min y coordinate of line

D = max(ev_latitude(Z),st_latitude(Z)); %Determine max y coordinate of line

y = [C D]; %y-range of line

lxmb = @(x,mb) mb(1).*x + mb(2); %Line equation: y = m*x+b

coefficients = polyfit([A, B], [C, D], 1); %Determine line coefficients

m = coefficients (1); %Gradient

b = coefficients (2); %y-value intercept

mb = [m b]; %Matrix of [slope intercept] values

L1 = lxmb(x,mb); %Calculate Line #1 = y(x,m,b)

start_of_line = [A C]; %Start of line

end_of_line = [B D]; %End of line

hix = @(y,mb) [(y1-mb(2))./mb(1); y1]; %Calculate horizontal intercepts

vix = @(x,mb) [x1; lxmb(x1,mb)]; %Calculate vertical intercepts

hrz = hix(x(1:end),mb)'; %[X Y] Matrix of horizontal intercepts

vrt = vix(y(1:end),mb)'; %[X Y] Matrix of vertical intercepts

hvix = [start_of_line; hrz; vrt; end_of_line]; %Concatanated ‘hrz’ and ‘vrt’ arrays

srtd = unique(hvix,'rows'); %Remove repeats and sort ascending by ‘x’

Longitude_Values = srtd(:,1);

Latitude_Values = srtd(:,2);

i = find((Latitude_Values<=D) & (Latitude_Values>=C)); %Remove values beyond the drawn line

Final_Latitude_Values=Latitude_Values(i); %Remove values beyond the drawn line

ii = find((Longitude_Values<=B) & (Longitude_Values>=A)); %Remove values beyond the drawn line

Final_Longitude_Values=Longitude_Values(i); %Remove values beyond the drawn line

for j = 1:length(Final_Latitude_Values)-1 %Determine the distance per each segment

Segment_Distances(j) = sqrt((Final_Longitude_Values(j+1)-Final_Longitude_Values(j))^2 + (Final_Latitude_Values(j+1)-Final_Latitude_Values(j))^2) %euclidean distance in degrees.

end

clearvars -except ev_latitude ev_longitude st_latitude st_longitude

end

end

I want to save the variable Segment_Distances, but unless I clear it from the memory using the clearvars function then it remains in memory and is used incorrectly by the function to calculate the next line's Segment_Distances variable.

I essentially need a way to store the values for Segment_Distances created by the loop, but for the previous values of Segment_Distances to not be incorporated in the next loop.

If anyone can suggest an amendment to this it would be much appreciated.The only data needed is ev_latitude, ev_longitude, st_latitude and st_longitude. These are column vectors of random numbers.

Thanks.

Answer by Star Strider
on 12 Sep 2018

Accepted Answer

Since ‘Segment_Distances’ appears to be a scalar, the easiest way would likely be to give it a second subscript:

Segment_Distances(j,k) = ...

then increment ‘k’ in the next loop.

Star Strider
on 13 Sep 2018

BOB
on 13 Sep 2018

Star Strider
on 13 Sep 2018

As always, my pleasure.

‘Do you mean as in simply add a loop to the whole script with k as the subscript, and also add this k into the Segment_Distances(j) = ... line as well?’

Yes.

A similar option not involving a 2D matrix for ‘Segment_Distances’:

for j = 1:length(Final_Latitude_Values)-1 %Determine the distance per each segment

Segment_Distances(j) = sqrt((Final_Longitude_Values(j+1)-Final_Longitude_Values(j))^2 + (Final_Latitude_Values(j+1)-Final_Latitude_Values(j))^2) %euclidean distance in degrees.

end

Segment_Distancev(k) = Segment_Distances;

creating a new vector, ‘Segment_Distancev’.

If you want to keep only the last value computed for ‘Segment_Distances’, this will likely be more efficient.

If you want to keep all of them, use the 2D matrix option:

Segment_Distances(j,k) = ...

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.