# 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.