# FLCC documentation

The FastLocalCorrelationCoefficients package exports the following functions

`FastLocalCorrelationCoefficients.best_correlated`

`FastLocalCorrelationCoefficients.flcc`

`FastLocalCorrelationCoefficients.lcc`

`FastLocalCorrelationCoefficients.best_correlated`

— Method` best_correlated(c::Array)`

Locate the position of the element with the maximum local correlation value.

`FastLocalCorrelationCoefficients.flcc`

— Method` flcc(haystack,needle)`

Calculate the local (Pearson) correlation coefficients

$\mathrm{lcc}(x,y) = \frac{(x - \mu_x)^T(y - \mu_y)}{\sigma_x \sigma_y}$

between `needle`

and all sliding windows of same size within `haystack`

.

`flcc`

uses the fast Fourier transform to reduce the computational complexity from O($n_H n_N$) to O(($n_H + n_N) log(n_H + n_N)$), where $n_H$ and $n_N$ are the number of elements of the `haystack`

and the `needle`

, respectively.

`flcc`

supports tensors of any dimensions with real or complex entries.

**Examples**

Suppose you have a `haystack`

, a tensor of reals and a `needle`

, a smaller tensor of the same dimensionality that you are are trying to locate in the `haystack`

. Note that the `needle`

might be scaled and translated.

The position of the maximum element of `LCC`

is the best match between the `needle`

and a sliding window of `haystack`

```
julia> using FastLocalCorrelationCoefficients
julia> haystack = rand(2^10,2^10);
julia> needle = rand(1) .* haystack[42:48, 45:50] .+ rand(1);
julia> c = flcc(haystack,needle);
julia> best_correlated(c)
CartesianIndex(42, 45)
```

When you need to search for many needles of the same size,

```
haystack = rand(2^20);
needle1 = rand(1) .* haystack[2:8] .+ rand(1);
needle2 = rand(1) .* haystack[42:48] .+ rand(1);
needle3 = rand(1) .* haystack[end-6:end] .+ rand(1);
```

you can preprocess the `haystack`

to avoid redundant computations by precomputing all common information. There is no such preprocessing when using the direct method.

```
precomp = flcc(haystack,size(needle1));
```

Then use it for much faster queries.

```
best_correlated(flcc(precomp,needle1)) == 2
best_correlated(flcc(precomp,needle2)) == 42
best_correlated(flcc(precomp,needle3)) == 2^20-6
```

`FastLocalCorrelationCoefficients.lcc`

— Method` lcc(haystack,needle)`

Calculate the local (Pearson) correlation coefficients between a `needle`

and a sliding window within `haystack`

, directly.

**Example**

Suppose you have a `haystack`

, a tensor of reals and a `needle`

, a smaller tensor of the same dimensionality that you are are trying to locate in the `haystack`

. Note that the `needle`

might be scaled and translated.

The position of the maximum LCC is the best match between the `needle`

and a sliding window of `haystack`

```
julia> using FastLocalCorrelationCoefficients
julia> haystack = rand(2^10,2^10);
julia> needle = rand(1) .* haystack[42:47, 45:50] .+ rand(1);
julia> c = lcc(haystack,needle);
julia> best_correlated(c)
CartesianIndex(42, 45)
```