Save variable in workspace but remove from memory?
2 次查看(过去 30 天)
显示 更早的评论
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.
0 个评论
采纳的回答
Star Strider
2018-9-12
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.
7 个评论
Star Strider
2018-9-13
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) = ...
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Low-Level File I/O 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!