MATLAB Answers

unable to perform tracking

5 views (last 30 days)
Chris Ron de
Chris Ron de on 29 May 2020
Commented: Chris Ron de on 12 Jun 2020
Hi,
I am pretty new with MATLAB and I want to link datapoints of different tracks to each other. I do have a file with data that I can change into x, y and z coordinates within a while1-loop. What I wanted to do is comparing each new set of datapoints with the already existing datapoints to see if they can be seen as a next point in an existing track. If that is not possible, the new datapoints are the start of a new track.
I tried to do it with vectors and structs, but no luck so far. The initial dataset is attached to this question and I am wondering if there is someone who can help me out in taking the right steps to a solution.
What I do have so far is:
clc;
clear variables;
f = fopen('combined4.tr','r');
%The current state of each track is in a matrix, showing the last value
A = zeros(6,4);
x_plot = []; % make vector for storing x-values
y_plot = []; % make vector for storing y-values
z_plot = []; % make vector for storing z-values
time = []; % make vector for storing time values
heading = []; % make vector for storing heading values
elevation = []; % make vector for storing elevation values
distance = []; % make vector for storing distance values
speed = []; % make vector for storing speed values
acc = []; % make vector for storing acceleration values
i_values = []; % make vector for storing i-values
while 1
%Read line
line = fgetl(f);
if ~ ischar(line), break, end
row = str2num(line);
t = row(1);
h = row(2);
e = row(3);
d = row(4);
r = cosd(e) * d;
x = sind(h) * r;
y = cosd(h) * r;
z = sind(e) * d;
if A(1,1)==0
A(1,1)=x;
A(1,2)=y;
A(1,3)=z;
A(1,4)=t;
else
for i=1:size(A,1)
difference=sqrt((x-A(i,1))^2+(y-A(i,2))^2+(z-A(i,3))^2);
if difference > 150
A(i,1)=x;
A(i,2)=y;
A(i,3)=z;
A(i,4)=t;
else
A(end+1,1)=x;
A(end+1,2)=y;
A(end+1,3)=z;
A(end+1,4)=t;
end
end
end
end
fclose(f);

  0 Comments

Sign in to comment.

Answers (1)

Gaurav Garg
Gaurav Garg on 8 Jun 2020
Hey Chris
You would want to run 2 loops -
  1. Iterating over all the datapoints,
  2. Running over the datapoints assigned to tracks already
Here on, i would assume each new track being represented with a new row and each column representing the datapoints on the track.
While iterating over each datapoint, you can check whether this datapoint -
  1. should be make a new track, or
  2. should be a part of an existing track.
In case, the datapoint should make a new track, you can add a new row to your matrix, representing a new track.
If it comes to be a point on an existing track, you can add this datapoint to a new column in the respective row/track.

  3 Comments

Chris Ron de
Chris Ron de on 10 Jun 2020
Thanks a lot for this answer. Due to the current circumstances I wasn't able to react earlier.
I thought I already made new tracks with the else statement. If I understood it right, another if statement is necessary within the while1-loop, or can this also be done by adding an elseif statement?
My assumption was that in creating a matrix of zeros, I could use this matrix to fil the rows of it with the different tracks. I (mis)used the start of the for-loop to fix the first datapoint in the file to the first row of matrix A. If I didn't do it that way, my first three datapoints disapear because I use a while-loop and the first four points al have a timestamp 0. Is there a more elegant way to solve this problem?
Many thanks in advance and I hope you can answer my additional questions.
Chris
Gaurav Garg
Gaurav Garg on 12 Jun 2020
Hey Chris,
'If I understood it right, another if statement is necessary within the while1-loop, or can this also be done by adding an elseif statement?' ==> Which loop are you talking about? Because the first loop is used only to iterate over the datapoints on the track, and second one would be used to check the datapoint already assigned (matrix in your case), and no assignment would be needed in the first loop (because you are checking for the right tracks and the respective checkpoints in the second loop).
'Is there a more elegant way to solve this problem' ==> What you are doing here is quite elegant in its own way. You can try other ways as well, which would work , however they would still give you the same performance (time-wise).
Chris Ron de
Chris Ron de on 12 Jun 2020
Hi Gaurav,
I think you hit the right button. I was thinking that it all could be done with one if statement and I was wondering why the while loop and the if statement are not working together. I am going to introduce another if statement and I think I have to make it with true and false statements of the first loop. At this moment it is just a thought and I have to figure it out because I'm not that familiar with MATLAB. Thanks anyway so far and if you have an idea about coding that true and false story, it is more than welcome.
Chris

Sign in to comment.


Translated by