# jpdaEvents

Feasible joint events for trackerJPDA

## Syntax

``FJE = jpdaEvents(validationMatrix)``
``[FJE,FJEProbs] = jpdaEvents(likelihoodMatrix,k)``

## Description

example

````FJE = jpdaEvents(validationMatrix)` returns the feasible joint events, `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.```

example

````[FJE,FJEProbs] = jpdaEvents(likelihoodMatrix,k)` generates the `k`-best feasible joint event matrices, `FJE`, corresponding to the posterior likelihood matrix, `likelihoodMatrix`. `likelihoodMatrix` defines the posterior likelihood of associating detections with tracks.```

## Examples

collapse all

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 ```

Create a likelihood matrix assuming four detections and two tracks.

```likeMatrix = [0.1 0.1 0.1; 0.1 0.3 0.2; 0.1 0.4 0.1; 0.1 0.6 0.1; 0.1 0.5 0.3];```

Generate three most probable events and obtain their normalized probabilities.

`[FJE,FJEProbs] = jpdaEvents(likeMatrix,3)`
```FJE = 4x3x3 logical array FJE(:,:,1) = 1 0 0 1 0 0 0 1 0 0 0 1 FJE(:,:,2) = 0 0 1 1 0 0 0 1 0 1 0 0 FJE(:,:,3) = 1 0 0 0 1 0 1 0 0 0 0 1 ```
```FJEProbs = 3×1 0.4286 0.2857 0.2857 ```

## Input Arguments

collapse all

Validation matrix, specified as an m-by-(n+1) matrix, where m is the number of detections within the 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 T0. The validation matrix is a binary matrix listing all possible detections-to-track associations. If it is possible to assign track Ti to detection Dj, then the (j, i+1) entry of the validation matrix is 1. Otherwise, the entry is 0.

Data Types: `logical`

Likelihood matrix, specified as an (m+1)-by-(n+1) matrix, where m is the number of detections within the cluster of a sensor scan, and n is the number of tracks maintained in the tracker. The likelihood 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 T0. The matrix uses the first row to account for the possibility that each track is not assigned to any detection, which can be referred to as "Detection 0" or D0 . The (j+1,i+1) element of the matrix represents the likelihood to assign track Ti to detection Dj.

Data Types: `logical`

Number of joint probabilistic events, specified as a positive integer.

Data Types: `logical`

## Output Arguments

collapse all

Feasible joint events, specified as an m-by-(n+1)-by-p array, where m is the number of detections within the 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`

Probabilities of feasible joint events, returned as a p-by-1 vector of nonnegative scalars. The summation of these scalars is equal to 1. The k-th element represents the probability of the k-th joint events (specified in the `FJE` output argument) normalized over the p feasible joint events.

Data Types: `logical`

collapse all

### Feasible Joint Events

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 T1 and T2 are actively maintained in the tracker, and each of them has its own validation gate. Since the detection D2 is in the intersection of the validation gates of both T1 and T2, the two tracks (T1 and T2) 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 T0. If detection Di is inside the validation gate of track Dj, 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{ }\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.

## References

[1] Zhou, Bin, and N. K. Bose. "Multitarget tracking in clutter: Fast algorithms for data association." IEEE Transactions on aerospace and electronic systems 29, no. 2 (1993): 352-363.

[2] Fisher, James L., and David P. Casasent. "Fast JPDA multitarget tracking algorithm." Applied optics 28, no. 2 (1989): 371-376.