FAQ: Difference between revisions

Jump to navigation Jump to search
89 bytes added ,  16 November 2011
Line 461: Line 461:


You should also look at the page http://octave.sourceforge.net/packages.html and http://octave.sourceforge.net/doc/ that has a function reference that is up to date. You can use this function reference to see the number of octave function that are available and their Matlab compatibility.
You should also look at the page http://octave.sourceforge.net/packages.html and http://octave.sourceforge.net/doc/ that has a function reference that is up to date. You can use this function reference to see the number of octave function that are available and their Matlab compatibility.
==How is Octave different from Matlab?==


The major differences between Octave 3.4.N and Matlab R2010b are:
The major differences between Octave 3.4.N and Matlab R2010b are:


==Nested Functions==
===Nested Functions===
Octave has limited support for nested functions. That is
Octave has limited support for nested functions. That is


Line 487: Line 489:
The authors of Octave consider the nested function scoping rules of Matlab to be more problems than they are worth as they introduce difficult to find bugs as inadvertently modifying a variable in a nested function that is also used in the parent is particularly easy.
The authors of Octave consider the nested function scoping rules of Matlab to be more problems than they are worth as they introduce difficult to find bugs as inadvertently modifying a variable in a nested function that is also used in the parent is particularly easy.


==Differences in core syntax==
===Differences in core syntax===


There a few core Matlab syntaxes that are not accepted by Octave, these being
There a few core Matlab syntaxes that are not accepted by Octave, these being
Line 497: Line 499:
* Matlab classdef object oriented programming is not yet supported, though work is underway and when development more on to Octave 3.5 this will be included in the development tree.
* Matlab classdef object oriented programming is not yet supported, though work is underway and when development more on to Octave 3.5 this will be included in the development tree.


==Differences in core functions==
===Differences in core functions===


A large number of the Matlab core functions (ie those that are in the core and not a toolbox) are implemented, and certainly all of the commonly used ones. There are a few functions that aren't implemented, usually to do with specific missing Octave functionality (GUI, DLL, Java, ActiveX, DDE, web, and serial functions). Some of the core functions have limitations that aren't in the Matlab version. For example the sprandn function can not force a particular condition number for the matrix like Matlab can.
A large number of the Matlab core functions (ie those that are in the core and not a toolbox) are implemented, and certainly all of the commonly used ones. There are a few functions that aren't implemented, usually to do with specific missing Octave functionality (GUI, DLL, Java, ActiveX, DDE, web, and serial functions). Some of the core functions have limitations that aren't in the Matlab version. For example the sprandn function can not force a particular condition number for the matrix like Matlab can.


==Just-In-Time compiler==
===Just-In-Time compiler===


Matlab includes a "Just-In-Time" compiler. This compiler allows the acceleration of for-loops in Matlab to almost native performance with certain restrictions. The JIT must know the return type of all functions called in the loops and so you can't include user functions in the loop of JIT optimized loops. Octave doesn't have a JIT and so to some might seem slower than Matlab. For this reason you must vectorize your code as much as possible. The MathWorks themselves have a good document discussing vectorization at http://www.mathworks.com/support/tech-notes/1100/1109.html.
Matlab includes a "Just-In-Time" compiler. This compiler allows the acceleration of for-loops in Matlab to almost native performance with certain restrictions. The JIT must know the return type of all functions called in the loops and so you can't include user functions in the loop of JIT optimized loops. Octave doesn't have a JIT and so to some might seem slower than Matlab. For this reason you must vectorize your code as much as possible. The MathWorks themselves have a good document discussing vectorization at http://www.mathworks.com/support/tech-notes/1100/1109.html.


==Compiler==
===Compiler===


On a related point, there is no Octave compiler, and so you can't convert your Octave code into a binary for additional speed or distribution. There have been several aborted attempts at creating an Octave compiler. Should the JIT compiler above ever be implemented, an Octave compiler should be more feasible.
On a related point, there is no Octave compiler, and so you can't convert your Octave code into a binary for additional speed or distribution. There have been several aborted attempts at creating an Octave compiler. Should the JIT compiler above ever be implemented, an Octave compiler should be more feasible.
==Graphic Handles==
 
===Graphic Handles===


Up to Octave 2.9.9 there was no support for graphic handles in Octave itself. In the 3.2.N versions of Octave and beyond the support for graphics handles is converging towards full compatibility. The patch function is currently limited to 2-D patches, due to an underlying limitation in gnuplot, but the experimental OpenGL backend is starting to see an implementation of 3-D patches.
Up to Octave 2.9.9 there was no support for graphic handles in Octave itself. In the 3.2.N versions of Octave and beyond the support for graphics handles is converging towards full compatibility. The patch function is currently limited to 2-D patches, due to an underlying limitation in gnuplot, but the experimental OpenGL backend is starting to see an implementation of 3-D patches.
Line 515: Line 518:
There are no Matlab compatible GUI functions. There are a number of bindings from Octave to Tcl/Tk, VTK and Zenity included in the Octave Forge project (http://octave.sourceforge.net) for example that can be used for a GUI, but these are not Matlab compatible. Work on a Matlab compatible GUI is in an alpha stage in the QtHandles project. This might be an issue if you intend to exchange Octave code with Matlab users.
There are no Matlab compatible GUI functions. There are a number of bindings from Octave to Tcl/Tk, VTK and Zenity included in the Octave Forge project (http://octave.sourceforge.net) for example that can be used for a GUI, but these are not Matlab compatible. Work on a Matlab compatible GUI is in an alpha stage in the QtHandles project. This might be an issue if you intend to exchange Octave code with Matlab users.


==Simulink==
===Simulink===


Octave itself includes no Simulink support. Typically the simulink models lag research and are less flexible, so shouldn't really be used in a research environment. However, some Matlab users that try to use Octave complain about this lack. There is a similar package to simulink for the Octave and R projects available at http://www.scicraft.org/
Octave itself includes no Simulink support. Typically the simulink models lag research and are less flexible, so shouldn't really be used in a research environment. However, some Matlab users that try to use Octave complain about this lack. There is a similar package to simulink for the Octave and R projects available at http://www.scicraft.org/


==Mex-Files==
===MEX-Files===


Octave includes an API to the Matlab MEX interface. However, as MEX is an API to the internals of Matlab and the internals of Octave differ from Matlab, there is necessarily a manipulation of the data to convert from a MEX interface to the Octave equivalent. This is notable for all complex matrices, where Matlab stores complex arrays as real and imaginary parts, whereas Octave respects the C99/C++ standards of co-locating the real/imag parts in memory. Also due to the way Matlab allows access to the arrays passed through a pointer, the MEX interface might require copies of arrays (even non complex ones).
Octave includes an API to the Matlab MEX interface. However, as MEX is an API to the internals of Matlab and the internals of Octave differ from Matlab, there is necessarily a manipulation of the data to convert from a MEX interface to the Octave equivalent. This is notable for all complex matrices, where Matlab stores complex arrays as real and imaginary parts, whereas Octave respects the C99/C++ standards of co-locating the real/imag parts in memory. Also due to the way Matlab allows access to the arrays passed through a pointer, the MEX interface might require copies of arrays (even non complex ones).
==Block comments==
 
===Block comments===


Block comments denoted by "%{" and "%}" markers are supported by Octave with some limitations. The major limitation is that block comments are not supported within [] or {}.
Block comments denoted by "%{" and "%}" markers are supported by Octave with some limitations. The major limitation is that block comments are not supported within [] or {}.


==Mat-File format==
===Mat-File format===


There are some differences in the mat v5 file format accepted by Octave. Matlab recently introduced the "-V7.3" save option which is an HDF5 format which is particularly useful for 64-bit platforms where the standard Matlab format can not correctly save variables. Octave accepts HDF5 files, but is not yet compatible with the "-v7.3" versions produced by Matlab.
There are some differences in the mat v5 file format accepted by Octave. Matlab recently introduced the "-V7.3" save option which is an HDF5 format which is particularly useful for 64-bit platforms where the standard Matlab format can not correctly save variables. Octave accepts HDF5 files, but is not yet compatible with the "-v7.3" versions produced by Matlab.
Line 534: Line 538:
Finally, Some multi-byte Unicode characters aren't yet treated in mat-files.
Finally, Some multi-byte Unicode characters aren't yet treated in mat-files.


==Profiler==
===Profiler===


Octave doesn't have a profiler, but there is one in the 3.5 development version, thanks to Daniel Kraft's 2011 Google Summer of Code project. It should be released with 3.6.
Current Octave releases don't have a profiler, but there is one in the 3.5 development version, thanks to Daniel Kraft's 2011 Google Summer of Code project. It should be released with 3.6.


==Toolboxes==
===Toolboxes===


Octave is a community project and so the toolboxes that exist are donated by those interested in them through the Octave Forge website (http://octave.sourceforge.net). These might be lacking in certain functionality relative to the Matlab toolboxes, and might not exactly duplicate the Matlab functionality or interface.
Octave is a community project and so the toolboxes that exist are donated by those interested in them through the Octave Forge website (http://octave.sourceforge.net). These might be lacking in certain functionality relative to the Matlab toolboxes, and might not exactly duplicate the Matlab functionality or interface.


==Short-circuit & and | operators==
===Short-circuit & and | operators===


The & and | operators in Matlab short-circuit when included in an if statement and not otherwise. In Octave only the && and || short circuit. Note that this means that
The & and | operators in Matlab short-circuit when included in an if statement and not otherwise. In Octave only the && and || short circuit. Note that this means that
Line 589: Line 593:
because samp ([]) == 1 because, despite the name, it is really returning true if none of the elements of the matrix are zero, and since there are no elements, well, none of them are zero. This is an example of vacuous truth. But, somewhere along the line, someone decided that if ([]) should be false. Mathworks probably thought it just looks wrong to have [] be true in this context even if you can use logical gymnastics to convince yourself that "all" the elements of a matrix that doesn't actually have any elements are nonzero. Octave however duplicates this behavior for if statements containing empty matrices.
because samp ([]) == 1 because, despite the name, it is really returning true if none of the elements of the matrix are zero, and since there are no elements, well, none of them are zero. This is an example of vacuous truth. But, somewhere along the line, someone decided that if ([]) should be false. Mathworks probably thought it just looks wrong to have [] be true in this context even if you can use logical gymnastics to convince yourself that "all" the elements of a matrix that doesn't actually have any elements are nonzero. Octave however duplicates this behavior for if statements containing empty matrices.


==Solvers for singular, under- and over-determined matrices==
===Solvers for singular, under- and over-determined matrices===


Matlab's solvers as used by the operators mldivide (\) and mrdivide (/), use a different approach than Octave's in the case of singular, under-, or over-determined matrices. In the case of a singular matrix, Matlab returns the result given by the LU decomposition, even though the underlying solver has flagged the result as erroneous. Octave has made the choice of falling back to a minimum norm solution of matrices that have been flagged as singular which arguably is a better result for these cases.
Matlab's solvers as used by the operators mldivide (\) and mrdivide (/), use a different approach than Octave's in the case of singular, under-, or over-determined matrices. In the case of a singular matrix, Matlab returns the result given by the LU decomposition, even though the underlying solver has flagged the result as erroneous. Octave has made the choice of falling back to a minimum norm solution of matrices that have been flagged as singular which arguably is a better result for these cases.
Line 627: Line 631:
Since the mldivide (\) and mrdivide (/) operators are often part of a more complex expression, where there is no room to react to warnings or flags, it should prefer intelligence (robustness) to speed, and so the Octave developers are firmly of the opinion that Octave's approach for singular, under- and over-determined matrices is a better choice that Matlab's
Since the mldivide (\) and mrdivide (/) operators are often part of a more complex expression, where there is no room to react to warnings or flags, it should prefer intelligence (robustness) to speed, and so the Octave developers are firmly of the opinion that Octave's approach for singular, under- and over-determined matrices is a better choice that Matlab's


==Octave extensions==
===Octave extensions===


The extensions in Octave over Matlab syntax are very useful, but might cause issues when sharing with Matlab users. A list of the major extensions that should be avoided to be compatible with Matlab are
The extensions in Octave over Matlab syntax are very useful, but might cause issues when sharing with Matlab users. A list of the major extensions that should be avoided to be compatible with Matlab are

Navigation menu