mirror of
https://github.com/K-Dense-AI/claude-scientific-skills.git
synced 2026-01-26 16:58:56 +08:00
673 lines
12 KiB
Markdown
673 lines
12 KiB
Markdown
# Programming Reference
|
|
|
|
## Table of Contents
|
|
1. [Scripts and Functions](#scripts-and-functions)
|
|
2. [Control Flow](#control-flow)
|
|
3. [Function Types](#function-types)
|
|
4. [Error Handling](#error-handling)
|
|
5. [Performance and Debugging](#performance-and-debugging)
|
|
6. [Object-Oriented Programming](#object-oriented-programming)
|
|
|
|
## Scripts and Functions
|
|
|
|
### Scripts
|
|
|
|
```matlab
|
|
% Scripts are .m files with MATLAB commands
|
|
% They run in the base workspace (share variables)
|
|
|
|
% Example: myscript.m
|
|
% This is a comment
|
|
x = 1:10;
|
|
y = x.^2;
|
|
plot(x, y);
|
|
title('My Plot');
|
|
|
|
% Run script
|
|
myscript; % Or: run('myscript.m')
|
|
```
|
|
|
|
### Functions
|
|
|
|
```matlab
|
|
% Functions have their own workspace
|
|
% Save in file with same name as function
|
|
|
|
% Example: myfunction.m
|
|
function y = myfunction(x)
|
|
%MYFUNCTION Brief description of function
|
|
% Y = MYFUNCTION(X) detailed description
|
|
%
|
|
% Example:
|
|
% y = myfunction(5);
|
|
%
|
|
% See also OTHERFUNCTION
|
|
y = x.^2;
|
|
end
|
|
|
|
% Multiple outputs
|
|
function [result1, result2] = multioutput(x)
|
|
result1 = x.^2;
|
|
result2 = x.^3;
|
|
end
|
|
|
|
% Variable arguments
|
|
function varargout = flexfun(varargin)
|
|
% varargin is cell array of inputs
|
|
% varargout is cell array of outputs
|
|
n = nargin; % Number of inputs
|
|
m = nargout; % Number of outputs
|
|
end
|
|
```
|
|
|
|
### Input Validation
|
|
|
|
```matlab
|
|
function result = validatedinput(x, options)
|
|
arguments
|
|
x (1,:) double {mustBePositive}
|
|
options.Normalize (1,1) logical = false
|
|
options.Scale (1,1) double {mustBePositive} = 1
|
|
end
|
|
|
|
result = x * options.Scale;
|
|
if options.Normalize
|
|
result = result / max(result);
|
|
end
|
|
end
|
|
|
|
% Usage
|
|
y = validatedinput([1 2 3], 'Normalize', true, 'Scale', 2);
|
|
|
|
% Common validators
|
|
% mustBePositive, mustBeNegative, mustBeNonzero
|
|
% mustBeInteger, mustBeNumeric, mustBeFinite
|
|
% mustBeNonNaN, mustBeReal, mustBeNonempty
|
|
% mustBeMember, mustBeInRange, mustBeGreaterThan
|
|
```
|
|
|
|
### Local Functions
|
|
|
|
```matlab
|
|
% Local functions appear after main function
|
|
% Only accessible within the same file
|
|
|
|
function result = mainfunction(x)
|
|
intermediate = helper1(x);
|
|
result = helper2(intermediate);
|
|
end
|
|
|
|
function y = helper1(x)
|
|
y = x.^2;
|
|
end
|
|
|
|
function y = helper2(x)
|
|
y = sqrt(x);
|
|
end
|
|
```
|
|
|
|
## Control Flow
|
|
|
|
### Conditional Statements
|
|
|
|
```matlab
|
|
% if-elseif-else
|
|
if condition1
|
|
% statements
|
|
elseif condition2
|
|
% statements
|
|
else
|
|
% statements
|
|
end
|
|
|
|
% Logical operators
|
|
% & - AND (element-wise)
|
|
% | - OR (element-wise)
|
|
% ~ - NOT
|
|
% && - AND (short-circuit, scalars)
|
|
% || - OR (short-circuit, scalars)
|
|
% == - Equal
|
|
% ~= - Not equal
|
|
% <, <=, >, >= - Comparisons
|
|
|
|
% Example
|
|
if x > 0 && y > 0
|
|
quadrant = 1;
|
|
elseif x < 0 && y > 0
|
|
quadrant = 2;
|
|
elseif x < 0 && y < 0
|
|
quadrant = 3;
|
|
else
|
|
quadrant = 4;
|
|
end
|
|
```
|
|
|
|
### Switch Statements
|
|
|
|
```matlab
|
|
switch expression
|
|
case value1
|
|
% statements
|
|
case {value2, value3} % Multiple values
|
|
% statements
|
|
otherwise
|
|
% default statements
|
|
end
|
|
|
|
% Example
|
|
switch dayOfWeek
|
|
case {'Saturday', 'Sunday'}
|
|
dayType = 'Weekend';
|
|
case {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'}
|
|
dayType = 'Weekday';
|
|
otherwise
|
|
dayType = 'Unknown';
|
|
end
|
|
```
|
|
|
|
### For Loops
|
|
|
|
```matlab
|
|
% Basic for loop
|
|
for i = 1:10
|
|
% statements using i
|
|
end
|
|
|
|
% Custom step
|
|
for i = 10:-1:1
|
|
% count down
|
|
end
|
|
|
|
% Loop over vector
|
|
for val = [1 3 5 7 9]
|
|
% val takes each value
|
|
end
|
|
|
|
% Loop over columns of matrix
|
|
for col = A
|
|
% col is a column vector
|
|
end
|
|
|
|
% Loop over cell array
|
|
for i = 1:length(C)
|
|
item = C{i};
|
|
end
|
|
```
|
|
|
|
### While Loops
|
|
|
|
```matlab
|
|
% Basic while loop
|
|
while condition
|
|
% statements
|
|
% Update condition
|
|
end
|
|
|
|
% Example
|
|
count = 0;
|
|
while count < 10
|
|
count = count + 1;
|
|
% Do something
|
|
end
|
|
```
|
|
|
|
### Loop Control
|
|
|
|
```matlab
|
|
% Break - exit loop immediately
|
|
for i = 1:100
|
|
if someCondition
|
|
break;
|
|
end
|
|
end
|
|
|
|
% Continue - skip to next iteration
|
|
for i = 1:100
|
|
if skipCondition
|
|
continue;
|
|
end
|
|
% Process i
|
|
end
|
|
|
|
% Return - exit function
|
|
function y = myfunction(x)
|
|
if x < 0
|
|
y = NaN;
|
|
return;
|
|
end
|
|
y = sqrt(x);
|
|
end
|
|
```
|
|
|
|
## Function Types
|
|
|
|
### Anonymous Functions
|
|
|
|
```matlab
|
|
% Create inline function
|
|
f = @(x) x.^2 + 2*x + 1;
|
|
g = @(x, y) x.^2 + y.^2;
|
|
|
|
% Use
|
|
y = f(5); % 36
|
|
z = g(3, 4); % 25
|
|
|
|
% With captured variables
|
|
a = 2;
|
|
h = @(x) a * x; % Captures current value of a
|
|
y = h(5); % 10
|
|
a = 3; % Changing a doesn't affect h
|
|
y = h(5); % Still 10
|
|
|
|
% No arguments
|
|
now_fn = @() datestr(now);
|
|
timestamp = now_fn();
|
|
|
|
% Pass to other functions
|
|
result = integral(f, 0, 1);
|
|
```
|
|
|
|
### Nested Functions
|
|
|
|
```matlab
|
|
function result = outerfunction(x)
|
|
y = x.^2; % Shared with nested functions
|
|
|
|
function z = nestedfunction(a)
|
|
z = y + a; % Can access y from outer scope
|
|
end
|
|
|
|
result = nestedfunction(10);
|
|
end
|
|
```
|
|
|
|
### Function Handles
|
|
|
|
```matlab
|
|
% Create handle to existing function
|
|
h = @sin;
|
|
y = h(pi/2); % 1
|
|
|
|
% From string
|
|
h = str2func('cos');
|
|
|
|
% Get function name
|
|
name = func2str(h);
|
|
|
|
% Get handles to local functions
|
|
handles = localfunctions;
|
|
|
|
% Function info
|
|
info = functions(h);
|
|
```
|
|
|
|
### Callbacks
|
|
|
|
```matlab
|
|
% Using function handles as callbacks
|
|
|
|
% Timer example
|
|
t = timer('TimerFcn', @myCallback, 'Period', 1);
|
|
start(t);
|
|
|
|
function myCallback(~, ~)
|
|
disp(['Time: ' datestr(now)]);
|
|
end
|
|
|
|
% With anonymous function
|
|
t = timer('TimerFcn', @(~,~) disp('Tick'), 'Period', 1);
|
|
|
|
% GUI callbacks
|
|
uicontrol('Style', 'pushbutton', 'Callback', @buttonPressed);
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
### Try-Catch
|
|
|
|
```matlab
|
|
try
|
|
% Code that might error
|
|
result = riskyOperation();
|
|
catch ME
|
|
% Handle error
|
|
disp(['Error: ' ME.message]);
|
|
disp(['Identifier: ' ME.identifier]);
|
|
|
|
% Optionally rethrow
|
|
rethrow(ME);
|
|
end
|
|
|
|
% Catch specific errors
|
|
try
|
|
result = operation();
|
|
catch ME
|
|
switch ME.identifier
|
|
case 'MATLAB:divideByZero'
|
|
result = Inf;
|
|
case 'MATLAB:nomem'
|
|
rethrow(ME);
|
|
otherwise
|
|
result = NaN;
|
|
end
|
|
end
|
|
```
|
|
|
|
### Throwing Errors
|
|
|
|
```matlab
|
|
% Simple error
|
|
error('Something went wrong');
|
|
|
|
% With identifier
|
|
error('MyPkg:InvalidInput', 'Input must be positive');
|
|
|
|
% With formatting
|
|
error('MyPkg:OutOfRange', 'Value %f is out of range [%f, %f]', val, lo, hi);
|
|
|
|
% Create and throw exception
|
|
ME = MException('MyPkg:Error', 'Error message');
|
|
throw(ME);
|
|
|
|
% Assertion
|
|
assert(condition, 'Message if false');
|
|
assert(x > 0, 'MyPkg:NotPositive', 'x must be positive');
|
|
```
|
|
|
|
### Warnings
|
|
|
|
```matlab
|
|
% Issue warning
|
|
warning('This might be a problem');
|
|
warning('MyPkg:Warning', 'Warning message');
|
|
|
|
% Control warnings
|
|
warning('off', 'MyPkg:Warning'); % Disable specific warning
|
|
warning('on', 'MyPkg:Warning'); % Enable
|
|
warning('off', 'all'); % Disable all
|
|
warning('on', 'all'); % Enable all
|
|
|
|
% Query warning state
|
|
s = warning('query', 'MyPkg:Warning');
|
|
|
|
% Temporarily disable
|
|
origState = warning('off', 'MATLAB:nearlySingularMatrix');
|
|
% ... code ...
|
|
warning(origState);
|
|
```
|
|
|
|
## Performance and Debugging
|
|
|
|
### Timing
|
|
|
|
```matlab
|
|
% Simple timing
|
|
tic;
|
|
% ... code ...
|
|
elapsed = toc;
|
|
|
|
% Multiple timers
|
|
t1 = tic;
|
|
% ... code ...
|
|
elapsed1 = toc(t1);
|
|
|
|
% CPU time
|
|
t = cputime;
|
|
% ... code ...
|
|
cpuElapsed = cputime - t;
|
|
|
|
% Profiler
|
|
profile on;
|
|
myfunction();
|
|
profile viewer; % GUI to analyze results
|
|
p = profile('info'); % Get programmatic results
|
|
profile off;
|
|
```
|
|
|
|
### Memory
|
|
|
|
```matlab
|
|
% Memory info
|
|
[user, sys] = memory; % Windows only
|
|
whos; % Variable sizes
|
|
|
|
% Clear variables
|
|
clear x y z;
|
|
clear all; % All variables (use sparingly)
|
|
clearvars -except x y; % Keep specific variables
|
|
```
|
|
|
|
### Debugging
|
|
|
|
```matlab
|
|
% Set breakpoints (in editor or programmatically)
|
|
dbstop in myfunction at 10
|
|
dbstop if error
|
|
dbstop if warning
|
|
dbstop if naninf % Stop on NaN or Inf
|
|
|
|
% Step through code
|
|
dbstep % Next line
|
|
dbstep in % Step into function
|
|
dbstep out % Step out of function
|
|
dbcont % Continue execution
|
|
dbquit % Quit debugging
|
|
|
|
% Clear breakpoints
|
|
dbclear all
|
|
|
|
% Examine state
|
|
dbstack % Call stack
|
|
whos % Variables
|
|
```
|
|
|
|
### Vectorization Tips
|
|
|
|
```matlab
|
|
% AVOID loops when possible
|
|
% Slow:
|
|
for i = 1:n
|
|
y(i) = x(i)^2;
|
|
end
|
|
|
|
% Fast:
|
|
y = x.^2;
|
|
|
|
% Element-wise operations (use . prefix)
|
|
y = a .* b; % Element-wise multiply
|
|
y = a ./ b; % Element-wise divide
|
|
y = a .^ b; % Element-wise power
|
|
|
|
% Built-in functions operate on arrays
|
|
y = sin(x); % Apply to all elements
|
|
s = sum(x); % Sum all
|
|
m = max(x); % Maximum
|
|
|
|
% Logical indexing instead of find
|
|
% Slow:
|
|
idx = find(x > 0);
|
|
y = x(idx);
|
|
|
|
% Fast:
|
|
y = x(x > 0);
|
|
|
|
% Preallocate arrays
|
|
% Slow:
|
|
y = [];
|
|
for i = 1:n
|
|
y(i) = compute(i);
|
|
end
|
|
|
|
% Fast:
|
|
y = zeros(1, n);
|
|
for i = 1:n
|
|
y(i) = compute(i);
|
|
end
|
|
```
|
|
|
|
### Parallel Computing
|
|
|
|
```matlab
|
|
% Parallel for loop
|
|
parfor i = 1:n
|
|
results(i) = compute(i);
|
|
end
|
|
|
|
% Note: parfor has restrictions
|
|
% - Iterations must be independent
|
|
% - Variable classifications (sliced, broadcast, etc.)
|
|
|
|
% Start parallel pool
|
|
pool = parpool; % Default cluster
|
|
pool = parpool(4); % 4 workers
|
|
|
|
% Delete pool
|
|
delete(gcp('nocreate'));
|
|
|
|
% Parallel array operations
|
|
spmd
|
|
% Each worker executes this block
|
|
localData = myData(labindex);
|
|
result = process(localData);
|
|
end
|
|
```
|
|
|
|
## Object-Oriented Programming
|
|
|
|
### Class Definition
|
|
|
|
```matlab
|
|
% In file MyClass.m
|
|
classdef MyClass
|
|
properties
|
|
PublicProp
|
|
end
|
|
|
|
properties (Access = private)
|
|
PrivateProp
|
|
end
|
|
|
|
properties (Constant)
|
|
ConstProp = 42
|
|
end
|
|
|
|
methods
|
|
% Constructor
|
|
function obj = MyClass(value)
|
|
obj.PublicProp = value;
|
|
end
|
|
|
|
% Instance method
|
|
function result = compute(obj, x)
|
|
result = obj.PublicProp * x;
|
|
end
|
|
end
|
|
|
|
methods (Static)
|
|
function result = staticMethod(x)
|
|
result = x.^2;
|
|
end
|
|
end
|
|
end
|
|
```
|
|
|
|
### Using Classes
|
|
|
|
```matlab
|
|
% Create object
|
|
obj = MyClass(10);
|
|
|
|
% Access properties
|
|
val = obj.PublicProp;
|
|
obj.PublicProp = 20;
|
|
|
|
% Call methods
|
|
result = obj.compute(5);
|
|
result = compute(obj, 5); % Equivalent
|
|
|
|
% Static method
|
|
result = MyClass.staticMethod(3);
|
|
|
|
% Constant property
|
|
val = MyClass.ConstProp;
|
|
```
|
|
|
|
### Inheritance
|
|
|
|
```matlab
|
|
classdef DerivedClass < BaseClass
|
|
properties
|
|
ExtraProp
|
|
end
|
|
|
|
methods
|
|
function obj = DerivedClass(baseVal, extraVal)
|
|
% Call superclass constructor
|
|
obj@BaseClass(baseVal);
|
|
obj.ExtraProp = extraVal;
|
|
end
|
|
|
|
% Override method
|
|
function result = compute(obj, x)
|
|
% Call superclass method
|
|
baseResult = compute@BaseClass(obj, x);
|
|
result = baseResult + obj.ExtraProp;
|
|
end
|
|
end
|
|
end
|
|
```
|
|
|
|
### Handle vs Value Classes
|
|
|
|
```matlab
|
|
% Value class (default) - copy semantics
|
|
classdef ValueClass
|
|
properties
|
|
Data
|
|
end
|
|
end
|
|
|
|
a = ValueClass();
|
|
a.Data = 1;
|
|
b = a; % b is a copy
|
|
b.Data = 2; % a.Data is still 1
|
|
|
|
% Handle class - reference semantics
|
|
classdef HandleClass < handle
|
|
properties
|
|
Data
|
|
end
|
|
end
|
|
|
|
a = HandleClass();
|
|
a.Data = 1;
|
|
b = a; % b references same object
|
|
b.Data = 2; % a.Data is now 2
|
|
```
|
|
|
|
### Events and Listeners
|
|
|
|
```matlab
|
|
classdef EventClass < handle
|
|
events
|
|
DataChanged
|
|
end
|
|
|
|
properties
|
|
Data
|
|
end
|
|
|
|
methods
|
|
function set.Data(obj, value)
|
|
obj.Data = value;
|
|
notify(obj, 'DataChanged');
|
|
end
|
|
end
|
|
end
|
|
|
|
% Usage
|
|
obj = EventClass();
|
|
listener = addlistener(obj, 'DataChanged', @(src, evt) disp('Data changed!'));
|
|
obj.Data = 42; % Triggers event
|
|
```
|