comparison doc/interpreter/external.txi @ 16867:be41c30bcb44

Re-write documentation and all examples of dynamically linked functions. * doc/interpreter/dynamic.txi: deleted. * doc/interpreter/external.txi: Renamed from dynamic.txi. Rewrote or added much information about dynamically linked functions. * doc/interpreter/Makefile.am: Changed dynamic.txi to external.txi in build system. * doc/interpreter/data.txi, doc/interpreter/intro.txi, doc/interpreter/octave.texi, doc/interpreter/sparse.txi: Changed dynamic.txi to external.txi in cross-references. * doc/interpreter/doccheck/aspell-octave.en.pws: Added new words from external.txi to Octave dictionary. * examples/firstmexdemo.c: deleted. * examples/mex_demo.c: Renamed from firstmexdemo.c. Added many more comments to code. * examples/hello.cc: deleted. * examples/oct_demo.cc: Renamed from hello.cc. Added many more comments to code. * examples/Makefile.am: Changed build system to use mex_demo.c and oct_demo.cc. * examples/addtwomatrices.cc, examples/celldemo.cc, examples/embedded.cc, examples/fortdemo.cc, examples/funcdemo.cc, examples/globaldemo.cc, examples/helloworld.cc, examples/mycell.c, examples/myfeval.c, examples/myfunc.c, examples/myhello.c, examples/mypow2.c, examples/myprop.c, examples/myset.c, examples/mysparse.c, examples/mystring.c, examples/mystruct.c, examples/paramdemo.cc, examples/standalone.cc, examples/stringdemo.cc, examples/structdemo.cc, examples/unwinddemo.cc: Use Octave coding conventions for code. Fixed all compilation errors and warnings.
author Rik <rik@octave.org>
date Sat, 29 Jun 2013 18:08:24 -0700
parents doc/interpreter/dynamic.txi@fcf1b0b52083
children e7a059a9a644
comparison
equal deleted inserted replaced
16866:a472bfc67b6c 16867:be41c30bcb44
1 @c Copyright (C) 2007-2012 John W. Eaton and David Bateman
2 @c Copyright (C) 2007 Paul Thomas and Christoph Spiel
3 @c
4 @c This file is part of Octave.
5 @c
6 @c Octave is free software; you can redistribute it and/or modify it
7 @c under the terms of the GNU General Public License as published by the
8 @c Free Software Foundation; either version 3 of the License, or (at
9 @c your option) any later version.
10 @c
11 @c Octave is distributed in the hope that it will be useful, but WITHOUT
12 @c ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 @c FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 @c for more details.
15 @c
16 @c You should have received a copy of the GNU General Public License
17 @c along with Octave; see the file COPYING. If not, see
18 @c <http://www.gnu.org/licenses/>.
19
20 @node External Code Interface
21 @appendix External Code Interface
22 @cindex dynamic-linking
23 @cindex Dynamically Linked Functions
24 @cindex Octave API
25
26 “The sum of human wisdom is not contained in any one language"
27 ---Ezra Pound
28
29 Octave is a fantastic language for solving many problems in science and
30 engineering. However, it is not the only computer language and there
31 are times when you may want to use code written in other languages.
32 Good reasons for doing so include: 1) not re-inventing the wheel; existing
33 function libraries which have been thoroughly tested and debugged or
34 large scale simulation codebases are a good example, 2) accessing unique
35 capabilities of a different language; for example the well-known regular
36 expression functions of Perl (but don't do that because @code{regexp}
37 already exists in Octave).
38
39 Performance should generally @strong{not} be a reason for using compiled
40 extensions. Although compiled extensions can run faster, particularly
41 if they replace a loop in Octave code, this is almost never the best path
42 to take. First, there are many techniques to speed up Octave performance while
43 remaining within the language. Second, Octave is a high-level language that
44 makes it easy to perform common mathematical tasks. Giving that up means
45 shifting the focus from solving the real problem to solving a computer
46 programming problem. It means returning to low-level constructs such as
47 pointers, memory management, mathematical overflow/underflow, etc. Because
48 of the low level nature, and the fact that the compiled code is executed outside
49 of Octave, there is the very real possibility of crashing the interpreter and
50 losing work.
51
52 Before going further, you should first determine if you really need to bother
53 writing code outside of Octave.
54
55 @itemize @bullet
56 @item
57 Can I get the same functionality using the Octave scripting language alone?
58
59 Even when a function already exists outside the language, it may be
60 better to simply reproduce the behavior in an m-file rather than attempt to
61 interface to the outside code.
62
63 @item
64 Is the code thoroughly optimized for Octave?
65
66 If performance is an issue you should always start with the in-language
67 techniques for getting better performance. Chief among these is vectorization
68 (@pxref{Vectorization and Faster Code Execution}) which not only makes the
69 code concise and more understandable but improves performance (10X-100X).
70 If loops must be used, make sure that the allocation of space for variables
71 takes place outside the loops using an assignment to a matrix of the right
72 size, or zeros.
73
74 @item
75 Does the code make as much use as possible of existing built-in library
76 routines?
77
78 These routines are highly optimized and many do not carry the overhead
79 of being interpreted.
80
81 @item
82 Does writing a dynamically linked function represent a useful investment
83 of your time, relative to staying in Octave?
84
85 It will take time to learn Octave's interface for external code and
86 there will inevitably be issues with tools such as compilers.
87 @end itemize
88
89 With that said, Octave offers a versatile interface for including chunks
90 of compiled code as dynamically linked extensions. These dynamically linked
91 functions can be called from the interpreter in the same manner as any
92 ordinary function. The interface is bi-directional and external code can
93 call Octave functions (like @code{plot}) which otherwise might be very
94 difficult to develop.
95
96 The interface is centered around supporting the languages C++, C, and Fortran.
97 Octave itself is written in C++ and can call external C++/C code through its
98 native oct-file interface. The C language is also supported through the
99 mex-file interface for compatibility with @sc{matlab}. Fortran code is easiest
100 to reach through the oct-file interface.
101
102 Because many other languages provide C or C++ APIs it is relatively simple
103 to build bridges between Octave and other languages. This is also a way to
104 bridge to hardware resources which often have device drivers written in C.
105
106 @menu
107 * Oct-Files::
108 * Mex-Files::
109 * Standalone Programs::
110 @end menu
111
112 @node Oct-Files
113 @section Oct-Files
114 @cindex oct-files
115 @cindex mkoctfile
116 @cindex oct
117
118 @menu
119 * Getting Started with Oct-Files::
120 * Matrices and Arrays in Oct-Files::
121 * Character Strings in Oct-Files::
122 * Cell Arrays in Oct-Files::
123 * Structures in Oct-Files::
124 * Sparse Matrices in Oct-Files::
125 * Accessing Global Variables in Oct-Files::
126 * Calling Octave Functions from Oct-Files::
127 * Calling External Code from Oct-Files::
128 * Allocating Local Memory in Oct-Files::
129 * Input Parameter Checking in Oct-Files::
130 * Exception and Error Handling in Oct-Files::
131 * Documentation and Test of Oct-Files::
132 @c * Application Programming Interface for Oct-Files::
133 @end menu
134
135 @node Getting Started with Oct-Files
136 @subsection Getting Started with Oct-Files
137
138 Oct-files are pieces of C++ code that have been compiled with the Octave
139 API into a dynamically loadable object. They take their name from the file
140 which contains the object which has the extension @file{.oct}.
141
142 Finding a C++ compiler, using the correct switches, adding the right include
143 paths for header files, etc. is a difficult task. Octave automates this by
144 providing the @code{mkoctfile} command with which to build oct-files. The
145 command is available from within Octave or at the shell command line.
146
147 @DOCSTRING(mkoctfile)
148
149 Consider the following short example which introduces the basics of
150 writing a C++ function that can be linked to Octave.
151
152 @example
153 @group
154 @EXAMPLEFILE(helloworld.cc)
155 @end group
156 @end example
157
158 The first critical line is @code{#include <octave/oct.h>} which
159 makes available most of the definitions necessary for a C++ oct-file.
160 Note that @file{octave/oct.h} is a C++ header and cannot be directly
161 @code{#include}'ed in a C source file, nor any other language.
162
163 Included by @file{oct.h} is a definition for the macro
164 @w{@code{DEFUN_DLD}} which creates a dynamically loaded function. This
165 macro takes four arguments:
166
167 @enumerate 1
168 @item The function name as it will be seen in Octave,
169
170 @item The list of arguments to the function of type @code{octave_value_list},
171
172 @item The number of output arguments, which can and often is omitted if
173 not used, and
174
175 @item The string to use for the help text of the function.
176 @end enumerate
177
178 The return type of functions defined with @w{@code{DEFUN_DLD}} is always
179 @code{octave_value_list}.
180
181 There are a couple of important considerations in the choice of function
182 name. First, it must be a valid Octave function name and so must be a
183 sequence of letters, digits, and underscores not starting with a
184 digit. Second, as Octave uses the function name to define the filename
185 it attempts to find the function in, the function name in the
186 @w{@code{DEFUN_DLD}} macro must match the filename of the oct-file. Therefore,
187 the above function should be in a file @file{helloworld.cc}, and would be
188 compiled to an oct-file using the command
189
190 @example
191 mkoctfile helloworld.cc
192 @end example
193
194 This will create a file called @file{helloworld.oct} that is the compiled
195 version of the function. It should be noted that it is perfectly
196 acceptable to have more than one @w{@code{DEFUN_DLD}} function in a source
197 file. However, there must either be a symbolic link to the oct-file for
198 each of the functions defined in the source code with the @w{@code{DEFUN_DLD}}
199 macro or the @code{autoload} (@ref{Function Files}) function should be used.
200
201 The rest of the function shows how to find the number of input arguments,
202 how to print through the Octave pager, and return from the function. After
203 compiling this function as above, an example of its use is
204
205 @example
206 @group
207 helloworld (1, 2, 3)
208 @print{} Hello World has 3 input arguments and 0 output arguments.
209 @end group
210 @end example
211
212 Subsequent sections show how to use specific classes from Octave's core
213 internals. Base classes like dMatrix (a matrix of double values) are
214 found in the directory @file{liboctave/array}. The definitive reference for
215 how to use a particular class is the header file itself. However, it is
216 often enough just to study the examples in the manual in order to be able
217 to use the class.
218
219 @node Matrices and Arrays in Oct-Files
220 @subsection Matrices and Arrays in Oct-Files
221
222 Octave supports a number of different array and matrix classes, the
223 majority of which are based on the Array class. The exception is the
224 sparse matrix types discussed separately below. There are three basic
225 matrix types
226
227 @table @code
228 @item Matrix
229 A double precision matrix class defined in @file{dMatrix.h},
230
231 @item ComplexMatrix
232 A complex matrix class defined in @file{CMatrix.h}, and
233
234 @item BoolMatrix
235 A boolean matrix class defined in @file{boolMatrix.h}.
236 @end table
237
238 These are the basic two-dimensional matrix types of Octave. In
239 addition there are a number of multi-dimensional array types including
240
241 @table @code
242 @item NDArray
243 A double precision array class defined in @file{dNDArray.h}
244
245 @item ComplexNDarray
246 A complex array class defined in @file{CNDArray.h}
247
248 @item boolNDArray
249 A boolean array class defined in @file{boolNDArray.h}
250
251 @item int8NDArray
252 @itemx int16NDArray
253 @itemx int32NDArray
254 @itemx int64NDArray
255 8, 16, 32, and 64-bit signed array classes defined in
256 @file{int8NDArray.h}, @file{int16NDArray.h}, etc.
257
258 @item uint8NDArray
259 @itemx uint16NDArray
260 @itemx uint32NDArray
261 @itemx uint64NDArray
262 8, 16, 32, and 64-bit unsigned array classes defined in
263 @file{uint8NDArray.h}, @file{uint16NDArray.h}, etc.
264 @end table
265
266 There are several basic ways of constructing matrices or
267 multi-dimensional arrays. Using the class @code{Matrix} as an example
268 one can
269
270 @itemize @bullet
271 @item
272 Create an empty matrix or array with the empty constructor. For example:
273
274 @example
275 Matrix a;
276 @end example
277
278 This can be used for all matrix and array types.
279
280 @item
281 Define the dimensions of the matrix or array with a dim_vector which has
282 the same characteristics as the vector returned from @code{size}. For example:
283
284 @example
285 @group
286 dim_vector dv (2);
287 dv(0) = 2; dv(1) = 3; // 2 rows, 3 columns
288 Matrix a (dv);
289 @end group
290 @end example
291
292 This can be used on all matrix and array types.
293
294 @item
295 Define the number of rows and columns in the matrix. For example:
296
297 @example
298 Matrix a (2, 2)
299 @end example
300
301 However, this constructor can only be used with matrix types.
302 @end itemize
303
304 These types all share a number of basic methods and operators. Many bear
305 a resemblance to functions that exist in the interpreter. A selection of
306 useful methods include
307
308 @deftypefn Method T& {operator ()} (octave_idx_type)
309 @deftypefnx Method T& elem (octave_idx_type)
310 The @code{()} operator or @code{elem} method allow the values of the
311 matrix or array to be read or set. These can take a single argument,
312 which is of type @code{octave_idx_type}, that is the index into the matrix or
313 array. Additionally, the matrix type allows two argument versions of the
314 @code{()} operator and elem method, giving the row and column index of the
315 value to obtain or set.
316 @end deftypefn
317
318 Note that these functions do significant error checking and so in some
319 circumstances the user might prefer to access the data of the array or
320 matrix directly through the @nospell{fortran_vec} method discussed below.
321
322 @deftypefn Method octave_idx_type numel (void) const
323 The total number of elements in the matrix or array.
324 @end deftypefn
325
326 @deftypefn Method size_t byte_size (void) const
327 The number of bytes used to store the matrix or array.
328 @end deftypefn
329
330 @deftypefn Method dim_vector dims (void) const
331 The dimensions of the matrix or array in value of type dim_vector.
332 @end deftypefn
333
334 @deftypefn Method int ndims (void) const
335 The number of dimensions of the matrix or array. Matrices are 2-D,
336 but arrays can be N-dimensional.
337 @end deftypefn
338
339 @deftypefn Method void resize (const dim_vector&)
340 A method taking either an argument of type @code{dim_vector}, or in the
341 case of a matrix two arguments of type @code{octave_idx_type} defining
342 the number of rows and columns in the matrix.
343 @end deftypefn
344
345 @deftypefn Method T* fortran_vec (void)
346 This method returns a pointer to the underlying data of the matrix or
347 array so that it can be manipulated directly, either within Octave or by
348 an external library.
349 @end deftypefn
350
351 Operators such an @code{+}, @code{-}, or @code{*} can be used on the
352 majority of the matrix and array types. In addition there are a number of
353 methods that are of interest only for matrices such as @code{transpose},
354 @code{hermitian}, @code{solve}, etc.
355
356 The typical way to extract a matrix or array from the input arguments of
357 @w{@code{DEFUN_DLD}} function is as follows
358
359 @example
360 @group
361 @EXAMPLEFILE(addtwomatrices.cc)
362 @end group
363 @end example
364
365 To avoid segmentation faults causing Octave to abort this function
366 explicitly checks that there are sufficient arguments available before
367 accessing these arguments. It then obtains two multi-dimensional arrays
368 of type @code{NDArray} and adds these together. Note that the array_value
369 method is called without using the @code{is_matrix_type} type, and instead the
370 error_state is checked before returning @code{A + B}. The reason to
371 prefer this is that the arguments might be a type that is not an
372 @code{NDArray}, but it would make sense to convert it to one. The
373 @code{array_value} method allows this conversion to be performed
374 transparently if possible, and sets @code{error_state} if it is not.
375
376 @code{A + B}, operating on two @code{NDArray}'s returns an
377 @code{NDArray}, which is cast to an @code{octave_value} on the return
378 from the function. An example of the use of this demonstration function is
379
380 @example
381 @group
382 addtwomatrices (ones (2, 2), eye (2, 2))
383 @result{} 2 1
384 1 2
385 @end group
386 @end example
387
388 A list of the basic @code{Matrix} and @code{Array} types, the methods to
389 extract these from an @code{octave_value}, and the associated header file is
390 listed below.
391
392 @multitable @columnfractions .3 .4 .3
393 @headitem Type @tab Function @tab Source Code
394 @item @code{RowVector} @tab @code{row_vector_value} @tab @file{dRowVector.h}
395 @item @code{ComplexRowVector} @tab @code{complex_row_vector_value} @tab @file{CRowVector.h}
396 @item @code{ColumnVector} @tab @code{column_vector_value} @tab @file{dColVector.h}
397 @item @code{ComplexColumnVector} @tab @code{complex_column_vector_value} @tab @file{CColVector.h}
398 @item @code{Matrix} @tab @code{matrix_value} @tab @file{dMatrix.h}
399 @item @code{ComplexMatrix} @tab @code{complex_matrix_value} @tab @file{CMatrix.h}
400 @item @code{boolMatrix} @tab @code{bool_matrix_value} @tab @file{boolMatrix.h}
401 @item @code{charMatrix} @tab @code{char_matrix_value} @tab @file{chMatrix.h}
402 @item @code{NDArray} @tab @code{array_value} @tab @file{dNDArray.h}
403 @item @code{ComplexNDArray} @tab @code{complex_array_value} @tab @file{CNDArray.h}
404 @item @code{boolNDArray} @tab @code{bool_array_value} @tab @file{boolNDArray.h}
405 @item @code{charNDArray} @tab @code{char_array_value} @tab @file{charNDArray.h}
406 @item @code{int8NDArray} @tab @code{int8_array_value} @tab @file{int8NDArray.h}
407 @item @code{int16NDArray} @tab @code{int16_array_value} @tab @file{int16NDArray.h}
408 @item @code{int32NDArray} @tab @code{int32_array_value} @tab @file{int32NDArray.h}
409 @item @code{int64NDArray} @tab @code{int64_array_value} @tab @file{int64NDArray.h}
410 @item @code{uint8NDArray} @tab @code{uint8_array_value} @tab @file{uint8NDArray.h}
411 @item @code{uint16NDArray} @tab @code{uint16_array_value} @tab @file{uint16NDArray.h}
412 @item @code{uint32NDArray} @tab @code{uint32_array_value} @tab @file{uint32NDArray.h}
413 @item @code{uint64NDArray} @tab @code{uint64_array_value} @tab @file{uint64NDArray.h}
414 @end multitable
415
416 @node Character Strings in Oct-Files
417 @subsection Character Strings in Oct-Files
418
419 A character string in Octave is just a special @code{Array} class.
420 Consider the example:
421
422 @example
423 @EXAMPLEFILE(stringdemo.cc)
424 @end example
425
426 An example of the use of this function is
427
428 @example
429 @group
430 s0 = ["First String"; "Second String"];
431 [s1,s2] = stringdemo (s0)
432 @result{} s1 = Second String
433 First String
434
435 @result{} s2 = First String
436 Second String
437
438 typeinfo (s2)
439 @result{} sq_string
440 typeinfo (s1)
441 @result{} string
442 @end group
443 @end example
444
445 One additional complication of strings in Octave is the difference
446 between single quoted and double quoted strings. To find out if an
447 @code{octave_value} contains a single or double quoted string use
448 one of the predicate tests shown below.
449
450 @example
451 @group
452 if (args(0).is_sq_string ())
453 octave_stdout << "First argument is a single quoted string\n";
454 else if (args(0).is_dq_string ())
455 octave_stdout << "First argument is a double quoted string\n";
456 @end group
457 @end example
458
459 Note, however, that both types of strings are represented by the
460 @code{charNDArray} type, and so when assigning to an
461 @code{octave_value}, the type of string should be specified. For example:
462
463 @example
464 @group
465 octave_value_list retval;
466 charNDArray c;
467 @dots{}
468 // Create single quoted string
469 retval(1) = octave_value (ch); // default constructor is sq_string
470 OR
471 retval(1) = octave_value (ch, '\''); // explicitly create sq_string
472
473 // Create a double quoted string
474 retval(0) = octave_value (ch, '"');
475 @end group
476 @end example
477
478 @node Cell Arrays in Oct-Files
479 @subsection Cell Arrays in Oct-Files
480
481 Octave's cell type is also available from within oct-files. A cell
482 array is just an array of @code{octave_value}s, and thus each element of the
483 cell array can be treated just like any other @code{octave_value}. A simple
484 example is
485
486 @example
487 @group
488 @EXAMPLEFILE(celldemo.cc)
489 @end group
490 @end example
491
492 Note that cell arrays are used less often in standard oct-files and so
493 the @file{Cell.h} header file must be explicitly included. The rest of the
494 example extracts the @code{octave_value}s one by one from the cell array and
495 returns them as individual return arguments. For example:
496
497 @example
498 @group
499 [b1, b2, b3] = celldemo (@{1, [1, 2], "test"@})
500 @result{}
501 b1 = 1
502 b2 =
503
504 1 2
505
506 b3 = test
507 @end group
508 @end example
509
510 @node Structures in Oct-Files
511 @subsection Structures in Oct-Files
512
513 A structure in Octave is a map between a number of fields represented and
514 their values. The Standard Template Library @code{map} class is used,
515 with the pair consisting of a @code{std::string} and an Octave
516 @code{Cell} variable.
517
518 A simple example demonstrating the use of structures within oct-files is
519
520 @example
521 @EXAMPLEFILE(structdemo.cc)
522 @end example
523
524 An example of its use is
525
526 @example
527 @group
528 x.a = 1; x.b = "test"; x.c = [1, 2];
529 structdemo (x, "b")
530 @result{} selected = test
531 @end group
532 @end example
533
534 The example above specifically uses the @code{octave_scalar_map} class which
535 is for representing a single struct. For structure arrays the
536 @code{octave_map} class is used instead. The commented code shows how the
537 demo could be modified to handle a structure array. In that case the
538 @code{contents} method returns a @code{Cell} which may have more than one
539 element. Therefore, to obtain the underlying @code{octave_value} in
540 this single-struct example we write
541
542 @example
543 octave_value tmp = arg0.contents (arg1)(0);
544 @end example
545
546 @noindent
547 where the trailing (0) is the () operator on the @code{Cell} object. If
548 this were a true structure array with multiple elements we could iterate
549 over the elements using the () operator.
550
551 Structures are a relatively complex data container and there are more
552 functions available in @file{oct-map.h} which make coding with them easier
553 than relying on just @code{contents}.
554
555 @node Sparse Matrices in Oct-Files
556 @subsection Sparse Matrices in Oct-Files
557
558 There are three classes of sparse objects that are of interest to the user.
559
560 @table @code
561 @item SparseMatrix
562 A double precision sparse matrix class
563
564 @item SparseComplexMatrix
565 A complex sparse matrix class
566
567 @item SparseBoolMatrix
568 A boolean sparse matrix class
569 @end table
570
571 All of these classes inherit from the @code{Sparse<T>} template class,
572 and so all have similar capabilities and usage. The @code{Sparse<T>}
573 class was based on Octave's @code{Array<T>} class, and so users familiar
574 with Octave's @code{Array} classes will be comfortable with the use of
575 the sparse classes.
576
577 The sparse classes will not be entirely described in this section, due
578 to their similarity with the existing @code{Array} classes. However,
579 there are a few differences due the different nature of sparse objects,
580 and these will be described. First, although it is fundamentally
581 possible to have N-dimensional sparse objects, the Octave sparse classes do
582 not allow them at this time; All instances of the sparse classes
583 must be 2-dimensional. This means that @code{SparseMatrix} is actually
584 more similar to Octave's @code{Matrix} class than its @code{NDArray} class.
585
586 @menu
587 * Array and Sparse Differences::
588 * Creating Sparse Matrices in Oct-Files::
589 * Using Sparse Matrices in Oct-Files::
590 @end menu
591
592 @node Array and Sparse Differences
593 @subsubsection The Differences between the Array and Sparse Classes
594
595 The number of elements in a sparse matrix is considered to be the number
596 of non-zero elements rather than the product of the dimensions. Therefore
597
598 @example
599 @group
600 SparseMatrix sm;
601 @dots{}
602 int nel = sm.nelem ();
603 @end group
604 @end example
605
606 @noindent
607 returns the number of non-zero elements. If the user really requires the
608 number of elements in the matrix, including the non-zero elements, they
609 should use @code{numel} rather than @code{nelem}. Note that for very
610 large matrices, where the product of the two dimensions is larger than
611 the representation of an unsigned int, then @code{numel} can overflow.
612 An example is @code{speye (1e6)} which will create a matrix with a million
613 rows and columns, but only a million non-zero elements. Therefore the
614 number of rows by the number of columns in this case is more than two
615 hundred times the maximum value that can be represented by an unsigned int.
616 The use of @code{numel} should therefore be avoided useless it is known
617 it won't overflow.
618
619 Extreme care must be take with the elem method and the "()" operator,
620 which perform basically the same function. The reason is that if a
621 sparse object is non-const, then Octave will assume that a
622 request for a zero element in a sparse matrix is in fact a request
623 to create this element so it can be filled. Therefore a piece of
624 code like
625
626 @example
627 @group
628 SparseMatrix sm;
629 @dots{}
630 for (int j = 0; j < nc; j++)
631 for (int i = 0; i < nr; i++)
632 std::cerr << " (" << i << "," << j << "): " << sm(i,j) << std::endl;
633 @end group
634 @end example
635
636 @noindent
637 is a great way of turning the sparse matrix into a dense one, and a
638 very slow way at that since it reallocates the sparse object at each
639 zero element in the matrix.
640
641 An easy way of preventing the above from happening is to create a temporary
642 constant version of the sparse matrix. Note that only the container for
643 the sparse matrix will be copied, while the actual representation of the
644 data will be shared between the two versions of the sparse matrix. So this
645 is not a costly operation. For example, the above would become
646
647 @example
648 @group
649 SparseMatrix sm;
650 @dots{}
651 const SparseMatrix tmp (sm);
652 for (int j = 0; j < nc; j++)
653 for (int i = 0; i < nr; i++)
654 std::cerr << " (" << i << "," << j << "): " << tmp(i,j) << std::endl;
655 @end group
656 @end example
657
658 Finally, as the sparse types aren't represented by a contiguous
659 block of memory, the @nospell{@code{fortran_vec}} method of the @code{Array<T>}
660 is not available. It is, however, replaced by three separate methods
661 @code{ridx}, @code{cidx} and @code{data}, that access the raw compressed
662 column format that Octave sparse matrices are stored in. These methods can be
663 used in a manner similar to @code{elem} to allow the matrix to be accessed or
664 filled. However, in that case it is up to the user to respect the sparse
665 matrix compressed column format.
666
667 @node Creating Sparse Matrices in Oct-Files
668 @subsubsection Creating Sparse Matrices in Oct-Files
669
670 There are several useful alternatives for creating a sparse matrix.
671 The first is to create three vectors representing the row index, column index,
672 and data values, and from these create the matrix.
673 The second alternative is to create a sparse matrix with the appropriate
674 amount of space and then fill in the values. Both techniques have their
675 advantages and disadvantages.
676
677 Below is an example of creating a small sparse matrix using the first
678 technique
679
680 @example
681 @group
682 int nz = 4, nr = 3, nc = 4;
683
684 ColumnVector ridx (nz);
685 ColumnVector cidx (nz);
686 ColumnVector data (nz);
687
688 ridx(0) = 0; cidx(0) = 0; data(0) = 1;
689 ridx(1) = 0; cidx(1) = 1; data(1) = 2;
690 ridx(2) = 1; cidx(2) = 3; data(2) = 3;
691 ridx(3) = 2; cidx(3) = 3; data(3) = 4;
692 SparseMatrix sm (data, ridx, cidx, nr, nc);
693 @end group
694 @end example
695
696 @noindent
697 which creates the matrix given in section
698 @ref{Storage of Sparse Matrices}. Note that the compressed matrix
699 format is not used at the time of the creation of the matrix itself,
700 but is used internally.
701
702 As discussed in the chapter on Sparse Matrices, the values of the sparse
703 matrix are stored in increasing column-major ordering. Although the data
704 passed by the user need not respect this requirement, pre-sorting the
705 data will significantly speed up creation of the sparse matrix.
706
707 The disadvantage of this technique for creating a sparse matrix is
708 that there is a brief time when two copies of the data exist. For
709 extremely memory constrained problems this may not be the best
710 technique for creating a sparse matrix.
711
712 The alternative is to first create a sparse matrix with the desired
713 number of non-zero elements and then later fill those elements in.
714 Sample code:
715
716 @example
717 @group
718 int nz = 4, nr = 3, nc = 4;
719 SparseMatrix sm (nr, nc, nz);
720 sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4;
721 @end group
722 @end example
723
724 This creates the same matrix as previously. Again, although not
725 strictly necessary, it is significantly faster if the sparse matrix is
726 created and the elements are added in column-major ordering. The reason
727 for this is that when elements are inserted at the end of the current list
728 of known elements then no element in the matrix needs to be moved to allow
729 the new element to be inserted; Only the column indexes need to be updated.
730
731 There are a few further points to note about this method of creating
732 a sparse matrix. First, it is possible to create a sparse matrix
733 with fewer elements than are actually inserted in the matrix. Therefore,
734
735 @example
736 @group
737 int nz = 4, nr = 3, nc = 4;
738 SparseMatrix sm (nr, nc, 0);
739 sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4;
740 @end group
741 @end example
742
743 @noindent
744 is perfectly valid. However, it is a very bad idea because as each new
745 element is added to the sparse matrix the matrix needs to request more
746 space and reallocate memory. This is an expensive operation, that will
747 significantly slow this means of creating a sparse matrix. Furthermore,
748 it is possible to create a sparse matrix with too much storage, so having
749 @var{nz} greater than 4 is also valid. The disadvantage is that the matrix
750 occupies more memory than strictly needed.
751
752 It is not always possible to know the number of non-zero elements prior
753 to filling a matrix. For this reason the additional unused storage of
754 a sparse matrix can be removed after its creation with the
755 @code{maybe_compress} function. In addition, @code{maybe_compress} can
756 deallocate the unused storage, but it can also remove zero elements
757 from the matrix. The removal of zero elements from the matrix is
758 controlled by setting the argument of the @code{maybe_compress} function
759 to be @code{true}. However, the cost of removing the zeros is high because it
760 implies re-sorting the elements. If possible, it is better
761 if the user does not add the unnecessary zeros in the first place.
762 An example of the use of @code{maybe_compress} is
763
764 @example
765 @group
766 int nz = 6, nr = 3, nc = 4;
767
768 SparseMatrix sm1 (nr, nc, nz);
769 sm1(0,0) = 1; sm1(0,1) = 2; sm1(1,3) = 3; sm1(2,3) = 4;
770 sm1.maybe_compress (); // No zero elements were added
771
772 SparseMatrix sm2 (nr, nc, nz);
773 sm2(0,0) = 1; sm2(0,1) = 2; sm(0,2) = 0; sm(1,2) = 0;
774 sm1(1,3) = 3; sm1(2,3) = 4;
775 sm2.maybe_compress (true); // Zero elements were added
776 @end group
777 @end example
778
779 The use of the @code{maybe_compress} function should be avoided if
780 possible as it will slow the creation of the matrix.
781
782 A third means of creating a sparse matrix is to work directly with
783 the data in compressed row format. An example of this technique might
784 be
785
786 @example
787 octave_value arg;
788 @dots{}
789 int nz = 6, nr = 3, nc = 4; // Assume we know the max # nz
790 SparseMatrix sm (nr, nc, nz);
791 Matrix m = arg.matrix_value ();
792
793 int ii = 0;
794 sm.cidx (0) = 0;
795 for (int j = 1; j < nc; j++)
796 @{
797 for (int i = 0; i < nr; i++)
798 @{
799 double tmp = foo (m(i,j));
800 if (tmp != 0.)
801 @{
802 sm.data(ii) = tmp;
803 sm.ridx(ii) = i;
804 ii++;
805 @}
806 @}
807 sm.cidx(j+1) = ii;
808 @}
809 sm.maybe_compress (); // If don't know a-priori the final # of nz.
810 @end example
811
812 @noindent
813 which is probably the most efficient means of creating a sparse matrix.
814
815 Finally, it might sometimes arise that the amount of storage initially
816 created is insufficient to completely store the sparse matrix. Therefore,
817 the method @code{change_capacity} exists to reallocate the sparse memory.
818 The above example would then be modified as
819
820 @example
821 octave_value arg;
822 @dots{}
823 int nz = 6, nr = 3, nc = 4; // Assume we know the max # nz
824 SparseMatrix sm (nr, nc, nz);
825 Matrix m = arg.matrix_value ();
826
827 int ii = 0;
828 sm.cidx (0) = 0;
829 for (int j = 1; j < nc; j++)
830 @{
831 for (int i = 0; i < nr; i++)
832 @{
833 double tmp = foo (m(i,j));
834 if (tmp != 0.)
835 @{
836 if (ii == nz)
837 @{
838 nz += 2; // Add 2 more elements
839 sm.change_capacity (nz);
840 @}
841 sm.data(ii) = tmp;
842 sm.ridx(ii) = i;
843 ii++;
844 @}
845 @}
846 sm.cidx(j+1) = ii;
847 @}
848 sm.maybe_mutate (); // If don't know a-priori the final # of nz.
849 @end example
850
851 Note that both increasing and decreasing the number of non-zero elements in
852 a sparse matrix is expensive as it involves memory reallocation. Also as
853 parts of the matrix, though not its entirety, exist as old and new copies
854 at the same time, additional memory is needed. Therefore, if possible this
855 should be avoided.
856
857 @node Using Sparse Matrices in Oct-Files
858 @subsubsection Using Sparse Matrices in Oct-Files
859
860 Most of the same operators and functions on sparse matrices that are
861 available from the Octave command line are also available within oct-files.
862 The basic means of extracting a sparse matrix from an @code{octave_value}
863 and returning it as an @code{octave_value}, can be seen in the
864 following example.
865
866 @example
867 @group
868 octave_value_list retval;
869
870 SparseMatrix sm = args(0).sparse_matrix_value ();
871 SparseComplexMatrix scm =
872 args(1).sparse_complex_matrix_value ();
873 SparseBoolMatrix sbm = args(2).sparse_bool_matrix_value ();
874 @dots{}
875 retval(2) = sbm;
876 retval(1) = scm;
877 retval(0) = sm;
878 @end group
879 @end example
880
881 The conversion to an @code{octave_value} is handled by the sparse
882 @code{octave_value} constructors, and so no special care is needed.
883
884 @node Accessing Global Variables in Oct-Files
885 @subsection Accessing Global Variables in Oct-Files
886
887 Global variables allow variables in the global scope to be
888 accessed. Global variables can be accessed within oct-files by using
889 the support functions @code{get_global_value} and @code{set_global_value}.
890 @code{get_global_value} takes two arguments, the first is a string representing
891 the variable name to obtain. The second argument is a boolean argument
892 specifying what to do if no global variable of the desired name is found.
893 An example of the use of these two functions is
894
895 @example
896 @EXAMPLEFILE(globaldemo.cc)
897 @end example
898
899 An example of its use is
900
901 @example
902 @group
903 global a b
904 b = 10;
905 globaldemo ("b")
906 @result{} 10
907 globaldemo ("c")
908 @result{} "Global variable not found"
909 num2str (a)
910 @result{} 42
911 @end group
912 @end example
913
914 @node Calling Octave Functions from Oct-Files
915 @subsection Calling Octave Functions from Oct-Files
916
917 There is often a need to be able to call another Octave function from
918 within an oct-file, and there are many examples of such within Octave
919 itself. For example, the @code{quad} function is an oct-file that
920 calculates the definite integral by quadrature over a user supplied
921 function.
922
923 There are also many ways in which a function might be passed. It might
924 be passed as one of
925
926 @enumerate 1
927 @item Function Handle
928
929 @item Anonymous Function Handle
930
931 @item Inline Function
932
933 @item String
934 @end enumerate
935
936 The example below demonstrates an example that accepts all four means of
937 passing a function to an oct-file.
938
939 @example
940 @EXAMPLEFILE(funcdemo.cc)
941 @end example
942
943 The first argument to this demonstration is the user-supplied function
944 and the remaining arguments are all passed to the user function.
945
946 @example
947 @group
948 funcdemo (@@sin,1)
949 @result{} 0.84147
950 funcdemo (@@(x) sin (x), 1)
951 @result{} 0.84147
952 funcdemo (inline ("sin (x)"), 1)
953 @result{} 0.84147
954 funcdemo ("sin",1)
955 @result{} 0.84147
956 funcdemo (@@atan2, 1, 1)
957 @result{} 0.78540
958 @end group
959 @end example
960
961 When the user function is passed as a string the treatment of the
962 function is different. In some cases it is necessary to have the
963 user supplied function as an @code{octave_function} object. In that
964 case the string argument can be used to create a temporary function
965 as demonstrated below.
966
967 @example
968 @group
969 std::octave fcn_name = unique_symbol_name ("__fcn__");
970 std::string fcode = "function y = ";
971 fcode.append (fcn_name);
972 fcode.append ("(x) y = ");
973 fcn = extract_function (args(0), "funcdemo", fcn_name,
974 fcode, "; endfunction");
975 @dots{}
976 if (fcn_name.length ())
977 clear_function (fcn_name);
978 @end group
979 @end example
980
981 There are two important things to know in this case. First, the number of
982 input arguments to the user function is fixed, and in the above example is
983 a single argument. Second, to avoid leaving the temporary function in the
984 Octave symbol table it should be cleared after use. Also, by convention
985 internal function names begin and end with the character sequence @samp{__}.
986
987 @node Calling External Code from Oct-Files
988 @subsection Calling External Code from Oct-Files
989
990 Linking external C code to Octave is relatively simple, as the C
991 functions can easily be called directly from C++. One possible issue is
992 that the declarations of the external C functions may need to be explicitly
993 defined as C functions to the compiler. If the declarations of the
994 external C functions are in the header @file{foo.h}, then the tactic to
995 ensure that the C++ compiler treats these declarations as C code is
996
997 @example
998 @group
999 #ifdef __cplusplus
1000 extern "C"
1001 @{
1002 #endif
1003 #include "foo.h"
1004 #ifdef __cplusplus
1005 @} /* end extern "C" */
1006 #endif
1007 @end group
1008 @end example
1009
1010 Calling Fortran code, however, can pose more difficulties. This is due to
1011 differences in the manner in which compilers treat the linking of Fortran code
1012 with C or C++ code. Octave supplies a number of macros that allow consistent
1013 behavior across a number of compilers.
1014
1015 The underlying Fortran code should use the @code{XSTOPX} function to
1016 replace the Fortran @code{STOP} function. @code{XSTOPX} uses the Octave
1017 exception handler to treat failing cases in the Fortran code
1018 explicitly. Note that Octave supplies its own replacement @sc{blas}
1019 @code{XERBLA} function, which uses @code{XSTOPX}.
1020
1021 If the code calls @code{XSTOPX}, then the @w{@code{F77_XFCN}}
1022 macro should be used to call the underlying Fortran function. The Fortran
1023 exception state can then be checked with the global variable
1024 @code{f77_exception_encountered}. If @code{XSTOPX} will not be called,
1025 then the @w{@code{F77_FCN}} macro should be used instead to call the Fortran
1026 code.
1027
1028 There is no great harm in using @w{@code{F77_XFCN}} in all cases, except that
1029 for Fortran code that is short running and executes a large number of times,
1030 there is potentially an overhead in doing so. However, if @w{@code{F77_FCN}}
1031 is used with code that calls @code{XSTOP}, Octave can generate a
1032 segmentation fault.
1033
1034 An example of the inclusion of a Fortran function in an oct-file is
1035 given in the following example, where the C++ wrapper is
1036
1037 @example
1038 @EXAMPLEFILE(fortdemo.cc)
1039 @end example
1040
1041 @noindent
1042 and the Fortran function is
1043
1044 @example
1045 @EXAMPLEFILE(fortsub.f)
1046 @end example
1047
1048 This example demonstrates most of the features needed to link to an
1049 external Fortran function, including passing arrays and strings, as well
1050 as exception handling. Both the Fortran and C++ files need to be compiled
1051 in order for the example to work.
1052
1053 @example
1054 @group
1055 mkoctfile fortdemo.cc fortsub.f
1056 [b, s] = fortdemo (1:3)
1057 @result{}
1058 b = 1.00000 0.50000 0.33333
1059 s = There are 3 values in the input vector
1060 [b, s] = fortdemo (0:3)
1061 error: fortdemo: fortsub: divide by zero
1062 @end group
1063 @end example
1064
1065 @node Allocating Local Memory in Oct-Files
1066 @subsection Allocating Local Memory in Oct-Files
1067
1068 Allocating memory within an oct-file might seem easy as the C++
1069 new/delete operators can be used. However, in that case great care must be
1070 taken to avoid memory leaks. The preferred manner in which to allocate
1071 memory for use locally is to use the @w{@code{OCTAVE_LOCAL_BUFFER}} macro.
1072 An example of its use is
1073
1074 @example
1075 OCTAVE_LOCAL_BUFFER (double, tmp, len)
1076 @end example
1077
1078 @noindent
1079 that returns a pointer @code{tmp} of type @code{double *} of length
1080 @code{len}.
1081
1082 In this case Octave itself will worry about reference counting and variable
1083 scope and will properly free memory without programmer intervention.
1084
1085 @node Input Parameter Checking in Oct-Files
1086 @subsection Input Parameter Checking in Oct-Files
1087
1088 As oct-files are compiled functions they open up the possibility of
1089 crashing Octave through careless function calls or memory faults.
1090 It is quite important that each and every function have a sufficient level
1091 of parameter checking to ensure that Octave behaves well.
1092
1093 The minimum requirement, as previously discussed, is to check the number
1094 of input arguments before using them to avoid referencing a non-existent
1095 argument. However, in some cases this might not be sufficient as the
1096 underlying code imposes further constraints. For example, an external
1097 function call might be undefined if the input arguments are not
1098 integers, or if one of the arguments is zero, or if the input is complex
1099 and a real value was expected. Therefore, oct-files often need additional
1100 input parameter checking.
1101
1102 There are several functions within Octave that can be useful for the
1103 purposes of parameter checking. These include the methods of the
1104 octave_value class like @code{is_real_matrix}, @code{is_numeric_type}, etc.
1105 Often, with a knowledge of the Octave m-file language, you can guess at what
1106 the corresponding C++ routine will. In addition there are some more
1107 specialized input validation functions of which a few are demonstrated below.
1108
1109 @example
1110 @EXAMPLEFILE(paramdemo.cc)
1111 @end example
1112
1113 @noindent
1114 An example of its use is:
1115
1116 @example
1117 @group
1118 paramdemo ([1, 2, NaN, Inf])
1119 @result{} Properties of input array:
1120 includes Inf or NaN values
1121 includes other values than 1 and 0
1122 includes only int, Inf or NaN values
1123 @end group
1124 @end example
1125
1126 @node Exception and Error Handling in Oct-Files
1127 @subsection Exception and Error Handling in Oct-Files
1128
1129 Another important feature of Octave is its ability to react to the user
1130 typing @key{Control-C} even during calculations. This ability is based on the
1131 C++ exception handler, where memory allocated by the C++ new/delete
1132 methods are automatically released when the exception is treated. When
1133 writing an oct-file, to allow Octave to treat the user typing @key{Control-C},
1134 the @w{@code{OCTAVE_QUIT}} macro is supplied. For example:
1135
1136 @example
1137 @group
1138 for (octave_idx_type i = 0; i < a.nelem (); i++)
1139 @{
1140 OCTAVE_QUIT;
1141 b.elem (i) = 2. * a.elem (i);
1142 @}
1143 @end group
1144 @end example
1145
1146 The presence of the @w{@code{OCTAVE_QUIT}} macro in the inner loop allows
1147 Octave to treat the user request with the @key{Control-C}. Without this macro,
1148 the user must either wait for the function to return before the interrupt is
1149 processed, or press @key{Control-C} three times to force Octave to exit.
1150
1151 The @w{@code{OCTAVE_QUIT}} macro does impose a very small speed penalty, and so
1152 for loops that are known to be small it might not make sense to include
1153 @w{@code{OCTAVE_QUIT}}.
1154
1155 When creating an oct-file that uses an external libraries, the function
1156 might spend a significant portion of its time in the external
1157 library. It is not generally possible to use the @w{@code{OCTAVE_QUIT}} macro
1158 in this case. The alternative in this case is
1159
1160 @example
1161 @group
1162 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
1163 @dots{} some code that calls a "foreign" function @dots{}
1164 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
1165 @end group
1166 @end example
1167
1168 The disadvantage of this is that if the foreign code allocates any
1169 memory internally, then this memory might be lost during an interrupt,
1170 without being deallocated. Therefore, ideally Octave itself should
1171 allocate any memory that is needed by the foreign code, with either the
1172 @nospell{fortran_vec} method or the @w{@code{OCTAVE_LOCAL_BUFFER}} macro.
1173
1174 The Octave unwind_protect mechanism (@ref{The unwind_protect Statement})
1175 can also be used in oct-files. In conjunction with the exception
1176 handling of Octave, it is important to enforce that certain code is run
1177 to allow variables, etc.@: to be restored even if an exception occurs. An
1178 example of the use of this mechanism is
1179
1180 @example
1181 @EXAMPLEFILE(unwinddemo.cc)
1182 @end example
1183
1184 As can be seen in the example:
1185
1186 @example
1187 @group
1188 unwinddemo (1, 0)
1189 @result{} Inf
1190 1 / 0
1191 @result{} warning: division by zero
1192 Inf
1193 @end group
1194 @end example
1195
1196 The warning for division by zero (and in fact all warnings) are disabled in the
1197 @code{unwinddemo} function.
1198
1199 @node Documentation and Test of Oct-Files
1200 @subsection Documentation and Test of Oct-Files
1201
1202 The documentation of an oct-file is the fourth string parameter of the
1203 @w{@code{DEFUN_DLD}} macro. This string can be formatted in the same manner
1204 as the help strings for user functions (@ref{Documentation Tips}),
1205 however there are some issue that are particular to the formatting of
1206 help strings within oct-files.
1207
1208 The major issue is that the help string will typically be longer than a
1209 single line of text, and so the formatting of long help strings needs to
1210 be taken into account. There are several possible solutions, but the most
1211 common is illustrated in the following example,
1212
1213 @example
1214 @group
1215 DEFUN_DLD (do_what_i_want, args, nargout,
1216 "-*- texinfo -*-\n\
1217 @@deftypefn @{Function File@} @{@} do_what_i_say (@@var@{n@})\n\
1218 A function that does what the user actually wants rather\n\
1219 than what they requested.\n\
1220 @@end deftypefn")
1221 @{
1222 @dots{}
1223 @}
1224 @end group
1225 @end example
1226
1227 @noindent
1228 where, as can be seen, each line of text is terminated by @code{\n\}
1229 which is an embedded new-line in the string together with a C++ string
1230 continuation character. Note that the final @code{\} must be the last
1231 character on the line.
1232
1233 Octave also includes the ability to embed test and demonstration
1234 code for a function within the code itself (@ref{Test and Demo Functions}).
1235 This can be used from within oct-files (or in fact any file) with
1236 certain provisos. First, the test and demo functions of Octave look
1237 for @code{%!} as the first two characters of a line to identify test
1238 and demonstration code. This is a requirement for oct-files as well.
1239 In addition, the test and demonstration code must be wrapped in a comment
1240 block to avoid it being interpreted by the compiler. Finally, the Octave
1241 test and demonstration code must have access to the original source code
1242 of the oct-file and not just the compiled code as the tests are stripped
1243 from the compiled code. An example in an oct-file might be
1244
1245 @example
1246 @group
1247 /*
1248 %!assert (sin ([1,2]), [sin(1),sin(2)])
1249 %!error (sin ())
1250 %!error (sin (1,1))
1251 */
1252 @end group
1253 @end example
1254
1255 @c @node Application Programming Interface for Oct-Files
1256 @c @subsection Application Programming Interface for Oct-Files
1257 @c
1258 @c WRITE ME, using Coda section 1.3 as a starting point.
1259
1260 @node Mex-Files
1261 @section Mex-Files
1262 @cindex mex-files
1263 @cindex mex
1264
1265 Octave includes an interface to allow legacy mex-files to be compiled
1266 and used with Octave. This interface can also be used to share code
1267 between Octave and @sc{matlab} users. However, as mex-files expose
1268 @sc{matlab}'s internal API, and the internal structure of Octave is
1269 different, a mex-file can never have the same performance in Octave as
1270 the equivalent oct-file. In particular, to support the manner in which
1271 variables are passed to mex functions there are a significant number of
1272 additional copies of memory blocks when calling or returning from a
1273 mex-file function. For this reason, it is recommended that any new code
1274 be written with the oct-file interface previously discussed.
1275
1276 @menu
1277 * Getting Started with Mex-Files::
1278 * Working with Matrices and Arrays in Mex-Files::
1279 * Character Strings in Mex-Files::
1280 * Cell Arrays with Mex-Files::
1281 * Structures with Mex-Files::
1282 * Sparse Matrices with Mex-Files::
1283 * Calling Other Functions in Mex-Files::
1284 @c * Application Programming Interface for Mex-Files::
1285 @end menu
1286
1287 @node Getting Started with Mex-Files
1288 @subsection Getting Started with Mex-Files
1289
1290 The basic command to build a mex-file is either @code{mkoctfile --mex}
1291 or @code{mex}. The first command can be used either from within Octave or from
1292 the command line. However, to avoid issues with @sc{matlab}'s own @code{mex}
1293 command, the use of the command @code{mex} is limited to within Octave.
1294 Compiled mex-files have the extension @file{.mex}.
1295
1296 @DOCSTRING(mex)
1297
1298 @DOCSTRING(mexext)
1299
1300 Consider the following short example:
1301
1302 @example
1303 @group
1304 @EXAMPLEFILE(myhello.c)
1305 @end group
1306 @end example
1307
1308 The first line @code{#include "mex.h"} makes available all of the definitions
1309 necessary for a mex-file. One important difference between Octave and
1310 @sc{matlab} is that the header file @code{"matrix.h"} is implicitly included
1311 through the inclusion of @code{"mex.h"}. This is necessary to avoid a conflict
1312 with the Octave file @code{"Matrix.h"} for operating systems and compilers that
1313 don't distinguish between filenames in upper and lower case.
1314
1315 The entry point into the mex-file is defined by @code{mexFunction}. The
1316 function takes four arguments:
1317
1318 @enumerate 1
1319 @item The number of return arguments (# of left-hand side args).
1320
1321 @item An array of pointers to return arguments.
1322
1323 @item The number of input arguments (# of right-hand side args).
1324
1325 @item An array of pointers to input arguments.
1326 @end enumerate
1327
1328 Note that the function name definition is not explicitly included in
1329 @code{mexFunction} and so there can only be a single @code{mexFunction}
1330 entry point per file. Instead, the name of the function as seen in Octave is
1331 determined by the name of the mex-file itself minus the extension. Therefore,
1332 if the above function is in the file @file{myhello.c}, it can be compiled with
1333
1334 @example
1335 mkoctfile --mex myhello.c
1336 @end example
1337
1338 @noindent
1339 which creates a file @file{myhello.mex}. The function can then be run from
1340 Octave as
1341
1342 @example
1343 @group
1344 myhello (1,2,3)
1345 @result{} Hello, World!
1346 @result{} I have 3 inputs and 0 outputs
1347 @end group
1348 @end example
1349
1350 It should be noted that the mex-file contains no help string for the
1351 functions it contains. To document mex-files, there should exist an
1352 m-file in the same directory as the mex-file itself. Taking the above as
1353 an example, we would therefore have a file @file{myhello.m} that might
1354 contain the text
1355
1356 @example
1357 %MYHELLO Simple test of the functionality of a mex-file.
1358 @end example
1359
1360 In this case, the function that will be executed within Octave will be
1361 given by the mex-file, while the help string will come from the
1362 m-file. This can also be useful to allow a sample implementation of the
1363 mex-file within the Octave language itself for testing purposes.
1364
1365 Although there cannot be multiple entry points in a single mex-file,
1366 one can use the @code{mexFunctionName} function to determine what name
1367 the mex-file was called with. This can be used to alter the behavior of
1368 the mex-file based on the function name. For example, if
1369
1370 @example
1371 @group
1372 @EXAMPLEFILE(myfunc.c)
1373 @end group
1374 @end example
1375
1376 @noindent
1377 is in file @file{myfunc.c}, and it is compiled with
1378
1379 @example
1380 @group
1381 mkoctfile --mex myfunc.c
1382 ln -s myfunc.mex myfunc2.mex
1383 @end group
1384 @end example
1385
1386 @noindent
1387 then as can be seen by
1388
1389 @example
1390 @group
1391 myfunc ()
1392 @result{} You called function: myfunc
1393 This is the principal function
1394 myfunc2 ()
1395 @result{} You called function: myfunc2
1396 @end group
1397 @end example
1398
1399 @noindent
1400 the behavior of the mex-file can be altered depending on the functions
1401 name.
1402
1403 Although the user should only include @file{mex.h} in their code, Octave
1404 declares additional functions, typedefs, etc., available to the user to
1405 write mex-files in the headers @file{mexproto.h} and @file{mxarray.h}.
1406
1407 @node Working with Matrices and Arrays in Mex-Files
1408 @subsection Working with Matrices and Arrays in Mex-Files
1409
1410 The basic mex type of all variables is @code{mxArray}. Any object,
1411 such as a matrix, cell array, or structure is stored in this basic
1412 type. As such, @code{mxArray} serves basically the same purpose as the
1413 octave_value class in oct-files in that it acts as a container for the
1414 more specialized types.
1415
1416 The @code{mxArray} structure contains at a minimum, the name of the
1417 variable it represents, its dimensions, its type, and whether the variable is
1418 real or complex. It can also contain a number of additional fields
1419 depending on the type of the @code{mxArray}. There are a number of
1420 functions to create @code{mxArray} structures, including
1421 @code{mxCreateDoubleMatrix}, @code{mxCreateCellArray}, @code{mxCreateSparse},
1422 and the generic @code{mxCreateNumericArray}.
1423
1424 The basic function to access the data contained in an array is
1425 @code{mxGetPr}. As the mex interface assumes that real and imaginary
1426 parts of a complex array are stored separately, there is an equivalent
1427 function @code{mxGetPi} that gets the imaginary part. Both of these
1428 functions are only for use with double precision matrices. The generic
1429 functions @code{mxGetData} and @code{mxGetImagData} perform the same operation
1430 on all matrix types. For example:
1431
1432 @example
1433 @group
1434 mxArray *m;
1435 mwSize *dims;
1436 UINT32_T *pr;
1437
1438 dims = (mwSize *) mxMalloc (2 * sizeof (mwSize));
1439 dims[0] = 2; dims[1] = 2;
1440 m = mxCreateNumericArray (2, dims, mxUINT32_CLASS, mxREAL);
1441 pr = (UINT32_T *) mxGetData (m);
1442 @end group
1443 @end example
1444
1445 There are also the functions @code{mxSetPr}, etc., that perform the
1446 inverse, and set the data of an array to use the block of memory pointed
1447 to by the argument of @code{mxSetPr}.
1448
1449 Note the type @code{mwSize} used above, and also @code{mwIndex}, are defined
1450 as the native precision of the indexing in Octave on the platform on
1451 which the mex-file is built. This allows both 32- and 64-bit platforms
1452 to support mex-files. @code{mwSize} is used to define array dimensions
1453 and the maximum number or elements, while @code{mwIndex} is used to define
1454 indexing into arrays.
1455
1456 An example that demonstrates how to work with arbitrary real or complex
1457 double precision arrays is given by the file @file{mypow2.c} shown below.
1458
1459 @example
1460 @EXAMPLEFILE(mypow2.c)
1461 @end example
1462
1463 @noindent
1464 with an example of its use
1465
1466 @example
1467 @group
1468 b = randn (4,1) + 1i * randn (4,1);
1469 all (b.^2 == mypow2 (b))
1470 @result{} 1
1471 @end group
1472 @end example
1473
1474 The example above uses the functions @code{mxGetDimensions},
1475 @code{mxGetNumberOfElements}, and @code{mxGetNumberOfDimensions} to work
1476 with the dimensions of multi-dimensional arrays. The functions
1477 @code{mxGetM}, and @code{mxGetN} are also available to find the number
1478 of rows and columns in a 2-D matrix.
1479
1480 @node Character Strings in Mex-Files
1481 @subsection Character Strings in Mex-Files
1482
1483 As mex-files do not make the distinction between single and double
1484 quoted strings within Octave, there is perhaps less complexity in the
1485 use of strings and character matrices in mex-files. An example of their
1486 use that parallels the demo in @file{stringdemo.cc} is given in the
1487 file @file{mystring.c}, as shown below.
1488
1489 @example
1490 @EXAMPLEFILE(mystring.c)
1491 @end example
1492
1493 @noindent
1494 An example of its expected output is
1495
1496 @example
1497 @group
1498 mystring (["First String"; "Second String"])
1499 @result{} s1 = Second String
1500 First String
1501 @end group
1502 @end example
1503
1504 Other functions in the mex interface for handling character strings are
1505 @code{mxCreateString}, @code{mxArrayToString}, and
1506 @code{mxCreateCharMatrixFromStrings}. In a mex-file, a character string
1507 is considered to be a vector rather than a matrix. This is perhaps an
1508 arbitrary distinction as the data in the mxArray for the matrix is
1509 consecutive in any case.
1510
1511 @node Cell Arrays with Mex-Files
1512 @subsection Cell Arrays with Mex-Files
1513
1514 One can perform exactly the same operations on Cell arrays in mex-files
1515 as in oct-files. An example that reduplicates the function of
1516 the @file{celldemo.cc} oct-file in a mex-file is given by @file{mycell.c}
1517 as shown below.
1518
1519 @example
1520 @group
1521 @EXAMPLEFILE(mycell.c)
1522 @end group
1523 @end example
1524
1525 @noindent
1526 The output is identical to the oct-file version as well.
1527
1528 @example
1529 @group
1530 [b1, b2, b3] = mycell (@{1, [1, 2], "test"@})
1531 @result{}
1532 b1 = 1
1533 b2 =
1534
1535 1 2
1536
1537 b3 = test
1538 @end group
1539 @end example
1540
1541 Note in the example the use of the @code{mxDuplicateArray} function. This
1542 is needed as the @code{mxArray} pointer returned by @code{mxGetCell}
1543 might be deallocated. The inverse function to @code{mxGetCell}, used for
1544 setting Cell values, is @code{mxSetCell} and is defined as
1545
1546 @example
1547 void mxSetCell (mxArray *ptr, int idx, mxArray *val);
1548 @end example
1549
1550 Finally, to create a cell array or matrix, the appropriate functions are
1551
1552 @example
1553 @group
1554 mxArray *mxCreateCellArray (int ndims, const int *dims);
1555 mxArray *mxCreateCellMatrix (int m, int n);
1556 @end group
1557 @end example
1558
1559 @node Structures with Mex-Files
1560 @subsection Structures with Mex-Files
1561
1562 The basic function to create a structure in a mex-file is
1563 @code{mxCreateStructMatrix} which creates a structure array with a two
1564 dimensional matrix, or @code{mxCreateStructArray}.
1565
1566 @example
1567 @group
1568 mxArray *mxCreateStructArray (int ndims, int *dims,
1569 int num_keys,
1570 const char **keys);
1571 mxArray *mxCreateStructMatrix (int rows, int cols,
1572 int num_keys,
1573 const char **keys);
1574 @end group
1575 @end example
1576
1577 Accessing the fields of the structure can then be performed with
1578 @code{mxGetField} and @code{mxSetField} or alternatively with the
1579 @code{mxGetFieldByNumber} and @code{mxSetFieldByNumber} functions.
1580
1581 @example
1582 @group
1583 mxArray *mxGetField (const mxArray *ptr, mwIndex index,
1584 const char *key);
1585 mxArray *mxGetFieldByNumber (const mxArray *ptr,
1586 mwIndex index, int key_num);
1587 void mxSetField (mxArray *ptr, mwIndex index,
1588 const char *key, mxArray *val);
1589 void mxSetFieldByNumber (mxArray *ptr, mwIndex index,
1590 int key_num, mxArray *val);
1591 @end group
1592 @end example
1593
1594 A difference between the oct-file interface to structures and the
1595 mex-file version is that the functions to operate on structures in
1596 mex-files directly include an @code{index} over the elements of the
1597 arrays of elements per @code{field}; Whereas, the oct-file structure
1598 includes a Cell Array per field of the structure.
1599
1600 An example that demonstrates the use of structures in a mex-file can be
1601 found in the file @file{mystruct.c} shown below.
1602
1603 @example
1604 @EXAMPLEFILE(mystruct.c)
1605 @end example
1606
1607 An example of the behavior of this function within Octave is then
1608
1609 @example
1610 a(1).f1 = "f11"; a(1).f2 = "f12";
1611 a(2).f1 = "f21"; a(2).f2 = "f22";
1612 b = mystruct (a)
1613 @result{} field f1(0) = f11
1614 field f1(1) = f21
1615 field f2(0) = f12
1616 field f2(1) = f22
1617 b =
1618 @{
1619 this =
1620
1621 (,
1622 [1] = this1
1623 [2] = this2
1624 [3] = this3
1625 [4] = this4
1626 ,)
1627
1628 that =
1629
1630 (,
1631 [1] = that1
1632 [2] = that2
1633 [3] = that3
1634 [4] = that4
1635 ,)
1636
1637 @}
1638 @end example
1639
1640 @node Sparse Matrices with Mex-Files
1641 @subsection Sparse Matrices with Mex-Files
1642
1643 The Octave format for sparse matrices is identical to the mex format in
1644 that it is a compressed column sparse format. Also in both, sparse
1645 matrices are required to be two-dimensional. The only difference is that
1646 the real and imaginary parts of the matrix are stored separately.
1647
1648 The mex-file interface, in addition to using @code{mxGetM}, @code{mxGetN},
1649 @code{mxSetM}, @code{mxSetN}, @code{mxGetPr}, @code{mxGetPi},
1650 @code{mxSetPr}, and @code{mxSetPi}, also supplies the following functions.
1651
1652 @example
1653 @group
1654 mwIndex *mxGetIr (const mxArray *ptr);
1655 mwIndex *mxGetJc (const mxArray *ptr);
1656 mwSize mxGetNzmax (const mxArray *ptr);
1657
1658 void mxSetIr (mxArray *ptr, mwIndex *ir);
1659 void mxSetJc (mxArray *ptr, mwIndex *jc);
1660 void mxSetNzmax (mxArray *ptr, mwSize nzmax);
1661 @end group
1662 @end example
1663
1664 @noindent
1665 @code{mxGetNzmax} gets the maximum number of elements that can be stored
1666 in the sparse matrix. This is not necessarily the number of non-zero
1667 elements in the sparse matrix. @code{mxGetJc} returns an array with one
1668 additional value than the number of columns in the sparse matrix. The
1669 difference between consecutive values of the array returned by
1670 @code{mxGetJc} define the number of non-zero elements in each column of
1671 the sparse matrix. Therefore,
1672
1673 @example
1674 @group
1675 mwSize nz, n;
1676 mwIndex *Jc;
1677 mxArray *m;
1678 @dots{}
1679 n = mxGetN (m);
1680 Jc = mxGetJc (m);
1681 nz = Jc[n];
1682 @end group
1683 @end example
1684
1685 @noindent
1686 returns the actual number of non-zero elements stored in the matrix in
1687 @code{nz}. As the arrays returned by @code{mxGetPr} and @code{mxGetPi}
1688 only contain the non-zero values of the matrix, we also need a pointer
1689 to the rows of the non-zero elements, and this is given by
1690 @code{mxGetIr}. A complete example of the use of sparse matrices in
1691 mex-files is given by the file @file{mysparse.c} shown below.
1692
1693 @example
1694 @EXAMPLEFILE(mysparse.c)
1695 @end example
1696
1697 @node Calling Other Functions in Mex-Files
1698 @subsection Calling Other Functions in Mex-Files
1699
1700 It is possible to call other Octave functions from within a mex-file
1701 using @code{mexCallMATLAB}. An example of the use of @code{mexCallMATLAB}
1702 can be see in the example below.
1703
1704 @example
1705 @EXAMPLEFILE(myfeval.c)
1706 @end example
1707
1708 If this code is in the file @file{myfeval.c}, and is compiled to
1709 @file{myfeval.mex}, then an example of its use is
1710
1711 @example
1712 @group
1713 myfeval ("sin", 1)
1714 a = myfeval ("sin", 1)
1715 @result{} Hello, World!
1716 I have 2 inputs and 1 outputs
1717 I'm going to call the interpreter function sin
1718 a = 0.84147
1719 @end group
1720 @end example
1721
1722 Note that it is not possible to use function handles or inline functions
1723 within a mex-file.
1724
1725 @c @node Application Programming Interface for Mex-Files
1726 @c @subsection Application Programming Interface for Mex-Files
1727 @c
1728 @c WRITE ME, refer to mex.h and mexproto.h
1729
1730 @node Standalone Programs
1731 @section Standalone Programs
1732
1733 The libraries Octave itself uses can be utilized in standalone
1734 applications. These applications then have access, for example, to the
1735 array and matrix classes, as well as to all of the Octave algorithms. The
1736 following C++ program, uses class Matrix from @file{liboctave.a} or
1737 @file{liboctave.so}.
1738
1739 @example
1740 @group
1741 @EXAMPLEFILE(standalone.cc)
1742 @end group
1743 @end example
1744
1745 @noindent
1746 mkoctfile can be used to build a standalone application with a
1747 command like
1748
1749 @example
1750 @group
1751 $ mkoctfile --link-stand-alone standalone.cc -o standalone
1752 $ ./standalone
1753 Hello Octave world!
1754 11 12
1755 21 22
1756 $
1757 @end group
1758 @end example
1759
1760 Note that the application @code{standalone} will be dynamically linked
1761 against the Octave libraries and any Octave support libraries. The above
1762 allows the Octave math libraries to be used by an application. It does
1763 not, however, allow the script files, oct-files, or builtin functions of
1764 Octave to be used by the application. To do that the Octave interpreter
1765 needs to be initialized first. An example of how to do this can then be
1766 seen in the code
1767
1768 @example
1769 @group
1770 @EXAMPLEFILE(embedded.cc)
1771 @end group
1772 @end example
1773
1774 @noindent
1775 which, as before, is compiled and run as a standalone application with
1776
1777 @example
1778 @group
1779 $ mkoctfile --link-stand-alone embedded.cc -o embedded
1780 $ ./embedded
1781 GCD of [10, 15] is 5
1782 $
1783 @end group
1784 @end example
1785