Mercurial > octave-nkf
comparison doc/faq/OctaveFAQ.texi @ 9794:0d4613a736e9
convert build system to use automake and libtool
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 10 Nov 2009 15:02:25 -0500 |
parents | doc/faq/Octave-FAQ.texi@16f53d29049f |
children | fd0a3ac60b0e |
comparison
equal
deleted
inserted
replaced
9793:7161e9b41cf6 | 9794:0d4613a736e9 |
---|---|
1 % Copyright (C) 1997, 1998, 1999, 2001, 2003, 2004, 2005, 2007, 2008, 2009 | |
2 % John W. Eaton | |
3 % | |
4 % This file is part of Octave. | |
5 % | |
6 % Octave is free software; you can redistribute it and/or modify it | |
7 % under the terms of the GNU General Public License as published by the | |
8 % Free Software Foundation; either version 3 of the License, or (at | |
9 % your option) any later version. | |
10 % | |
11 % Octave is distributed in the hope that it will be useful, but WITHOUT | |
12 % ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 % FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 % for more details. | |
15 % | |
16 % You should have received a copy of the GNU General Public License | |
17 % along with Octave; see the file COPYING. If not, see | |
18 % <http://www.gnu.org/licenses/>. | |
19 | |
20 \input texinfo.tex @c -*-texinfo-*- | |
21 | |
22 @setfilename OctaveFAQ.info | |
23 @settitle Frequently asked questions about Octave (with answers) | |
24 | |
25 @setchapternewpage off | |
26 @direntry | |
27 * OctaveFAQ: (OctaveFAQ). Frequently asked questions about Octave | |
28 @end direntry | |
29 @titlepage | |
30 @title Octave FAQ | |
31 @subtitle Frequently asked questions about Octave | |
32 @subtitle September 2008 | |
33 @sp 1 | |
34 @author John W. Eaton and David Bateman | |
35 @page | |
36 @end titlepage | |
37 | |
38 @ifnottex | |
39 @node Top | |
40 @top | |
41 @unnumbered Preface | |
42 @cindex FAQ for Octave, latest version | |
43 @end ifnottex | |
44 | |
45 This is a list of frequently asked questions (FAQ) for Octave users. | |
46 | |
47 We are always looking for new questions (@emph{with} answers), better | |
48 answers, or both. Please send suggestions to @email{bug@@octave.org}. | |
49 If you have general questions about Octave, or need help for something | |
50 that is not covered by the Octave manual or the FAQ, please use the | |
51 @email{help@@octave.org} mailing list. | |
52 | |
53 This FAQ is intended to supplement, not replace, the Octave manual. | |
54 Before posting a question to the @email{help@@octave.org} mailing list, | |
55 you should first check to see if the topic is covered in the manual. | |
56 | |
57 @menu | |
58 * What is Octave?:: | |
59 * Licensing Issues:: | |
60 * How can I cite Octave?:: | |
61 * Series 3.0.N:: | |
62 * Octave Features:: | |
63 * Learning more about Octave:: | |
64 * Getting Octave:: | |
65 * Installation:: | |
66 * Common problems:: | |
67 * How do I ...?:: | |
68 * MATLAB compatibility:: | |
69 * Index:: | |
70 @end menu | |
71 | |
72 @node What is Octave? | |
73 @chapter What is Octave? | |
74 | |
75 Octave is a high-level interactive language, primarily intended for | |
76 numerical computations that is mostly compatible with | |
77 @sc{Matlab}.@footnote{@sc{Matlab} is a registered trademark of The MathWorks, | |
78 Inc.} | |
79 | |
80 Octave can do arithmetic for real, complex or integer-valued scalars | |
81 and matrices, solve sets of nonlinear algebraic equations, integrate | |
82 functions over finite and infinite intervals, and integrate systems of | |
83 ordinary differential and differential-algebraic equations. | |
84 | |
85 Octave uses the GNU readline library to handle reading and editing | |
86 input. By default, the line editing commands are similar to the | |
87 cursor movement commands used by GNU Emacs, and a vi-style line | |
88 editing interface is also available. At the end of each session, the | |
89 command history is saved, so that commands entered during previous | |
90 sessions are not lost. | |
91 | |
92 The Octave distribution includes a 590+ page Texinfo manual. Access | |
93 to the complete text of the manual is available via the help command | |
94 @c really, the *complete* text? | |
95 at the Octave prompt. | |
96 | |
97 @menu | |
98 * Who develops Octave?:: | |
99 * Why GNU Octave?:: | |
100 * What version should I use?:: | |
101 * On what platforms does Octave run?:: | |
102 @end menu | |
103 | |
104 @node Who develops Octave? | |
105 @section Who develops Octave? | |
106 | |
107 Discussions about writing the software that would eventually become | |
108 Octave started in about 1988 with James B. Rawlings and John W. Eaton at | |
109 the University of Texas. John W. Eaton was the original author of | |
110 Octave, starting full-time development in February 1992. He is still | |
111 the primary maintainer. The community | |
112 of users/developers has in addition contributed some code and fuels the | |
113 discussion on the mailing lists @email{help@@octave.org} (user forum), | |
114 @email{bug@@octave.org} (bug reports), @email{maintainers@@octave.org} | |
115 (development issues), and @email{octave-dev@@lists.sourceforge.net} (all | |
116 things related to the Octave Forge repository of user-contributed | |
117 functions). | |
118 | |
119 @node Why GNU Octave? | |
120 @section Why GNU Octave? | |
121 | |
122 The GNU Project was launched in 1984 to develop a complete Unix-like | |
123 operating system which is free software: the GNU system. | |
124 | |
125 GNU is a recursive acronym for ``GNU's Not Unix''; it is pronounced | |
126 guh-noo, approximately like canoe. | |
127 | |
128 The Free Software Foundation (FSF) is the principal organizational | |
129 sponsor of the GNU Project. | |
130 | |
131 Octave became GNU Octave in 1997 (beginning with version 2.0.6). This | |
132 meant agreeing to consider Octave a part of the GNU Project and support | |
133 the efforts of the FSF. However, Octave is not and has never been | |
134 developed by the FSF. | |
135 | |
136 For more information about the GNU project, see @url{www.gnu.org}. | |
137 | |
138 @cindex FSF [Free Software Foundation] | |
139 @cindex GNU [GNU's not unix] | |
140 | |
141 @node What version should I use? | |
142 @section What version should I use? | |
143 | |
144 In general, you will find the latest version on | |
145 @url{http://www.octave.org/download.html}. It is | |
146 recommended to use the ``testing'' version of octave for general use, | |
147 and the ``development'' version if you want the latest features. | |
148 | |
149 A list of user-visible changes since the last release is available in | |
150 the file @file{NEWS}. The file @file{ChangeLog} in the source | |
151 distribution contains a more detailed record of changes made since the | |
152 last release. | |
153 | |
154 @node On what platforms does Octave run? | |
155 @section On what platforms does Octave run? | |
156 | |
157 Octave runs on various Unices---at least Linux and Solaris, Mac OS X, | |
158 Windows and anything you can compile it on. Binary distributions exist | |
159 at least for Debian, Suse, Fedora and RedHat Linuxes (Intel and AMD | |
160 CPUs, at least), for Mac Os X and Windows' 98, 2000 and XP. | |
161 | |
162 Two and three dimensional plotting is fully supported using gnuplot. | |
163 | |
164 The underlying numerical solvers are currently standard Fortran ones | |
165 like Lapack, Linpack, Odepack, the Blas, etc., packaged in a library | |
166 of C++ classes. If possible, the Fortran subroutines are compiled | |
167 with the system's Fortran compiler, and called directly from the C++ | |
168 functions. If that's not possible, you can still compile Octave if | |
169 you have the free Fortran to C translator f2c. | |
170 | |
171 Octave is also free software; you can redistribute it and/or modify it | |
172 under the terms of the GNU General Public License as published by the | |
173 Free Software Foundation. | |
174 | |
175 @node Licensing Issues | |
176 @chapter Licensing Issues | |
177 | |
178 @menu | |
179 * If I write code using Octave do I have to release it under the GPL?: GPL | |
180 * Since the MEX interface allows plugins to be distributed under terms that are incompatible with the GPL, does this mean that you are encouraging people to to write non-free software for Octave?: Licensing MEX Files | |
181 * I wrote a program that links with Octave libraries and I don't want to release it under the terms of the GPL. Will you change the license of the Octave libraries for me?: Requesting License Changes | |
182 @end menu | |
183 | |
184 @node GPL | |
185 @section If I write code using Octave do I have to release it under the GPL? | |
186 | |
187 The answer depends on precisely how the code is written and how it works. | |
188 | |
189 Code written entirely in the scripting language of Octave | |
190 (interpreted code in .m files) may be released under the terms of | |
191 whatever license you choose. | |
192 | |
193 Code written using Octave's native plug-in interface (also known | |
194 as a .oct file) necessarily links with Octave internals and is | |
195 considered a derivative work of Octave and therefore must be | |
196 released under terms that are compatible with the GPL. | |
197 | |
198 Code written using Octave's implementation of the Matlab MEX | |
199 interface may be released under the terms of whatever license you | |
200 choose, provided that the following conditions are met: | |
201 | |
202 @enumerate | |
203 @item | |
204 The plugin should not use any bindings that are specific to Octave. In | |
205 other words, the MEX file must use the MEX interface only, and not also | |
206 call on other Octave internals. It should be possible in principle to | |
207 use the MEX file with other programs that implement the MEX interface | |
208 (e.g., Matlab). | |
209 | |
210 @item | |
211 The MEX file should not be distributed together with Octave in such a | |
212 way that they effectively create a single work. For example, you should | |
213 not distribute the MEX file and Octave together in a single package such | |
214 that Octave automatically loads and runs the MEX file when it starts up. | |
215 There are other possible ways that you might effectively create a single | |
216 work; this is just one example. | |
217 @end enumerate | |
218 | |
219 A program that embeds the Octave interpreter (e.g., by calling the | |
220 "octave_main" function), or that calls functions from Octave's | |
221 libraries (e.g., liboctinterp, liboctave, or libcruft) is | |
222 considered a derivative work of Octave and therefore must be | |
223 released under terms that are compatible with the GPL. | |
224 | |
225 @node Licensing MEX Files | |
226 @section Since the MEX interface allows plugins to be distributed under terms that are incompatible with the GPL, does this mean that you are encouraging people to to write non-free software for Octave? | |
227 | |
228 No. The original reason for implementing the MEX interface for Octave | |
229 was to allow Octave to run free software that uses MEX files (the | |
230 particular goal was to run SundialsTB in Octave). The intent was to | |
231 liberate that software from Matlab and increase the amount of free | |
232 software available to Octave users, not to enable people to write | |
233 proprietary code for Octave. For the good of the community, we strongly | |
234 encourage users of Octave to release the code they write for Octave | |
235 under terms that are compatible with the GPL. | |
236 | |
237 @node Requesting License Changes | |
238 @section I wrote a program that links with Octave libraries and I don't want to release it under the terms of the GPL. Will you change the license of the Octave libraries for me? | |
239 | |
240 No. Instead of asking us to change the licensing terms for Octave, we | |
241 recommend that you release your program under terms that are compatible | |
242 with the GPL so that the free software community can benefit from your | |
243 work the same as you have benefitted from the work of all the people who | |
244 have contributed to Octave. | |
245 | |
246 @node How can I cite Octave? | |
247 @chapter How can I cite Octave? | |
248 | |
249 Pointing to @url{http://www.octave.org} is good, because that gives | |
250 people a direct way to find out more. If citation of a URL is not | |
251 allowed by a publisher, or if you also want to point to a traditional | |
252 reference, then you can cite the Octave manual: | |
253 | |
254 @example | |
255 @group | |
256 @@BOOK@{eaton:2008, | |
257 author = "John W. Eaton and David Bateman and Søren Hauberg", | |
258 title = "GNU Octave Manual Version 3", | |
259 publisher = "Network Theory Limited", | |
260 year = "2008", | |
261 isbn = "0-9546120-6-X" | |
262 @} | |
263 @end group | |
264 @end example | |
265 | |
266 @node Series 3.0.N | |
267 @chapter What's new in version series 3.0.N and 3.1.N of Octave | |
268 | |
269 The 3.0.N series has enough new features to justify a major version | |
270 number change. The 3.0.N series brings | |
271 | |
272 @itemize @bullet | |
273 | |
274 @item integer types | |
275 | |
276 @item fixed point arithmetic | |
277 | |
278 @item sparse matrices | |
279 | |
280 @item Linear programming code based on GLPK | |
281 | |
282 @item 64-bit compilation support | |
283 | |
284 @item gzipped files and stream and consequently support of matlab v7 files | |
285 | |
286 @item better support for both msvc and mingw | |
287 | |
288 @item a fully compatible MEX interface | |
289 | |
290 @item many many other minor features and compatibility changes | |
291 | |
292 @end itemize | |
293 | |
294 Here are some features that have been around since 2.1.N | |
295 | |
296 @itemize @bullet | |
297 | |
298 @item NDarrays | |
299 | |
300 @item cells | |
301 | |
302 @end itemize | |
303 | |
304 The 3.1.N series is the current development release and will become a | |
305 3.2.N release in the future. This series brings the new features | |
306 | |
307 @itemize | |
308 @item OpenGL backend | |
309 | |
310 An experimental OpenGL graphics backend to replace the gnuplot | |
311 | |
312 @item Object Orient Programming | |
313 | |
314 @item Block comments | |
315 | |
316 @item imwrite and imread | |
317 | |
318 The functions are based on the GraphicsMagick library. | |
319 | |
320 @item Lazy transpose | |
321 | |
322 Special treatment in the parser of things like "a' * b", where the | |
323 transpose is never explicitly formed but a flag is rather passed to the | |
324 underlying LAPACK code. | |
325 | |
326 @item Single precision type | |
327 | |
328 @item Improved array indexing | |
329 The underlying code used for indexing of arrays has been completely | |
330 rewritten and so the indexing of arrays is now significantly faster. | |
331 @end itemize | |
332 | |
333 | |
334 @node Octave Features | |
335 @chapter What features are unique to Octave? | |
336 | |
337 @menu | |
338 * Functions defined on the command-line:: | |
339 * Comments with #:: | |
340 * Strings delimitted by double quotes ":: | |
341 * Line continuation by backslash:: | |
342 * Informative block closing:: | |
343 * Coherent syntax:: | |
344 * Exclamation mark as not operator:: | |
345 * Increment and decrement operators:: | |
346 * Unwind-protect:: | |
347 * Built-in ODE and DAE solvers:: | |
348 @end menu | |
349 | |
350 This section refers to Matlab R2008b and Octave 2.1.51. | |
351 | |
352 @node Functions defined on the command-line | |
353 @section Functions defined on the command-line | |
354 | |
355 Functions can be defined by entering code on the command line, a | |
356 feature not supported by the other leading brand. For example, you may | |
357 type: | |
358 | |
359 @example | |
360 @group | |
361 octave:1> function s = hello_string (to_who) | |
362 > ## Say hello | |
363 > if nargin<1, to_who = "World"; end | |
364 > s = ["Hello ",\ | |
365 > to_who]; | |
366 > endfunction | |
367 octave:2> hello_string ("Moon") | |
368 ans = Hello Moon | |
369 @end group | |
370 @end example | |
371 | |
372 @node Comments with # | |
373 @section Comments with # | |
374 | |
375 The pound character, @samp{#}, may be used to start comments, in addition | |
376 to @samp{%}. See the previous example. The major advantage of this is | |
377 that as @samp{#} is also a comment character for unix script files, any | |
378 file that starts with a string like @samp{#! /usr/bin/octave -q} will be | |
379 treated as an octave script and be executed by octave. | |
380 | |
381 @node Strings delimitted by double quotes " | |
382 @section Strings delimitted by double quotes " | |
383 The double quote, @samp{"}, may be used to delimit strings, in addition to | |
384 the single quote @samp{'}. See the previous example. Also, double-quoted | |
385 strings include backslash interpretation (like C++, C, and Perl) while | |
386 single quoted are uninterpreted (like Matlab and Perl). | |
387 | |
388 @node Line continuation by backslash | |
389 @section Line continuation by backslash | |
390 | |
391 Lines can be continued with a backslash, @samp{\}, in addition to three | |
392 points @samp{@dots{}}. See the previous example. | |
393 | |
394 @node Informative block closing | |
395 @section Informative block closing | |
396 | |
397 You may close @code{function}, @code{for}, @code{while}, @code{if}, | |
398 @dots{} blocks with @code{endfunction}, @code{endfor}, @code{endwhile}, | |
399 @dots{} keywords in addition to using @code{end}. As with Matlab, the | |
400 @code{end} (or @code{endfunction}) keyword that marks the end of a | |
401 function defined in a @file{.m} file is optional. | |
402 | |
403 @node Coherent syntax | |
404 @section Coherent syntax | |
405 | |
406 Indexing other things than variables is possible, as in: | |
407 @example | |
408 @group | |
409 octave:1> [3 1 4 1 5 9](3) | |
410 ans = 4 | |
411 octave:2> cos([0 pi pi/4 7])(3) | |
412 ans = 0.70711 | |
413 @end group | |
414 @end example | |
415 | |
416 @node Exclamation mark as not operator | |
417 @section Exclamation mark as not operator | |
418 | |
419 The exclamation mark '!' (aka ``Bang!'') is a negation operator, just | |
420 like the tilde '~': | |
421 | |
422 @example | |
423 @group | |
424 octave:1> if ! strcmp (program_name, "octave"), | |
425 > "It's an error" | |
426 > else | |
427 > "It works!" | |
428 > end | |
429 ans = It works! | |
430 @end group | |
431 @end example | |
432 | |
433 @node Increment and decrement operators | |
434 @section Increment and decrement operators | |
435 | |
436 @cindex Increment operators | |
437 @cindex Decrement operators | |
438 @cindex Operators, increment | |
439 @cindex Operators, decrement | |
440 | |
441 If you like the @samp{++}, @samp{+=} etc operators, rejoice! | |
442 Octave includes the C-like increment and decrement operators @samp{++} | |
443 and @samp{--} in both their prefix and postfix forms, in addition to | |
444 @samp{+=}, @samp{-=}, @samp{*=}, @samp{/=}, @samp{^=}, @samp{.*=}, | |
445 @samp{./=}, and @samp{.^=}. | |
446 | |
447 For example, to pre-increment the variable @var{x}, you would write | |
448 @code{++@var{x}}. This would add one to @var{x} and then return the new | |
449 value of @var{x} as the result of the expression. It is exactly the | |
450 same as the expression @code{@var{x} = @var{x} + 1}. | |
451 | |
452 To post-increment a variable @var{x}, you would write @code{x++}. | |
453 This adds one to the variable @var{x}, but returns the value that | |
454 @var{x} had prior to incrementing it. For example, if @var{x} is equal | |
455 to 2, the result of the expression @code{x++} is 2, and the new | |
456 value of @var{x} is 3. | |
457 | |
458 For matrix and vector arguments, the increment and decrement operators | |
459 work on each element of the operand. | |
460 | |
461 | |
462 @node Unwind-protect | |
463 @section Unwind-protect | |
464 | |
465 @cindex Unwind-protect | |
466 | |
467 Octave supports a limited form of exception handling modelled after the | |
468 unwind-protect form of Lisp. The general form of an | |
469 @code{unwind_protect} block looks like this: | |
470 | |
471 @example | |
472 @group | |
473 unwind_protect | |
474 @var{body} | |
475 unwind_protect_cleanup | |
476 @var{cleanup} | |
477 end_unwind_protect | |
478 @end group | |
479 @end example | |
480 | |
481 @noindent | |
482 Where @var{body} and @var{cleanup} are both optional and may contain any | |
483 Octave expressions or commands. The statements in @var{cleanup} are | |
484 guaranteed to be executed regardless of how control exits @var{body}. | |
485 | |
486 The @code{unwind_protect} statement is often used to reliably restore | |
487 the values of global variables that need to be temporarily changed. | |
488 | |
489 Matlab can be made to do something similar with their @code{OnCleanUp} | |
490 function that was introduced in 2008a. | |
491 | |
492 @node Built-in ODE and DAE solvers | |
493 @section Built-in ODE and DAE solvers | |
494 | |
495 @cindex DASSL | |
496 @cindex LSODE | |
497 | |
498 Octave includes LSODE and DASSL for solving systems of stiff ordinary | |
499 differential and differential-algebraic equations. These functions are | |
500 built in to the interpreter. | |
501 | |
502 @node Learning more about Octave | |
503 @chapter What documentation exists for Octave? | |
504 | |
505 @menu | |
506 * Documentation:: | |
507 * Getting additional help:: | |
508 * User community:: | |
509 * Bug reports:: | |
510 @end menu | |
511 | |
512 | |
513 @node Documentation | |
514 @section What documentation exists for Octave? | |
515 | |
516 @cindex Octave, documentation | |
517 | |
518 The Octave distribution includes a 590+ page manual that is also | |
519 distributed under the terms of the GNU GPL. | |
520 It is available on the web at | |
521 @url{http://www.octave.org/docs.html} and you will also | |
522 find there instructions on how to order a paper version. | |
523 | |
524 The complete text of the Octave manual is also available using the GNU | |
525 Info system via the GNU Emacs, info, or xinfo programs, or by using | |
526 the @samp{help -i} command to start the GNU info browser directly from | |
527 the Octave prompt. | |
528 | |
529 If you have problems using this documentation, or find that some topic | |
530 is not adequately explained, indexed, or cross-referenced, please send | |
531 a bug report to @email{bug@@octave.org}. | |
532 | |
533 | |
534 @node Getting additional help | |
535 @section Getting additional help | |
536 | |
537 @cindex Additional help | |
538 @cindex Mailing lists, help-octave | |
539 | |
540 If you can't find an answer to your question, the | |
541 @email{help@@octave.org} mailing list is available for questions related | |
542 to using, installing, and porting Octave that are not adequately | |
543 answered by the Octave manual or by this document. | |
544 | |
545 @node User community | |
546 @section User community | |
547 | |
548 To subscribe to the list, go to @url{www.octave.org/archive.html} and | |
549 follow the link to the subscription page for the list. | |
550 | |
551 @strong{Please do not} send requests to be added or removed from the | |
552 mailing list, or other administrative trivia to the list itself. | |
553 | |
554 An archive of old postings to the help-octave mailing list is maintained | |
555 on @url{http://www.octave.org/archive.html}. | |
556 | |
557 You will also find some user advice and code spread over the web. Good | |
558 starting points are the Octave Wiki @url{http://wiki.octave.org} and | |
559 Octave-Forge @url{http://octave.sourceforge.net} | |
560 | |
561 @node Bug reports | |
562 @section I think I have found a bug in Octave. | |
563 | |
564 @cindex Bug in Octave, newly found | |
565 | |
566 ``I think I have found a bug in Octave, but I'm not sure. How do I know, | |
567 and who should I tell?'' | |
568 | |
569 @cindex Manual, for Octave | |
570 | |
571 First, see the section on bugs and bug reports in the Octave manual. | |
572 When you report a bug, make sure to describe the type of computer you | |
573 are using, the version of the operating system it is running, and the | |
574 version of Octave that you are using. Also provide enough code so that | |
575 the Octave maintainers can duplicate your bug. | |
576 | |
577 If you have Octave working at all, the easiest way to do this is to use | |
578 the Octave function @code{bug_report}. When you execute this function, | |
579 Octave will prompt you for a subject and then invoke the editor on a | |
580 file that already contains all the configuration information. When you | |
581 exit the editor, Octave will mail the bug report for you (in a unix-like | |
582 operating system). | |
583 | |
584 @cindex Octave bug report | |
585 @cindex Mailing lists, bug-octave | |
586 | |
587 If for some reason you cannot use Octave's @code{bug_report} function, | |
588 mail your bug report to @email{bug@@octave.org}. Your message needs to | |
589 include enough information to allow the maintainers of Octave to fix the | |
590 bug. Please read the section on bugs and bug reports in the Octave | |
591 manual for a list of things that should be included in every bug report. | |
592 | |
593 | |
594 @node Getting Octave | |
595 @chapter Getting Octave | |
596 | |
597 @menu | |
598 * Source code:: | |
599 * Pre-compiled binary packages:: | |
600 * Octave for other platforms:: | |
601 @end menu | |
602 | |
603 @node Source code | |
604 @section Source code | |
605 @cindex Source code | |
606 | |
607 Source code is available on the Octave development site, where you are | |
608 sure to get the latest version. | |
609 | |
610 @itemize @bullet | |
611 @item @url{http://www.octave.org/download.html} | |
612 @item @url{ftp://ftp.octave.org/pub/octave/} | |
613 @end itemize | |
614 | |
615 Since Octave is distrubted under the terms of the GPL, you can get | |
616 Octave from a friend who has a copy, by anonymous FTP, or by ordering | |
617 a tape or CD-ROM from the Free Software Foundation (FSF). | |
618 | |
619 @node Pre-compiled binary packages | |
620 @section Pre-compiled binary packages | |
621 @cindex Pre-compiled binary packages | |
622 @cindex Binaries | |
623 | |
624 The Octave project does not distribute binary packages, but other | |
625 projects do. For an up-to-date listing of packagers, see: | |
626 | |
627 @itemize @bullet | |
628 @item @url{http://www.octave.org/download.html} | |
629 @item @url{http://wiki.octave.org/wiki.pl?CategoryInstall} | |
630 @end itemize | |
631 | |
632 As of today, Octave binaries are available at least on Debian, RedHat, | |
633 Suse and Fedora Linuxes, Mac OS X, Windows' 98, 2000 and XP. | |
634 | |
635 @node Octave for other platforms | |
636 @section How do I get a copy of Octave for (some other platform)? | |
637 | |
638 @cindex VMS support | |
639 @cindex VAX | |
640 @cindex MS-DOS support | |
641 @cindex Windows support | |
642 @cindex DJGPP | |
643 @cindex EMX | |
644 @cindex OS/2 support | |
645 | |
646 Octave currently runs on Unix-like systems, Mac OS X, and Windows. | |
647 It should be possible to make Octave work on other systems as well. | |
648 If you are interested in porting Octave to other systems, please contact | |
649 @email{bug@@octave.org}. | |
650 | |
651 @c @menu | |
652 @c * Octave for Unix:: | |
653 @c * Octave for other platforms:: | |
654 @c * latest versions:: | |
655 @c @end menu | |
656 | |
657 @c @cindex Octave, ordering | |
658 @c @cindex Octave, getting a copy | |
659 | |
660 @node Installation | |
661 @chapter Installation Issues and Problems | |
662 | |
663 @cindex Octave, building | |
664 | |
665 Octave 3.2 require approximately 800MB of disk storage to unpack | |
666 and compile from source (considerably less if you don't compile with | |
667 debugging symbols). Once installed, Octave requires approximately 200MB | |
668 of disk space (again, considerably less if you don't compile with | |
669 debugging symbols). | |
670 | |
671 @menu | |
672 * What else do I need?:: | |
673 * Other C++ compilers?:: | |
674 @end menu | |
675 | |
676 @node What else do I need? | |
677 @section What else do I need? | |
678 | |
679 @cindex GNU gcc | |
680 @cindex GNU g++ | |
681 @cindex libg++ | |
682 @cindex GNU Make | |
683 @cindex Flex | |
684 @cindex GNU Bison | |
685 | |
686 To compile Octave, you will need a recent version of GNU Make. You | |
687 will also need GCC 3.3 or later, although GCC 4.1 or later is | |
688 recommended. | |
689 | |
690 @strong{You must have GNU Make to compile octave}. Octave's Makefiles | |
691 use features of GNU Make that are not present in other versions of make. | |
692 GNU Make is very portable and easy to install. | |
693 | |
694 @node Other C++ compilers? | |
695 @section Can I compile Octave with another C++ compiler? | |
696 | |
697 Yes, but development is done primarily with GCC, so you may hit some | |
698 incompatibilities. Octave is intended to be portable to any standard | |
699 conforming compiler. If you have difficulties that you think are bugs, | |
700 please report them to the @email{bug@@octave.org} mailing list, or ask | |
701 for help on the @email{help@@octave.org} mailing list. | |
702 | |
703 @node Common problems | |
704 @chapter Common problems | |
705 | |
706 This list is probably far too short. Feel free to suggest additional | |
707 questions (preferably with answers!) | |
708 | |
709 @itemize @bullet | |
710 @item | |
711 Octave takes a long time to find symbols. | |
712 | |
713 Octave uses the @code{genpath} function to recursively add directories | |
714 to the list of directories searched for function files. Check the list | |
715 of directories with the @code{path} command. If the path list is very | |
716 long check your use of the @code{genpath} function. | |
717 | |
718 @item | |
719 When plotting Octave occasionally gives me errors like @samp{gnuplot> 9 0.735604 | |
720 line 26317: invalid command}. | |
721 | |
722 There is a known bug in gnuplot 4.2 that can cause an off by one error | |
723 while piping data to gnuplot. The relevant gnuplot bug report can be | |
724 found at @url{http://sourceforge.net/tracker/index.php?func=detail&aid=1716556&group_id=2055&atid=102055} | |
725 | |
726 If you have obtained your copy of Octave from a distribution please file | |
727 a bug report requesting that the fix reported in the above bug report be | |
728 included. | |
729 | |
730 @item | |
731 I cannot install a package. Octave complains about a missing @code{mkoctfile}. | |
732 | |
733 Most distributions split Octave into several packages. The script | |
734 @code{mkoctfile} is then part of a separate package: | |
735 @itemize @minus | |
736 @item | |
737 Debian/Ubuntu | |
738 | |
739 @code{aptitude install octave3.0-headers} | |
740 | |
741 @item | |
742 Fedora | |
743 | |
744 @code{yum install octave-devel} | |
745 | |
746 @end itemize | |
747 @end itemize | |
748 | |
749 @node How do I ...? | |
750 @chapter How do I ...? | |
751 | |
752 @menu | |
753 * How do I set the number of displayed decimals?:: | |
754 @end menu | |
755 | |
756 @cindex Tips and tricks | |
757 @cindex How do I @dots{} ? | |
758 | |
759 @node How do I set the number of displayed decimals? | |
760 @section How do I set the number of displayed decimals? | |
761 | |
762 @example | |
763 @group | |
764 octave:1> format long | |
765 octave:2> pi | |
766 pi = 3.14159265358979 | |
767 octave:3> format short | |
768 octave:4> pi | |
769 pi = 3.1416 | |
770 @end group | |
771 @end example | |
772 | |
773 @node MATLAB compatibility | |
774 @chapter Porting programs from @sc{Matlab} to Octave | |
775 | |
776 @cindex @sc{Matlab} compatibility | |
777 @cindex Compatibility with @sc{Matlab} | |
778 | |
779 People often ask | |
780 | |
781 ``I wrote some code for @sc{Matlab}, and I want to get it running under | |
782 Octave. Is there anything I should watch out for?'' | |
783 | |
784 or alternatively | |
785 | |
786 ``I wrote some code in Octave, and want to share it with @sc{Matlab} | |
787 users. Is there anything I should watch out for?'' | |
788 | |
789 which is not quite the same thing. There are still a number of | |
790 differences between Octave and @sc{Matlab}, however in general | |
791 differences between the two are considered as bugs. Octave might | |
792 consider that the bug is in @sc{Matlab} and do nothing about it, but | |
793 generally functionality is almost identical. If you find a difference | |
794 between Octave behavior and @sc{Matlab}, then you should send a | |
795 description of this difference (with code illustrating the difference, | |
796 if possible) to @email{bug@@octave.org}. | |
797 | |
798 Furthermore, Octave adds a few syntactical extensions to Matlab that | |
799 might cause some issues when exchanging files between Matlab and Octave | |
800 users. As both Octave and @sc{Matlab} are under constant development the | |
801 information in this section is subject to change at anytime. | |
802 | |
803 You should also look at the page | |
804 @url{http://octave.sourceforge.net/packages.html} and | |
805 @url{http://octave.sourceforge.net/doc/} that has a function reference | |
806 that is up to date. You can use this function reference to see the | |
807 number of octave function that are available and their @sc{Matlab} | |
808 compatibility. | |
809 | |
810 The major differences between Octave 3.2.N and @sc{Matlab} R2008a are: | |
811 | |
812 @itemize @bullet | |
813 @item Nested Functions | |
814 | |
815 Octave doesn't yet have nested functions. That is | |
816 | |
817 @example | |
818 @group | |
819 function y = foo (x) | |
820 y = bar(x) | |
821 function y = bar (x) | |
822 y = @dots{}; | |
823 end | |
824 end | |
825 @end group | |
826 @end example | |
827 | |
828 There was discussion in Octave of having these even prior to @sc{Matlab}, | |
829 and the decision was made not to have these in Octave at the time for | |
830 compatibility. The above written with sub-functions functions would be | |
831 | |
832 @example | |
833 @group | |
834 function y = foo (x) | |
835 y = bar(x) | |
836 end | |
837 function y = bar (x) | |
838 y = @dots{}; | |
839 end | |
840 @end group | |
841 @end example | |
842 | |
843 Now that @sc{Matlab} has recently introduced nested functions, Octave will | |
844 probably have them soon as well. Until then nested functions in Octave | |
845 are treated as sub-functions with the same scoping rules as | |
846 sub-functions. | |
847 | |
848 The authors of Octave consider the nested function scoping rules of | |
849 Matlab to be more problems than they are worth as they introduce | |
850 diffiult to find bugs as inadvertantly modifying a variable in a | |
851 nested function that is also used in the parent is particularly easy. | |
852 | |
853 @item Differences in core syntax | |
854 There a few core @sc{Matlab} syntaxes that are not accepted by Octave, | |
855 these being | |
856 | |
857 @itemize @bullet | |
858 @item | |
859 Some limitations on the use of function handles. The major difference is | |
860 related to nested function scoping rules (as above) and their use with | |
861 function handles. | |
862 | |
863 @item | |
864 Some limitations of variable argument lists on the LHS of an expression, | |
865 though the most common types are accepted. | |
866 | |
867 @item | |
868 @sc{Matlab} classdef object oriented programming is not yet supportted, | |
869 though work is underway and when development more on to Octave 3.3 this | |
870 will be included in teh development tree. | |
871 @end itemize | |
872 | |
873 @item Differences in core functions | |
874 A large number of the @sc{Matlab} core functions (ie those that are in | |
875 the core and not a toolbox) are implemented, and certainly all of the | |
876 commonly used ones. There are a few functions that aren't implemented, | |
877 for example @code{condest} or to do with specific missing Octave functionality | |
878 (gui, dll, java, activex, dde, web, and serial functions). Some of the | |
879 core functions have limitations that aren't in the @sc{Matlab} | |
880 version. For example the @code{sprandn} function can not force a | |
881 particular condition number for the matrix like @sc{Matlab} can. | |
882 | |
883 @item Just-In-Time compiler | |
884 @sc{Matlab} includes a "Just-In-Time" compiler. This compiler allows the | |
885 acceleration of for-loops in @sc{Matlab} to almost native performance with | |
886 certain restrictions. The JIT must know the return type of all functions | |
887 called in the loops and so you can't include user functions in the loop | |
888 of JIT optimized loops. Octave doesn't have a JIT and so to some might | |
889 seem slower than @sc{Matlab}. For this reason you must vectorize your code as | |
890 much as possible. The MathWorks themselves have a good document | |
891 discussing vectorization at | |
892 @url{http://www.mathworks.com/support/tech-notes/1100/1109.html}. | |
893 | |
894 @item Compiler | |
895 On a related point, there is no Octave compiler, and so you can't | |
896 convert your Octave code into a binary for additional speed or | |
897 distribution. There is an example of how to do this at | |
898 @url{http://www.stud.tu-ilmenau.de/~rueckn/}, but this is a very early | |
899 example code and would need lots of work to complete it. | |
900 | |
901 @item Graphic Handles | |
902 Up to Octave 2.9.9 there was no support for graphic handles in Octave | |
903 itself. In the 3.2.N versions of Octave the support for graphics | |
904 handles is converging towards full compatibility. The @code{patch} | |
905 function is currently limited to 2-D patches, due to an underlying | |
906 limitation in gnuplot. | |
907 | |
908 @item GUI | |
909 There are no @sc{Matlab} compatible GUI functions. There are a number of | |
910 bindings from Octave to Tcl/Tk, Vtk and zenity included in the | |
911 Octave Forge project (@url{http://octave.sourceforge.net}) for example | |
912 that can be used for a GUI, but these are not @sc{Matlab} | |
913 compatible. Work on a matlab compatible GUI is in an alpha stage in the | |
914 JHandles package (@url{http://octave.sourceforge.net/jhandles/index.html}). | |
915 This might be an issue if you intend to exchange Octave code with | |
916 @sc{Matlab} users. | |
917 | |
918 @item Simulink | |
919 Octave itself includes no Simulink support. Typically the simulink | |
920 models lag research and are less flexible, so shouldn't really be used | |
921 in a research environment. However, some @sc{Matlab} users that try to | |
922 use Octave complain about this lack. There is a similar package to | |
923 simulink for the Octave and R projects available at | |
924 @url{http://www.scicraft.org/} | |
925 | |
926 @item Mex-Files | |
927 Octave includes an API to the matlab MEX interface. However, as MEX is | |
928 an API to the internals of @sc{Matlab} and the internals of Octave | |
929 differ from @sc{Matlab}, there is necessarily a manipulation of the data | |
930 to convert from a MEX interface to the Octave equivalent. This is | |
931 notable for all complex matrices, where @sc{Matlab} stores complex | |
932 arrays as real and imaginary parts, whereas Octave respects the C99/C++ | |
933 standards of co-locating the real/imag parts in memory. Also due to the | |
934 way @sc{Matlab} allows access to the arrays passed through a pointer, | |
935 the MEX interface might require copies of arrays (even non complex | |
936 ones). | |
937 | |
938 @item Block comments | |
939 Block comments denoted by "%@{" and "%@}" markers are supported by | |
940 Octave with some limitations. The major limitation is that block | |
941 comments are not supported within [] or @{@}. | |
942 | |
943 @item Mat-File format | |
944 There are some differences in the mat v5 file format accepted by | |
945 Octave. @sc{Matlab} recently introduced the "-V7.3" save option which is | |
946 an HDF5 format which is particularly useful for 64-bit platforms where | |
947 the standard matlab format can not correctly save variables.. Octave | |
948 accepts HDF5 files, but is not yet compatible with the "-v7.3" versions | |
949 produced by @sc{Matlab}. | |
950 | |
951 Although Octave can load inline abd function handles saved by | |
952 @sc{Matlab}, it can not yet save them. | |
953 | |
954 Finally, Some multi-byte unicode characters aren't yet treated in | |
955 mat-files. | |
956 | |
957 @item Profiler | |
958 Octave doesn't have a profiler. Though there is a patch for a flat | |
959 profiler, that might become a real profiler sometime in the future. see | |
960 the thread | |
961 | |
962 @url{http://www.cae.wisc.edu/pipermail/octave-maintainers/2007-January/001685.html} | |
963 | |
964 for more details | |
965 | |
966 @item Toolboxes | |
967 Octave is a community project and so the toolboxes that exist are | |
968 donated by those interested in them through the Octave Forge website | |
969 (@url{http://octave.sourceforge.net}). These might be lacking in certain | |
970 functionality relative to the @sc{Matlab} toolboxes, and might not | |
971 exactly duplicate the matlab functionality or interface. | |
972 | |
973 @item Short-circuit & and | operators | |
974 The @code{&} and @code{|} operators in @sc{Matlab} short-circuit when | |
975 included in an if statemant and not otherwise. In Octave only the | |
976 @code{&&} and @code{||} short circuit. Note that this means that | |
977 | |
978 @example | |
979 @group | |
980 if (a | b) | |
981 @dots{} | |
982 end | |
983 @end group | |
984 @end example | |
985 | |
986 and | |
987 | |
988 @example | |
989 @group | |
990 t = a | b; | |
991 if t | |
992 @dots{} | |
993 end | |
994 @end group | |
995 @end example | |
996 | |
997 @noindent | |
998 are different in @sc{Matlab}. This is really a @sc{Matlab} bug, but | |
999 there is too much code out there that relies on this behavior to change | |
1000 it. Prefer the || and && operators in if statements if possible. | |
1001 | |
1002 Note that the difference is also significant when either argument is a | |
1003 function with side effects or if the first argument is a scalar and the | |
1004 second argument is an empty matrix. For example, note the difference | |
1005 between | |
1006 | |
1007 @example | |
1008 @group | |
1009 t = 1 | []; ## results in [], so... | |
1010 if (t) 1, end ## in if ([]), this is false. | |
1011 @end group | |
1012 @end example | |
1013 | |
1014 and | |
1015 | |
1016 @example | |
1017 if (1 | []) 1, end ## short circuits so condition is true. | |
1018 @end example | |
1019 | |
1020 Another case that is documented in the @sc{Matlab} manuals is that | |
1021 | |
1022 @example | |
1023 @group | |
1024 t = [1, 1] | [1, 2, 3]; ## error | |
1025 if ([1, 1] | [1, 2, 3]) 1, end ## OK | |
1026 @end group | |
1027 @end example | |
1028 | |
1029 Also @sc{Matlab} requires the operands of && and || to be scalar values but | |
1030 Octave does not (it just applies the rule that for an operand to be | |
1031 considered true, every element of the object must be nonzero or | |
1032 logically true). | |
1033 | |
1034 Finally, note the inconsistence of thinking of the condition of an if | |
1035 statement as being equivalent to @code{all(X(:))} when @var{X} is a | |
1036 matrix. This is true for all cases EXCEPT empty matrices: | |
1037 | |
1038 @example | |
1039 @group | |
1040 if ([0, 1]) == if (all ([0, 1])) ==> i.e., condition is false. | |
1041 if ([1, 1]) == if (all ([1, 1])) ==> i.e., condition is true. | |
1042 @end group | |
1043 @end example | |
1044 | |
1045 However, | |
1046 | |
1047 @example | |
1048 if ([]) != if (all ([])) | |
1049 @end example | |
1050 | |
1051 because @code{samp ([]) == 1} (because, despite the name, it is really | |
1052 returning true if none of the elements of the matrix are zero, and since | |
1053 there are no elements, well, none of them are zero). But, somewhere | |
1054 along the line, someone decided that if @code{([])} should be false. | |
1055 Mathworks probably thought it just looks wrong to have @code{[]} be true | |
1056 in this context even if you can use logical gymnastics to convince | |
1057 yourself that "all" the elements of a matrix that doesn't actually have | |
1058 any elements are nonzero. Octave however duplicates this behavior for if | |
1059 statements containing empty matrices. | |
1060 | |
1061 @item Solvers for singular, under- and over-determined matrices | |
1062 | |
1063 Matlab's solvers as used by the operators mldivide (\) and mrdivide (/), | |
1064 use a different approach than Octave's in the case of singular, under-, | |
1065 or over-determined matrices. In the case of a singular matrix, Matlab | |
1066 returns the result given by the LU decomposition, even though the underlying | |
1067 solver has flagged the result as erroneous. Octave has made the choice | |
1068 of falling back to a minimum norm solution of matrices that have been | |
1069 flagged as singular which arguably is a better result for these cases. | |
1070 | |
1071 In the case of under- or over-determined matrices, Octave continues to | |
1072 use a minimum norm solution, whereas Matlab uses an approach that is | |
1073 equivalent to | |
1074 | |
1075 @example | |
1076 @group | |
1077 function x = mldivide (A, b) | |
1078 [Q, R, E] = qr(A); | |
1079 x = [A \ b, E(:, 1:m) * (R(:, 1:m) \ (Q' * b))] | |
1080 end | |
1081 @end group | |
1082 @end example | |
1083 | |
1084 @noindent | |
1085 While this approach is certainly faster and uses less memory than | |
1086 Octave's minimum norm approach, this approach seems to be inferior in | |
1087 other ways. | |
1088 | |
1089 A numerical question arises: how big can the null space component become, | |
1090 relative to the minimum-norm solution? Can it be nicely bounded, or can it be | |
1091 arbitrarily big? Consider this example: | |
1092 | |
1093 @example | |
1094 @group | |
1095 m = 10; | |
1096 n = 10000; | |
1097 A = ones(m, n) + 1e-6 * randn(m,n); | |
1098 b = ones(m, 1) + 1e-6 * randn(m,1); | |
1099 norm(A \ b) | |
1100 @end group | |
1101 @end example | |
1102 | |
1103 @noindent | |
1104 while Octave's minimum-norm values are around 3e-2, Matlab's results | |
1105 are 50-times larger. For another issue, try this code: | |
1106 | |
1107 @example | |
1108 @group | |
1109 m = 5; | |
1110 n = 100; | |
1111 j = floor(m * rand(1, n)) + 1; | |
1112 b = ones(m, 1); | |
1113 A = zeros(m, n); | |
1114 A(sub2ind(size(A),j,1:n)) = 1; | |
1115 x = A \ b; | |
1116 [dummy,p] = sort(rand(1,n)); | |
1117 y = A(:,p)\b; | |
1118 norm(x(p)-y) | |
1119 @end group | |
1120 @end example | |
1121 | |
1122 @noindent | |
1123 It shows that unlike in Octave, mldivide in Matlab is not invariant | |
1124 with respect to column permutations. If there are multiple columns of | |
1125 the same norm, permuting columns of the matrix gets you different | |
1126 result than permuting the solution vector. This will surprise many | |
1127 users. | |
1128 | |
1129 Since the mldivide (\) and mrdivide (/) operators are often part of a more | |
1130 complex expression, where there is no room to react to warnings or flags, it | |
1131 should prefer intelligence (robustness) to speed, and so the Octave developers | |
1132 are firmly of the opinion that Octave's approach for singular, under- and | |
1133 over-determined matrices is a better choice that Matlab's | |
1134 | |
1135 @item Octave extensions | |
1136 The extensions in Octave over @sc{Matlab} syntax are | |
1137 very useful, but might cause issues when sharing with @sc{Matlab} users. | |
1138 A list of the major extensions that should be avoided to be compatible | |
1139 with @sc{Matlab} are | |
1140 | |
1141 @itemize @bullet | |
1142 @item | |
1143 Comments in octave can be marked with @samp{#}. This allows POSIX | |
1144 systems to have the first line as @samp{#! octave -q} and mark the script | |
1145 itself executable. @sc{Matlab} doesn't have this feature due to the | |
1146 absence of comments starting with @samp{#}". | |
1147 | |
1148 @item | |
1149 Code blocks like if, for, while, etc can be terminated with block | |
1150 specific terminations like "endif". @sc{Matlab} doesn't have this and | |
1151 all blocks must be terminated with "end" | |
1152 | |
1153 @item | |
1154 Octave has a lisp like unwind_protect block that allows blocks of | |
1155 code that terminate in an error to ensure that the variables that | |
1156 are touched are restored. You can do something similar with | |
1157 @code{try}/@code{catch} combined with @samp{rethrow (lasterror ())} in | |
1158 @sc{Matlab}, however rethrow and lasterror are only available in Octave 2.9.10 and later. | |
1159 | |
1160 Note that using @code{try}/@code{catch} combined with @samp{rethrow | |
1161 (lasterror ())} can not guarantee that global variables will be | |
1162 correctly reset, as it won't catch user interrupts with Ctrl-C. For | |
1163 example | |
1164 | |
1165 @example | |
1166 @group | |
1167 global a | |
1168 a = 1; | |
1169 try | |
1170 _a = a; | |
1171 a = 2 | |
1172 while true | |
1173 end | |
1174 catch | |
1175 fprintf ('caught interrupt\n'); | |
1176 a = _a; | |
1177 rethrow (lasterror()); | |
1178 end | |
1179 @end group | |
1180 @end example | |
1181 | |
1182 @noindent | |
1183 compared to | |
1184 | |
1185 @example | |
1186 @group | |
1187 global a | |
1188 a = 1; | |
1189 unwind_protect | |
1190 _a = a; | |
1191 a = 2 | |
1192 while true | |
1193 end | |
1194 unwind_protect_cleanup | |
1195 fprintf ('caught interrupt\n'); | |
1196 a = _a; | |
1197 end | |
1198 @end group | |
1199 @end example | |
1200 | |
1201 Typing Ctrl-C in the first case returns the user directly to the | |
1202 prompt, and the variable "a" is not reset to the saved value. In the | |
1203 second case the variable "a" is reset correctly. Therefore @sc{Matlab} | |
1204 gives no save way of temporarily changing global variables. | |
1205 | |
1206 @item | |
1207 Indexing can be applied to all objects in Octave and not just | |
1208 variable. Therefore @code{sin(x)(1:10);} for example is perfectly valid | |
1209 in Octave but not @sc{Matlab}. To do the same in @sc{Matlab} you must do | |
1210 @code{y = sin(x); y = y([1:10]);} | |
1211 | |
1212 @item | |
1213 Octave has the operators "++", "--", "-=", "+=", "*=", etc. As | |
1214 @sc{Matlab} doesn't, if you are sharing code these should be avoided. | |
1215 | |
1216 @item | |
1217 Character strings in Octave can be denoted with double or single | |
1218 quotes. There is a subtle difference between the two in that escaped | |
1219 characters like @code{\n} (newline), @code{\t} (tab), etc are | |
1220 interpreted in double quoted strings but not single quoted strings. This | |
1221 difference is important on Windows platforms where the "\" character is | |
1222 used in path names, and so single quoted strings should be used in | |
1223 paths. @sc{Matlab} doesn't have double quoted strings and so they should | |
1224 be avoided if the code will be transfered to a @sc{Matlab} user. | |
1225 @end itemize | |
1226 | |
1227 @end itemize | |
1228 | |
1229 @node Index | |
1230 @appendix Concept Index | |
1231 | |
1232 @printindex cp | |
1233 | |
1234 @page | |
1235 @contents | |
1236 @bye |