# Documentation

## Create Arrays with usample

An extremely common manner in which to generate an array is to sample (in some of the uncertain elements) an uncertain object. Using the `ureal` objects `a` and `b` from above, create a 2-by-3 `umat`.

```M = [a b;b*b a/b;1-b 1+a*b] UMAT: 3 Rows, 2 Columns a: real, nominal = 4, variability = [-1 1], 3 occurrences b: real, nominal = 2, variability = [-1 1], 6 occurrences size(M) ans = 3 2 ```

Sample (at 20 random points within its range) the uncertain real parameter `b` in the matrix `M`. This results in a 3-by-2-by-20 `umat`, with only one uncertain element, `a` The uncertain element `b` of `M` has been "sampled out", leaving a new array dimension in its place.

```[Ms,bvalues] = usample(M,'b',20); Ms UMAT: 3 Rows, 2 Columns [array, 20 x 1] a: real, nominal = 4, variability = [-1 1], 2 occurrences size(Ms) ans = 3 2 20 ```

Continue sampling (at 15 random points within its range) the uncertain real parameter `a` in the matrix `Ms`. This results in a 3-by-2-by-20-by-15 `double`.

```[Mss,avalues] = usample(Ms,'a',15); size(Mss) ans = 3 2 20 15 class(Mss) ans = double ```

The above 2-step sequence can be performed in 1 step,

```[Mss,values] = usample(M,'b',20,'a',15); class(Mss) ans = double ```

In this case, `values` is a 20-by-15 struct array, with 2 fields `b` and `a`, whose values are the values used in the random sampling. It follows that `usubs(M,values)` is the same as `Mss`.

Rather than sampling the each variable (`a` and `b`) independently, generating a 20-by-15 grid in a 2-dimensional space, the two-dimensional space can be sampled. Sample the 2-dimensional space with 800 points,

```[Ms,values] = usample(M,{'a' 'b'},800); size(Ms) ans = 3 2 800 size(values) ans = 800 1 ```