# Tips and tricks¶

## Advanced Matlab / Octave concepts¶

A logical mask is an array of type `logical`, and can only contain values `true` and `false`.

For example,

```my_arr=[false, true,  true; ...
true,  false, false];
```

is an `2x3` array, and values in this array can be indexed as other (e.g. numeric, cell) arrays. For example,

```my_arr(:,3)
```

returns the array in the third colum, that is the `2x1` column vector `[true; false]`. Note that when showing a logical array, Matlab / Octave do not show `false` or `true` values, but `0` and `1` respectively. To see whether a variable `a` is a logical array, run `whos a`.

A logical array `a` can be used to index another array `b`, where the result of indexing is an array `c` that contains the elements of `b` only where `a` is equal to `true`. Thus, in this example

```my_mask=[false,true,true,false,true,false];
my_data=11:16;

```

the contents of `my_masked_data` is contains the elements of my_data at positions `2`, `3` and `5`, i.e. `my_masked_data=[12,13,15]`. Although it would be equivalent to use (what some may find more intuitive) `my_mask_data=my_data(find(my_mask))`, this expression is longer to write and takes a longer time to execute.

Logical arrays can be constructed with the comparison operators `<`, `<=`, `==`, `~=`, `>`, and `>=`; for example,

```my_data=[11:16, 13:15 9]
```

returns logical masks of the same size as `my_data` with values `true` where `my_data` is at least `12` (`[false, false, true, true, true, true, true, true, true, true, false]`) and equal to `13` (`[false, false, true, false, false, false, true, false, false, false]`), respectively.

Finally, the logical operators `~` (negation), `&` (element-wise logical-and), and `|` (element-wise logical-or) can be used as operators on two logical masks. Thus, in

```a=[false, true, false, true];
b=[false, false, true, true];
```

the expressions:

• `~a` has the value `true` where-ever the corresponding value in `a` is false: `[true, false, true, false]`.
• `a & b` has the value `true` where-ever the corresponding values in `a` and `b` are both `true`: `[false, false, false, true]`.
• `a | b` has the value `true` where-ever at least one of the corresponding values in `a` and `b` is `true`: `[false, true, true, true]`.

When using the logical operators `a & b` and `a | b`, it is required that `a` and `b` are of the same size.

### Function handles¶

CoSMoMVPA uses the function handle construct for improved modularity when using classifiers and measures. These are references to functions which can be assigned to a variable. The function can be called by calling the name of the variable with parentheses.

For example,

```do_magic = @sin;
```

means that

```y=do_magic(x)
```

is equivalent to

```y=sin(x)
```

When using this for measures,

```measure=@cosmo_crossvalidation_measure;
```

allows using different measures (i.e. functions) by just changing one line of code, for example to

```measure=@my_awesome_measure;
```

which allows reusing code for future analyses and analysis methods. This concept is key not only for measures but also for searchlight analyses. For example, given a suitable neighborhood `nbrhood` and measure options `opt`,

```measure=@cosmo_correlation_measure;
ds_corr=cosmo_searchlight(ds,nh,measure,opt);
```

computes a split-half correlation searchlight map; changing only the top line (and with suitable measure options in `opt`),

```measure=@cosmo_crossvalidation_measure;
ds_corr=cosmo_searchlight(ds,nh,measure,opt);
```

computes a classification accuracy searchlight map - just by changing the function handle (and the associated measure options in `opt`). Importantly, the same neighborhood structure and the same searchlight code is used in both cases.

For more information about function handles, run in Matlab: `help function_handle`

## General tips and tricks¶

Here is a short list of tips and tricks that may make life easier when using CoSMoMVPA.

• Use cosmo disp to show the contents of a dataset structure (or any other data structure)
• Use `help cosmo_function` to view the help contents of a function. Most functions have an `example` section which shows how the function can be used.
• Use cosmo check dataset when manually changing contents of a dataset structure. It will catch basic errors in dataset
• Use cosmo check partitions when manually creating partitions.
• When slicing datasets, often cosmo match can be used to get logical masks that match a (array of) numbers of strings.
• For feature selection in MEEG datasets (in particular, selection over time), consider cosmo dim match and cosmo dim prune.