mirror of
https://github.com/K-Dense-AI/claude-scientific-skills.git
synced 2026-01-26 16:58:56 +08:00
545 lines
9.7 KiB
Markdown
545 lines
9.7 KiB
Markdown
# GNU Octave Compatibility Reference
|
|
|
|
## Table of Contents
|
|
1. [Overview](#overview)
|
|
2. [Syntax Differences](#syntax-differences)
|
|
3. [Operator Differences](#operator-differences)
|
|
4. [Function Differences](#function-differences)
|
|
5. [Features Unique to Octave](#features-unique-to-octave)
|
|
6. [Features Missing in Octave](#features-missing-in-octave)
|
|
7. [Writing Compatible Code](#writing-compatible-code)
|
|
8. [Octave Packages](#octave-packages)
|
|
|
|
## Overview
|
|
|
|
GNU Octave is a free, open-source alternative to MATLAB with high compatibility. Most MATLAB scripts run in Octave with no or minimal modifications. However, there are some differences to be aware of.
|
|
|
|
### Installation
|
|
|
|
```bash
|
|
# macOS (Homebrew)
|
|
brew install octave
|
|
|
|
# Ubuntu/Debian
|
|
sudo apt install octave
|
|
|
|
# Fedora
|
|
sudo dnf install octave
|
|
|
|
# Windows
|
|
# Download installer from https://octave.org/download
|
|
```
|
|
|
|
### Running Octave
|
|
|
|
```bash
|
|
# Interactive mode
|
|
octave
|
|
|
|
# Run script
|
|
octave script.m
|
|
octave --eval "disp('Hello')"
|
|
|
|
# GUI mode
|
|
octave --gui
|
|
|
|
# Command-line only (no graphics)
|
|
octave --no-gui
|
|
octave-cli
|
|
```
|
|
|
|
## Syntax Differences
|
|
|
|
### Comments
|
|
|
|
```matlab
|
|
% MATLAB style (works in both)
|
|
% This is a comment
|
|
|
|
# Octave style (Octave only)
|
|
# This is also a comment in Octave
|
|
|
|
% For compatibility, always use %
|
|
```
|
|
|
|
### String Quotes
|
|
|
|
```matlab
|
|
% MATLAB: Single quotes only (char arrays)
|
|
str = 'Hello'; % char array
|
|
str = "Hello"; % string (R2017a+)
|
|
|
|
% Octave: Both work, but different behavior
|
|
str1 = 'Hello'; % char array, no escape sequences
|
|
str2 = "Hello\n"; % Interprets \n as newline
|
|
|
|
% For compatibility, use single quotes for char arrays
|
|
% Avoid double quotes with escape sequences
|
|
```
|
|
|
|
### Line Continuation
|
|
|
|
```matlab
|
|
% MATLAB style (works in both)
|
|
x = 1 + 2 + 3 + ...
|
|
4 + 5;
|
|
|
|
% Octave also accepts backslash
|
|
x = 1 + 2 + 3 + \
|
|
4 + 5;
|
|
|
|
% For compatibility, use ...
|
|
```
|
|
|
|
### Block Terminators
|
|
|
|
```matlab
|
|
% MATLAB style (works in both)
|
|
if condition
|
|
% code
|
|
end
|
|
|
|
for i = 1:10
|
|
% code
|
|
end
|
|
|
|
% Octave also accepts specific terminators
|
|
if condition
|
|
# code
|
|
endif
|
|
|
|
for i = 1:10
|
|
# code
|
|
endfor
|
|
|
|
while condition
|
|
# code
|
|
endwhile
|
|
|
|
% For compatibility, always use 'end'
|
|
```
|
|
|
|
### Function Definitions
|
|
|
|
```matlab
|
|
% MATLAB requires function in file with same name
|
|
% Octave allows command-line function definitions
|
|
|
|
% Octave command-line function
|
|
function y = f(x)
|
|
y = x^2;
|
|
endfunction
|
|
|
|
% For compatibility, define functions in .m files
|
|
```
|
|
|
|
## Operator Differences
|
|
|
|
### Increment/Decrement Operators
|
|
|
|
```matlab
|
|
% Octave has C-style operators (MATLAB does not)
|
|
x++; % x = x + 1
|
|
x--; % x = x - 1
|
|
++x; % Pre-increment
|
|
--x; % Pre-decrement
|
|
|
|
% For compatibility, use explicit assignment
|
|
x = x + 1;
|
|
x = x - 1;
|
|
```
|
|
|
|
### Compound Assignment
|
|
|
|
```matlab
|
|
% Octave supports (MATLAB does not)
|
|
x += 5; % x = x + 5
|
|
x -= 3; % x = x - 3
|
|
x *= 2; % x = x * 2
|
|
x /= 4; % x = x / 4
|
|
x ^= 2; % x = x ^ 2
|
|
|
|
% Element-wise versions
|
|
x .+= y;
|
|
x .-= y;
|
|
x .*= y;
|
|
x ./= y;
|
|
x .^= y;
|
|
|
|
% For compatibility, use explicit assignment
|
|
x = x + 5;
|
|
x = x .* y;
|
|
```
|
|
|
|
### Logical Operators
|
|
|
|
```matlab
|
|
% Both support
|
|
& | ~ && ||
|
|
|
|
% Short-circuit behavior difference:
|
|
% MATLAB: & and | short-circuit in if/while conditions
|
|
% Octave: Only && and || short-circuit
|
|
|
|
% For predictable behavior, use:
|
|
% && || for scalar short-circuit logic
|
|
% & | for element-wise operations
|
|
```
|
|
|
|
### Indexing After Expression
|
|
|
|
```matlab
|
|
% Octave allows indexing immediately after expression
|
|
result = sin(x)(1:10); % First 10 elements of sin(x)
|
|
value = func(arg).field; % Access field of returned struct
|
|
|
|
% MATLAB requires intermediate variable
|
|
temp = sin(x);
|
|
result = temp(1:10);
|
|
|
|
temp = func(arg);
|
|
value = temp.field;
|
|
|
|
% For compatibility, use intermediate variables
|
|
```
|
|
|
|
## Function Differences
|
|
|
|
### Built-in Functions
|
|
|
|
Most basic functions are compatible. Some differences:
|
|
|
|
```matlab
|
|
% Function name differences
|
|
% MATLAB Octave Alternative
|
|
% ------ ------------------
|
|
% inputname (not available)
|
|
% inputParser (partial support)
|
|
% validateattributes (partial support)
|
|
|
|
% Behavior differences in edge cases
|
|
% Check documentation for specific functions
|
|
```
|
|
|
|
### Random Number Generation
|
|
|
|
```matlab
|
|
% Both use Mersenne Twister by default
|
|
% Seed setting is similar
|
|
rng(42); % MATLAB
|
|
rand('seed', 42); % Octave (also accepts rng syntax)
|
|
|
|
% For compatibility
|
|
rng(42); % Works in modern Octave
|
|
```
|
|
|
|
### Graphics
|
|
|
|
```matlab
|
|
% Basic plotting is compatible
|
|
plot(x, y);
|
|
xlabel('X'); ylabel('Y');
|
|
title('Title');
|
|
legend('Data');
|
|
|
|
% Some advanced features differ
|
|
% - Octave uses gnuplot or Qt graphics
|
|
% - Some property names may differ
|
|
% - Animation/GUI features vary
|
|
|
|
% Test graphics code in both environments
|
|
```
|
|
|
|
### File I/O
|
|
|
|
```matlab
|
|
% Basic I/O is compatible
|
|
save('file.mat', 'x', 'y');
|
|
load('file.mat');
|
|
dlmread('file.txt');
|
|
dlmwrite('file.txt', data);
|
|
|
|
% MAT-file versions
|
|
save('file.mat', '-v7'); % Compatible format
|
|
save('file.mat', '-v7.3'); % HDF5 format (partial Octave support)
|
|
|
|
% For compatibility, use -v7 or -v6
|
|
```
|
|
|
|
## Features Unique to Octave
|
|
|
|
### do-until Loop
|
|
|
|
```matlab
|
|
% Octave only
|
|
do
|
|
x = x + 1;
|
|
until (x > 10)
|
|
|
|
% Equivalent MATLAB/compatible code
|
|
x = x + 1;
|
|
while x <= 10
|
|
x = x + 1;
|
|
end
|
|
```
|
|
|
|
### unwind_protect
|
|
|
|
```matlab
|
|
% Octave only - guaranteed cleanup
|
|
unwind_protect
|
|
% code that might error
|
|
result = risky_operation();
|
|
unwind_protect_cleanup
|
|
% always executed (like finally)
|
|
cleanup();
|
|
end_unwind_protect
|
|
|
|
% MATLAB equivalent
|
|
try
|
|
result = risky_operation();
|
|
catch
|
|
end
|
|
cleanup(); % Not guaranteed if error not caught
|
|
```
|
|
|
|
### Built-in Documentation
|
|
|
|
```matlab
|
|
% Octave supports Texinfo documentation in functions
|
|
function y = myfunction(x)
|
|
%% -*- texinfo -*-
|
|
%% @deftypefn {Function File} {@var{y} =} myfunction (@var{x})
|
|
%% Description of myfunction.
|
|
%% @end deftypefn
|
|
y = x.^2;
|
|
endfunction
|
|
```
|
|
|
|
### Package System
|
|
|
|
```matlab
|
|
% Octave Forge packages
|
|
pkg install -forge control
|
|
pkg load control
|
|
|
|
% List installed packages
|
|
pkg list
|
|
|
|
% For MATLAB compatibility, use equivalent toolboxes
|
|
% or include package functionality directly
|
|
```
|
|
|
|
## Features Missing in Octave
|
|
|
|
### Simulink
|
|
|
|
```matlab
|
|
% No Octave equivalent
|
|
% Simulink models (.slx, .mdl) cannot run in Octave
|
|
```
|
|
|
|
### MATLAB Toolboxes
|
|
|
|
```matlab
|
|
% Many toolbox functions not available
|
|
% Some have Octave Forge equivalents:
|
|
|
|
% MATLAB Toolbox Octave Forge Package
|
|
% --------------- --------------------
|
|
% Control System control
|
|
% Signal Processing signal
|
|
% Image Processing image
|
|
% Statistics statistics
|
|
% Optimization optim
|
|
|
|
% Check pkg list for available packages
|
|
```
|
|
|
|
### App Designer / GUIDE
|
|
|
|
```matlab
|
|
% MATLAB GUI tools not available in Octave
|
|
% Octave has basic UI functions:
|
|
uicontrol, uimenu, figure properties
|
|
|
|
% For cross-platform GUIs, consider:
|
|
% - Web-based interfaces
|
|
% - Qt (via Octave's Qt graphics)
|
|
```
|
|
|
|
### Object-Oriented Programming
|
|
|
|
```matlab
|
|
% Octave has partial classdef support
|
|
% Some features missing or behave differently:
|
|
% - Handle class events
|
|
% - Property validation
|
|
% - Some access modifiers
|
|
|
|
% For compatibility, use simpler OOP patterns
|
|
% or struct-based approaches
|
|
```
|
|
|
|
### Live Scripts
|
|
|
|
```matlab
|
|
% .mlx files are MATLAB-only
|
|
% Use regular .m scripts for compatibility
|
|
```
|
|
|
|
## Writing Compatible Code
|
|
|
|
### Detection
|
|
|
|
```matlab
|
|
function tf = isOctave()
|
|
tf = exist('OCTAVE_VERSION', 'builtin') ~= 0;
|
|
end
|
|
|
|
% Use for conditional code
|
|
if isOctave()
|
|
% Octave-specific code
|
|
else
|
|
% MATLAB-specific code
|
|
end
|
|
```
|
|
|
|
### Best Practices
|
|
|
|
```matlab
|
|
% 1. Use % for comments, not #
|
|
% Good
|
|
% This is a comment
|
|
|
|
% Avoid
|
|
# This is a comment (Octave only)
|
|
|
|
% 2. Use ... for line continuation
|
|
% Good
|
|
x = 1 + 2 + 3 + ...
|
|
4 + 5;
|
|
|
|
% Avoid
|
|
x = 1 + 2 + 3 + \
|
|
4 + 5;
|
|
|
|
% 3. Use 'end' for all blocks
|
|
% Good
|
|
if condition
|
|
code
|
|
end
|
|
|
|
% Avoid
|
|
if condition
|
|
code
|
|
endif
|
|
|
|
% 4. Avoid compound operators
|
|
% Good
|
|
x = x + 1;
|
|
|
|
% Avoid
|
|
x++;
|
|
x += 1;
|
|
|
|
% 5. Use single quotes for strings
|
|
% Good
|
|
str = 'Hello World';
|
|
|
|
% Avoid (escape sequence issues)
|
|
str = "Hello\nWorld";
|
|
|
|
% 6. Use intermediate variables for indexing
|
|
% Good
|
|
temp = func(arg);
|
|
result = temp(1:10);
|
|
|
|
% Avoid (Octave only)
|
|
result = func(arg)(1:10);
|
|
|
|
% 7. Save MAT-files in compatible format
|
|
save('data.mat', 'x', 'y', '-v7');
|
|
```
|
|
|
|
### Testing Compatibility
|
|
|
|
```bash
|
|
# Test in both environments
|
|
matlab -nodisplay -nosplash -r "run('test_script.m'); exit;"
|
|
octave --no-gui test_script.m
|
|
|
|
# Create test script
|
|
# test_script.m:
|
|
# try
|
|
# main_function();
|
|
# disp('Test passed');
|
|
# catch ME
|
|
# disp(['Test failed: ' ME.message]);
|
|
# end
|
|
```
|
|
|
|
## Octave Packages
|
|
|
|
### Installing Packages
|
|
|
|
```matlab
|
|
% Install from Octave Forge
|
|
pkg install -forge package_name
|
|
|
|
% Install from file
|
|
pkg install package_file.tar.gz
|
|
|
|
% Install from URL
|
|
pkg install 'http://example.com/package.tar.gz'
|
|
|
|
% Uninstall
|
|
pkg uninstall package_name
|
|
```
|
|
|
|
### Using Packages
|
|
|
|
```matlab
|
|
% Load package (required before use)
|
|
pkg load control
|
|
pkg load signal
|
|
pkg load image
|
|
|
|
% Load at startup (add to .octaverc)
|
|
pkg load control
|
|
|
|
% List loaded packages
|
|
pkg list
|
|
|
|
% Unload package
|
|
pkg unload control
|
|
```
|
|
|
|
### Common Packages
|
|
|
|
| Package | Description |
|
|
|---------|-------------|
|
|
| control | Control systems design |
|
|
| signal | Signal processing |
|
|
| image | Image processing |
|
|
| statistics | Statistical functions |
|
|
| optim | Optimization algorithms |
|
|
| io | Input/output functions |
|
|
| struct | Structure manipulation |
|
|
| symbolic | Symbolic math (via SymPy) |
|
|
| parallel | Parallel computing |
|
|
| netcdf | NetCDF file support |
|
|
|
|
### Package Management
|
|
|
|
```matlab
|
|
% Update all packages
|
|
pkg update
|
|
|
|
% Get package description
|
|
pkg describe package_name
|
|
|
|
% Check for updates
|
|
pkg list % Compare with Octave Forge website
|
|
```
|