# Matrices and Arrays Reference

## Table of Contents

1. [Array Creation](#array-creation)
2. [Indexing and Subscripting](#indexing-and-subscripting)
3. [Array Manipulation](#array-manipulation)
4. [Concatenation and Reshaping](#concatenation-and-reshaping)
5. [Array Information](#array-information)
6. [Sorting and Searching](#sorting-and-searching)

## Array Creation

### Basic Creation

```matlab
% Direct specification
A = [1 2 3; 4 5 6; 7 8 9];    % 3x3 matrix (rows separated by ;)
v = [1, 2, 3, 4, 5];           % Row vector
v = [1; 2; 3; 4; 5];           % Column vector

% Range operators
v = 1:10;                       % 1 to 10, step 1
v = 0:0.5:5;                    % 0 to 5, step 0.5
v = 10:-1:1;                    % 10 down to 1

% Linearly/logarithmically spaced
v = linspace(0, 1, 100);        % 100 points from 0 to 1
v = logspace(0, 3, 50);         % 50 points from 10^0 to 10^3
```

### Special Matrices

```matlab
% Common patterns
I = eye(n);                     % n×n identity matrix
I = eye(m, n);                  % m×n identity matrix
Z = zeros(m, n);                % m×n zeros
O = ones(m, n);                 % m×n ones
D = diag([1 2 3]);              % Diagonal matrix from vector
d = diag(A);                    % Extract diagonal from matrix

% Random matrices
R = rand(m, n);                 % Uniform [0,1]
R = randn(m, n);                % Normal (mean=0, std=1)
R = randi([a b], m, n);         % Random integers in [a,b]
R = randperm(n);                % Random permutation of 1:n

% Logical arrays
T = true(m, n);                 % All true
F = false(m, n);                % All false

% Grids for 2D/3D
[X, Y] = meshgrid(x, y);        % 2D grid from vectors
[X, Y, Z] = meshgrid(x, y, z);  % 3D grid
[X, Y] = ndgrid(x, y);          % Alternative (different orientation)
```

### Creating from Existing

```matlab
A_like = zeros(size(B));        % Same size as B
A_like = ones(size(B), 'like', B);  % Same size and type as B
A_copy = A;                     % Copy (by value, not reference)
```

## Indexing and Subscripting

### Basic Indexing

```matlab
% Single element (1-based indexing)
elem = A(2, 3);                 % Row 2, column 3
elem = A(5);                    % Linear index (column-major order)

% Ranges
row = A(2, :);                  % Entire row 2
col = A(:, 3);                  % Entire column 3
sub = A(1:2, 2:3);              % Rows 1-2, columns 2-3

% End keyword
last = A(end, :);               % Last row
last3 = A(end-2:end, :);        % Last 3 rows
```

### Logical Indexing

```matlab
% Find elements meeting condition
idx = A > 5;                    % Logical array
elements = A(A > 5);            % Extract elements > 5
A(A < 0) = 0;                   % Set negative elements to 0

% Combine conditions
idx = (A > 0) & (A < 10);       % AND
idx = (A < 0) | (A > 10);       % OR
idx = ~(A == 0);                % NOT
```

### Linear Indexing

```matlab
% Convert between linear and subscript indices
[row, col] = ind2sub(size(A), linearIdx);
linearIdx = sub2ind(size(A), row, col);

% Find indices of nonzero/condition
idx = find(A > 5);              % Linear indices where A > 5
idx = find(A > 5, k);           % First k indices
idx = find(A > 5, k, 'last');   % Last k indices
[row, col] = find(A > 5);       % Subscript indices
```

### Advanced Indexing

```matlab
% Index with arrays
rows = [1 3 5];
cols = [2 4];
sub = A(rows, cols);            % Submatrix

% Logical indexing with another array
B = A(logical_mask);            % Elements where mask is true

% Assignment with indexing
A(1:2, 1:2) = [10 20; 30 40];   % Assign submatrix
A(:) = 1:numel(A);              % Assign all elements (column-major)
```

## Array Manipulation

### Element-wise Operations

```matlab
% Arithmetic (element-wise uses . prefix)
C = A + B;                      % Addition
C = A - B;                      % Subtraction
C = A .* B;                     % Element-wise multiplication
C = A ./ B;                     % Element-wise division
C = A .\ B;                     % Element-wise left division (B./A)
C = A .^ n;                     % Element-wise power

% Comparison (element-wise)
C = A == B;                     % Equal
C = A ~= B;                     % Not equal
C = A < B;                      % Less than
C = A <= B;                     % Less than or equal
C = A > B;                      % Greater than
C = A >= B;                     % Greater than or equal
```

### Matrix Operations

```matlab
% Matrix arithmetic
C = A * B;                      % Matrix multiplication
C = A ^ n;                      % Matrix power
C = A';                         % Conjugate transpose
C = A.';                        % Transpose (no conjugate)

% Matrix functions
B = inv(A);                     % Inverse
B = pinv(A);                    % Pseudoinverse
d = det(A);                     % Determinant
t = trace(A);                   % Trace (sum of diagonal)
r = rank(A);                    % Rank
n = norm(A);                    % Matrix/vector norm
n = norm(A, 'fro');             % Frobenius norm

% Solve linear systems
x = A \ b;                      % Solve Ax = b
x = b' / A';                    % Solve xA = b
```

### Common Functions

```matlab
% Apply to each element
B = abs(A);                     % Absolute value
B = sqrt(A);                    % Square root
B = exp(A);                     % Exponential
B = log(A);                     % Natural log
B = log10(A);                   % Log base 10
B = sin(A);                     % Sine (radians)
B = sind(A);                    % Sine (degrees)
B = round(A);                   % Round to nearest integer
B = floor(A);                   % Round down
B = ceil(A);                    % Round up
B = real(A);                    % Real part
B = imag(A);                    % Imaginary part
B = conj(A);                    % Complex conjugate
```

## Concatenation and Reshaping

### Concatenation

```matlab
% Horizontal (side by side)
C = [A B];                      % Concatenate columns
C = [A, B];                     % Same as above
C = horzcat(A, B);              % Function form
C = cat(2, A, B);               % Concatenate along dimension 2

% Vertical (stacked)
C = [A; B];                     % Concatenate rows
C = vertcat(A, B);              % Function form
C = cat(1, A, B);               % Concatenate along dimension 1

% Block diagonal
C = blkdiag(A, B, C);           % Block diagonal matrix
```

### Reshaping

```matlab
% Reshape
B = reshape(A, m, n);           % Reshape to m×n (same total elements)
B = reshape(A, [], n);          % Auto-compute rows
v = A(:);                       % Flatten to column vector

% Transpose and permute
B = A';                         % Transpose 2D
B = permute(A, [2 1 3]);        % Permute dimensions
B = ipermute(A, [2 1 3]);       % Inverse permute

% Remove/add dimensions
B = squeeze(A);                 % Remove singleton dimensions
B = shiftdim(A, n);             % Shift dimensions

% Replication
B = repmat(A, m, n);            % Tile m×n times
B = repelem(A, m, n);           % Repeat elements
```

### Flipping and Rotating

```matlab
B = flip(A);                    % Flip along first non-singleton dimension
B = flip(A, dim);               % Flip along dimension dim
B = fliplr(A);                  % Flip left-right (columns)
B = flipud(A);                  % Flip up-down (rows)
B = rot90(A);                   % Rotate 90° counterclockwise
B = rot90(A, k);                % Rotate k×90°
B = circshift(A, k);            % Circular shift
```

## Array Information

### Size and Dimensions

```matlab
[m, n] = size(A);               % Rows and columns
m = size(A, 1);                 % Number of rows
n = size(A, 2);                 % Number of columns
sz = size(A);                   % Size vector
len = length(A);                % Largest dimension
num = numel(A);                 % Total number of elements
ndim = ndims(A);                % Number of dimensions
```

### Type Checking

```matlab
tf = isempty(A);                % Is empty?
tf = isscalar(A);               % Is scalar (1×1)?
tf = isvector(A);               % Is vector (1×n or n×1)?
tf = isrow(A);                  % Is row vector?
tf = iscolumn(A);               % Is column vector?
tf = ismatrix(A);               % Is 2D matrix?
tf = isnumeric(A);              % Is numeric?
tf = isreal(A);                 % Is real (no imaginary)?
tf = islogical(A);              % Is logical?
tf = isnan(A);                  % Which elements are NaN?
tf = isinf(A);                  % Which elements are Inf?
tf = isfinite(A);               % Which elements are finite?
```

### Comparison

```matlab
tf = isequal(A, B);             % Are arrays equal?
tf = isequaln(A, B);            % Equal, treating NaN as equal?
tf = all(A);                    % All nonzero/true?
tf = any(A);                    % Any nonzero/true?
tf = all(A, dim);               % All along dimension
tf = any(A, dim);               % Any along dimension
```

## Sorting and Searching

### Sorting

```matlab
B = sort(A);                    % Sort columns ascending
B = sort(A, 'descend');         % Sort descending
B = sort(A, dim);               % Sort along dimension
[B, idx] = sort(A);             % Also return original indices
B = sortrows(A);                % Sort rows by first column
B = sortrows(A, col);           % Sort by specific column(s)
B = sortrows(A, col, 'descend');
```

### Unique and Set Operations

```matlab
B = unique(A);                  % Unique elements
[B, ia, ic] = unique(A);        % With index information
B = unique(A, 'rows');          % Unique rows

% Set operations
C = union(A, B);                % Union
C = intersect(A, B);            % Intersection
C = setdiff(A, B);              % A - B (in A but not B)
C = setxor(A, B);               % Symmetric difference
tf = ismember(A, B);            % Is each element of A in B?
```

### Min/Max

```matlab
m = min(A);                     % Column minimums
m = min(A, [], 'all');          % Global minimum
[m, idx] = min(A);              % With indices
m = min(A, B);                  % Element-wise minimum

M = max(A);                     % Column maximums
M = max(A, [], 'all');          % Global maximum
[M, idx] = max(A);              % With indices

[minVal, minIdx] = min(A(:));   % Global min with linear index
[maxVal, maxIdx] = max(A(:));   % Global max with linear index

% k smallest/largest
B = mink(A, k);                 % k smallest elements
B = maxk(A, k);                 % k largest elements
```

### Sum and Product

```matlab
s = sum(A);                     % Column sums
s = sum(A, 'all');              % Total sum
s = sum(A, dim);                % Sum along dimension
s = cumsum(A);                  % Cumulative sum

p = prod(A);                    % Column products
p = prod(A, 'all');             % Total product
p = cumprod(A);                 % Cumulative product
```
