Cookbook: Difference between revisions

1,479 bytes added ,  21 August 2012
(→‎Input/output: new section)
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 ==
=== 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 pacients in the following case:
  cases(1).name        = "Bob";
  cases(1).age          = 45;
  cases(1).contaminated = true;
 
  cases(2).name        = "Andrew";
  cases(2).age          = 21;
  cases(2).contaminated = true;
 
  cases(2).name        = "Kevin";
  cases(2).age          = 24;
  cases(2).contaminated = false;
==== Solution ====
Indexing the struct returns a comma separated list so use them to create a matrix.
  [cases(:).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()}}.
  reshape ([cases(:).age], size (cases))
==== 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
  {cases(:).name}
You are also not limited to return all elements, you may use logical indexing from other fields to get values from others. The following example returns the contaminated state from all test cases older than 34
  [cases([cases(:).age] > 34).contaminated]


== Input/output ==
== Input/output ==