Editing Cookbook
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
An Octave cookbook. Each entry should go in a separate section and have the following subsection: problem, solution, discussion and maybe a see also. | 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 == | == Structures == | ||
=== Retrieve a field value from all entries in a struct array === | === Retrieve a field value from all entries in a struct array === | ||
==== Problem ==== | ==== Problem ==== | ||
You have a struct array with multiple fields, and you want to | 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"}, | |||
samples = struct ("patient", {"Bob", "Kevin", "Bob" , "Andrew"}, | "age", [ 45 , 52 , 45 , 23 ], | ||
"protein", {"H2B", "CDK2" , "CDK2", "Tip60" }, | |||
"tube" , [ 3 , 5 , 2 , 18 ] | |||
); | |||
==== Solution ==== | ==== Solution ==== | ||
Indexing the struct returns a comma separated list so use them to create a matrix. | Indexing the struct returns a comma separated list so use them to create a matrix. | ||
[samples(:).age] | |||
[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 {{Codeline|reshape()}}. | This however does not keep the original structure of the data, instead returning all values in a single column. To fix this, use {{Codeline|reshape()}}. | ||
reshape ([samples(:).age], size (samples)) | |||
reshape ([samples(:).age], size (samples)) | |||
==== Discussion ==== | ==== 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} | |||
{samples(:). | |||
You are also not limited to return all elements, you may use logical indexing from other fields to get values from the others: | 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([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 | ||
[samples(strcmp({samples(:).protein}, "CDK2" | |||
== Input/output == | == Input/output == | ||
== Mathematics == | |||
=== | === Find if a number is even/odd === | ||
==== Problem ==== | ==== 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. | |||
You have | |||
==== Solution ==== | ==== 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 {{Codeline|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 ==== | ==== Discussion ==== | ||
Since we are checking for the remainder of a division, the first choice would be to use {{Codeline|rem()}}. However, in the case of negative numbers {{Codeline|mod()}} will still return a positive number making it easier for comparisons. Another alternative is to use {{Codeline|bitand (X, 1)}} or {{Codeline|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., | |||
<math> f (x, y, z; a, b, c) </math> | |||
where | |||
<math> x, y, z </math> | |||
denote a the variables on which the function operates and | |||
<math> a, b, c </math> | |||
are the parameters used to chose one specific element of the family of functions. | |||
For example, let's say we need to compute the time evolution of the elongation of | |||
a spring for different values of the spring constant | |||
<math> k </math> | |||
==== Solution ==== | ==== Solution ==== | ||
We could solve the problem with the following code | |||
{{Code|Solve spring equation for different values of the spring constant|<syntaxhighlight lang="octave" style="font-size:13px"> | |||
<syntaxhighlight lang=" | |||
t = linspace (0, 10, 100); | t = linspace (0, 10, 100); | ||
function sprime = spring (s, t, k) | function sprime = spring (s, t, k) | ||
Line 476: | Line 96: | ||
plot (t, x1, t, x2) | plot (t, x1, t, x2) | ||
legend ('x1', 'x2') | legend ('x1', 'x2') | ||
</syntaxhighlight> | </syntaxhighlight>}} | ||
[[File:solparfun.png]] | |||
[ | |||
==== Discussion ==== | ==== Discussion ==== | ||
In the above example, the function "sprime" represents a family of functions of | |||
the variables | |||
<math>x,t</math> | |||
parametrized by the parameter | |||
<math>k</math>. | |||
< | |||
</ | |||
The [http://www.gnu.org/software/octave/doc/interpreter/Anonymous-Functions.html#Anonymous-Functions anonympus function] | |||
<pre> | |||
@(x, t) sprime (x, t, k) | |||
</pre> | |||
is a function of only | |||
<math>x,t</math> | |||
where the parameter | |||
<math>k</math> | |||
is 'frozen' to the value it has at the moment in the current scope. | |||
== Plotting == | |||
== User input == |