Feasible joint events for trackerJPDA

returns the feasible joint events, `FJE`

= jpdaEvents(`validationMatrix`

)`FJE`

, based on the validation matrix.
A validation matrix describes the possible associations between detections and tracks,
whereas a feasible joint event for multi-object tracking is one realization of the
associations between detections and tracks.

Define an arbitrary validation matrix for five measurements and six tracks.

M = [1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1];

Generate all feasible joint events and count the total number.

FJE = jpdaEvents(M); nFJE = size(FJE,3);

Display a few of the feasible joint events.

` disp([num2str(nFJE) ' feasible joint event matrices were generated.'])`

574 feasible joint event matrices were generated.

toSee = [1:round(nFJE/5):nFJE, nFJE]; for ii = toSee disp("Feasible joint event matrix #" + ii + ":") disp(FJE(:,:,ii)) end

Feasible joint event matrix #1: 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 Feasible joint event matrix #116: 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 Feasible joint event matrix #231: 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 Feasible joint event matrix #346: 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 Feasible joint event matrix #461: 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 Feasible joint event matrix #574: 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1

`validationMatrix`

— Validation MatrixValidation matrix, specified as an *m*-by-(*n*+1)
matrix, where *m* is the number of detections within a cluster of a
sensor scan, and *n* is the number of tracks maintained in the tracker.
The validation matrix uses the first column to account for the possibility that each
detection is clutter or false alarm, which is commonly referred to as "Track 0" or
*T*_{0}. The validation matrix is a binary matrix
listing all possible detections-to-track associations. If it is possible to assign track
*T*_{i} to detection
*D*_{j}, then the
(*j*, *i*+1) entry of the validation matrix is 1.
Otherwise, the entry is 0.

**Data Types: **`logical`

`FJE`

— Feasible joint eventsFeasible joint events, specified as an
*m*-by-(*n*+1)-by-*p* array, where
*m* is the number of detections within a cluster of a sensor scan,
*n* is the number of tracks maintained in the tracker, and
*p* is the total number of feasible joint events. Each page (an
*m*-by-(*n*+1) matrix) of `FJE`

corresponds to one possible association between all the tracks and detections. The
feasible joint event matrix on each page satisfies:

The matrix has exactly one "1" value per row.

Except for the first column, which maps to clutter, there can be at most one "1" per column.

For more details on feasible joint events, see Feasible Joint Events.

**Data Types: **`logical`

In the typical workflow for a tracking system, the tracker needs to determine
if a detection can be associated with any of the existing tracks. If the tracker only
maintains one track, the assignment can be done by evaluating the validation gate around the
predicted measurement and deciding if the measurement falls within the *validation
gate*. In the measurement space, the validation gate is a spatial boundary,
such as a 2-D ellipse or a 3-D ellipsoid, centered at the predicted measurement. The
validation gate is defined using the probability information (state estimation and
covariance, for example) of the existing track, such that the correct or ideal detections
have high likelihood (97% probability, for example) of falling within this validation gate.

However, if a tracker maintains multiple tracks, the data association process becomes more
complicated, because one detection can fall within the validation gates of multiple tracks.
For example, in the following figure, tracks *T*_{1}
and *T*_{2} are actively maintained in the tracker, and
each of them has its own validation gate. Since the detection
*D*_{2} is in the intersection of the validation
gates of both *T*_{1} and
*T*_{2}, the two tracks
(*T*_{1} and
*T*_{2}) are connected and form a
*cluster*. A cluster is a set of connected tracks and their
associated detections.

To represent the association relationship in a cluster, the validation matrix is commonly
used. Each row of the validation matrix corresponds to a detection while each column
corresponds to a track. To account for the eventuality of each detection being clutter, a
first column is added and usually referred to as "Track 0" or
*T*_{0}. If detection
*D*_{i} is inside the
validation gate of track *D*_{j},
then the (*j*, *i*+1) entry of the validation matrix is 1.
Otherwise, it is zero. For the cluster shown in the figure, the validation matrix Ω
is

$$\Omega =\left[\begin{array}{ccc}1& 1& 0\\ 1& 1& 1\\ 1& 0& 1\end{array}\right]$$

Note that all the elements in the first column of Ω are 1, because any detection can be clutter or false alarm. One important step in the logic of joint probabilistic data association (JPDA) is to obtain all the feasible independent joint events in a cluster. Two assumptions for the feasible joint events are:

A detection cannot be emitted by more than one track.

A track cannot be detected more than once by the sensor during a single scan.

Based on these two assumptions, feasible joint events (FJEs) can be formulated. Each FJE is
mapped to an FJE matrix Ω_{p} from the initial
validation matrix Ω. For example, with the validation matrix Ω, eight FJE matrices can be
obtained:

$$\begin{array}{l}{\Omega}_{1}=\left[\begin{array}{ccc}1& 0& 0\\ 1& 0& 0\\ 1& 0& 0\end{array}\right],\text{\hspace{0.17em}}\text{\hspace{0.05em}}\text{\hspace{0.17em}}{\Omega}_{2}=\left[\begin{array}{ccc}0& 1& 0\\ 1& 0& 0\\ 1& 0& 0\end{array}\right],\text{\hspace{0.17em}}\text{\hspace{0.17em}}{\Omega}_{3}=\left[\begin{array}{ccc}1& 0& 0\\ 0& 1& 0\\ 1& 0& 0\end{array}\right],\text{\hspace{0.17em}}\text{\hspace{0.17em}}{\Omega}_{4}=\left[\begin{array}{ccc}1& 0& 0\\ 0& 0& 1\\ 1& 0& 0\end{array}\right]\\ {\Omega}_{5}=\left[\begin{array}{ccc}0& 1& 0\\ 0& 0& 1\\ 1& 0& 0\end{array}\right],\text{\hspace{0.17em}}\text{\hspace{0.17em}}{\Omega}_{6}=\left[\begin{array}{ccc}1& 0& 0\\ 1& 0& 0\\ 0& 0& 1\end{array}\right],\text{\hspace{0.17em}}\text{\hspace{0.17em}}{\Omega}_{7}=\left[\begin{array}{ccc}0& 1& 0\\ 1& 0& 0\\ 0& 0& 1\end{array}\right],\text{\hspace{0.17em}}\text{\hspace{0.17em}}{\Omega}_{8}=\left[\begin{array}{ccc}1& 0& 0\\ 0& 1& 0\\ 0& 0& 1\end{array}\right]\end{array}$$

As a direct consequence of the two assumptions, the Ω_{p} matrices have
exactly one "1" value per row. Also, except for the first column which maps to clutter,
there can be at most one "1" per column. When the number of connected tracks grows in a
cluster, the number of FJE increases rapidly. The `jpdaEvents`

function
uses an efficient depth-first search algorithm to generate all the feasible joint event
matrices.

[1] Fortmann, T., Y. Bar-Shalom, and
M. Scheffe. "Sonar Tracking of Multiple Targets Using Joint Probabilistic Data Association."
*IEEE Journal of Ocean Engineering.* Vol. 8, Number 3, 1983, pp.
173-184.

Generate C and C++ code using MATLAB® Coder™.

Usage notes and limitations:

This function only supports double precision code generation.

A modified version of this example exists on your system. Do you want to open this version instead?

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

Select web siteYou can also select a web site from the following list:

Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.

- América Latina (Español)
- Canada (English)
- United States (English)

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)