# Vector Arguments in VML

Vector arguments of VML mathematical functions are passed in one-dimensional arrays with unit vector increment. It means that a vector of length n is passed contiguously in an array a whose values are defined as `a[0], a[1], ..., a[n-1]` (for the C interface).

To accommodate for arrays with other increments, or more complicated indexing, VML contains auxiliary pack/unpack functions that gather the array elements into a contiguous vector and then scatter them after the computation is complete.

Generally, if the vector elements are stored in a one-dimensional array a as

```a[m0], a[m1], ..., a[mn-1]
```

and need to be regrouped into an array y as

```y[k0], y[k1], ..., y[kn-1],
```

VML pack/unpack functions can use one of the following indexing methods:

## Positive Increment Indexing

```kj = incy * j, mj = inca * j, j = 0 ,..., n-1
```

Constraint: `incy > 0` and `inca > 0`.

For example, setting incy = 1 specifies gathering array elements into a contiguous vector.

This method is similar to that used in BLAS, with the exception that negative and zero increments are not permitted.

## Index Vector Indexing

```kj = iy[j], mj = ia[j], j = 0 ,..., n-1,
```

where ia and iy are arrays of length n that contain index vectors for the input and output arrays a and y, respectively.

Indices `kj` , `mj` are such that:
```my[kj] ≠ 0, ma[mj] ≠ 0 , j = 0,..., n-1,
where `ma` and `my` are arrays that contain mask vectors for the input and output arrays a and y, respectively.