# Difference between revisions of "Cookbook"

Line 60: | Line 60: | ||

==== Problem ==== | ==== Problem ==== | ||

− | One sometimes needs to define a family of functions depending on a set of parameters, | + | One sometimes needs to define a family of functions depending on a set of parameters, e.g., |

− | <math>f (x, y, z; a, b, c)</math> | + | |

+ | <math> f (x, y, z; a, b, c) </math> | ||

+ | |||

where | where | ||

− | <math>x, y, z</math> | + | |

+ | <math> x, y, z </math> | ||

denote a the variables on which the function operates and | denote a the variables on which the function operates and | ||

− | <math>a, b, c</math> | + | |

+ | <math> a, b, c </math> | ||

+ | |||

are the parameters used to chose one specific element of the family of functions. | are the parameters used to chose one specific element of the family of functions. | ||

For example, let's say we want to implement a function that given the spring constant | For example, let's say we want to implement a function that given the spring constant | ||

− | <math>k</math> and the initial elongation <math>x_0</math> of a | + | |

+ | <math> k </math> | ||

+ | |||

+ | and the initial elongation | ||

+ | |||

+ | <math> x_0 </math> | ||

+ | |||

+ | of a spring, computes the time evolution of the elongation | ||

+ | |||

+ | <math> x (t ; x_0, k) </math> | ||

+ | |||

+ | by solving the Cauchy problem | ||

+ | |||

+ | <math> x' = - k x\\ x(0) = x_0 </math> | ||

+ | |||

==== Solution ==== | ==== Solution ==== | ||

==== Discussion ==== | ==== Discussion ==== |

## Revision as of 08:51, 22 August 2012

An Octave cookbook. Each entry should go in a separate section and have the following subsection: problem, solution, discussion and maybe a see also.

## Structures

### Retrieve a field value from all entries in a struct array

#### Problem

You have a struct array with multiple fields, and you want to acess the value from a specific field from all elements. For example, you want to return the age from all patients in the following case:

samples = struct ("patient", {"Bob", "Kevin", "Bob" , "Andrew"}, "age", [ 45 , 52 , 45 , 23 ], "protein", {"H2B", "CDK2" , "CDK2", "Tip60" }, "tube" , [ 3 , 5 , 2 , 18 ] );

#### Solution

Indexing the struct returns a comma separated list so use them to create a matrix.

[samples(:).age]

This however does not keep the original structure of the data, instead returning all values in a single column. To fix this, use `reshape()`

.

reshape ([samples(:).age], size (samples))

#### Discussion

Returning all values in a comma separated lists allows you to make anything out of them. If numbers are expected, create a matrix by enclosing them in square brackets. But if strings are to be expected, a cell array can also be easily generated with curly brackets

{samples(:).name}

You are also not limited to return all elements, you may use logical indexing from other fields to get values from the others:

[samples([samples(:).age] > 34).tube] ## return tube numbers from all samples from patients older than 34 [samples(strcmp({samples(:).protein}, "CDK2").tube] ## return all tube numbers for protein CDK2

## Input/output

## Mathematics

### Find if a number is even/odd

#### Problem

You have a number, or an array or matrix of them, and want to know if any of them is an odd or even number, i.e., their parity.

#### Solution

Check the remainder of a division by two. If the remainder is zero, the number is odd.

mod (value, 2) ## 1 if odd, zero if even

Since `mod()`

acceps a matrix, the following can be done:

any (mod (values, 2)) ## true if at least one number in values is even all (mod (values, 2)) ## true if all numbers in values are odd any (!logical (mod (values, 2))) ## true if at least one number in values is even all (!logical (mod (values, 2))) ## true if all numbers in values are even

#### Discussion

Since we are checking for the remainder of a division, the first choice would be to use `rem()`

. However, in the case of negative numbers `mod()`

will still return a positive number making it easier for comparisons. Another alternative is to use `bitand (X, 1)`

or `bitget (X, 1)`

but those are a bit slower.

Note that this solution applies to integers only. Non-integers such as 1/2 or 4.201 are neither even nor odd. If the source of the numbers are unknown, such as user input, some sort of checking should be applied for NaN, Inf, or non-integer values.

#### See also

Find if a number is an integer.

## Parametrized Functions

#### Problem

One sometimes needs to define a family of functions depending on a set of parameters, e.g.,

where

denote a the variables on which the function operates and

are the parameters used to chose one specific element of the family of functions.

For example, let's say we want to implement a function that given the spring constant

and the initial elongation

of a spring, computes the time evolution of the elongation

by solving the Cauchy problem

**Failed to parse (syntax error): {\displaystyle x' = - k x\\ x(0) = x_0 }**