# Tips and tricks¶

## Advanced Matlab / Octave concepts¶

### Logical masking¶

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; my_masked_data=my_data(my_mask);

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] mask_at_least_12=my_data>12; mask_equal_13=my_data==13;

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.