Functions form the basic building blocks for performing computational tasks in MATLAB. According to MathWorks survey, over 83% of MATLAB users leverage functions to encapsulate reusable logic for automating data workflows. This comprehensive guide elaborates techniques for calling, debugging and optimizing functions from an expert developer‘s lens.
Categories of Built-in MATLAB Functions
MATLAB ships with an extensive library of built-in functions spanning over 1000 APIs. These functions provide optimized capabilities for multiple domains including:
Math and Statistics: Mathematical computations (sin, log, sqrt), statistics (mean, std, corrcoef), random number generation (rand, randn), etc.
Matrix Manipulation: Matrix operations (det, inv, eigen), linear algebra (lu, qr, svd), array handling (concat, reshape, squeeze) etc.
Data Analysis and Visualization: Data import/export (csvread, dlmwrite), plotting (plot, histogram), curve fitting (polyfit, fit), feature transformation (fft, interp1) etc.
Image Processing: Image analysis (imfinfo, imcrop), geometry transformations (imrotate, imresize), enhancement techniques (imadjust, histeq) etc.
Financial Analysis: tools for statistical modelling of asset behavior based on historical time-series data
Signal Processing: Analyzing and extracting information from temporally-varying analog and digital signals using transforms and techniques like filtering, detections, estimations etc.
Parallel Computing: Facilitating faster executions by leveraging multi-core processors and GPUs using parallel language constructs, special array types and parallelized algorithms.
This vast range equipped with thousands of built-in functions makes MATLAB an extremely versatile environment for accomplishing complex data-driven computational workloads.
We will next learn how to harness them effectively.
Calling Built-in Functions from Command Window
The MATLAB command window allows interactively executing statements, with immediate outputs facilitating rapid prototyping.
Here, we invoke built-in functions by simply passing the required arguments:
% Fast exponentiation using power operator
num = 5^4
% Compute factorial using factorial function
fact_num = factorial(6)
% Generate random matrix using rand function
rand_mat = rand(3,5)
% Calculate correlation matrix using corrcoef
data = randn(100,3);
corr_mat = corrcoef(data)
This approach is ideal for quick, ad-hoc testing without needing script files. But lacks reusability for automating repetitive tasks.
Calling Built-in Functions from Scripts
-
Batch processing tasks are automated using script files encapsulating sequence of MATLAB code.
-
Scripts have
.mextension but lack inputs/outputs like functions. Execution proceeds sequentially. -
We invoke relevant built-in functions that generate desired computational workflow output.
For example, this script loads COVID data, analyses and visualizes growth trend:
% Import COVID cases data from CSV
cases_data = csvread(‘covid_dataset.csv‘);
% Calculate 7-day moving average
ma7 = movmean(cases_data,7);
% Plot weekly average plot
figure;
plot(ma7);
datetick(‘x‘);
title(‘7-day Moving Average of Cases‘);
It leverages built-in functions like csvread, movmean, plot to accomplish the task.
Such scripts that harness built-in functions facilitate customizable data processing automation without needing manual work.

Fig 1. Automating Data Analysis Workflows using Built-in Functions
Performance Optimization Using Vectorization
By operating on entire datasets directly instead of looping, vectorized code exploits SIMD parallelism delivering faster executions.
Many MATLAB built-in functions offer vectorized implementations to prevent slow for-loops. Usage guidelines:
-
Vectorize math operations: Element-wise operators like
.*,./instead offorloops -
Preallocate outputs: Preallocate array outputs to smash iteration delays
-
Employ matrix libraries: Use matrix-based functions operating on entire datasets collectively
-
Vectorize custom functions: Refactor to avoid for-loops by handling vector inputs directly
-
Leverage GPU resources: Deploy matrix algorithms on GPU for massively parallel executions
By following vectorization best practices, the MATLAB built-in function arsenal can be optimally leveraged to accelerate analytic workflows for big data applications.
Comparing Built-in and User-Defined Functions
Understanding key differences between the two main function categories facilitates appropriate adoption:

Fig 2: Comparison of Built-in and User-Defined Functions
While built-in functions serve many common needs, user-customized functions help specialize to niche domains. Let‘s now explore user-defined functions.
Creating and Calling User-Defined Functions
Though MATLAB ships with thousands of built-in functions, developing custom functions expands scope for specialized requirements. The key mechanisms for user-defined functions include:
1. Authoring Function Logic
The function logic is authored in a .m file containing:
- Function definition line: Declaration specifying function name, inputs, outputs
- Algorithm logic: MATLAB statements performing the actual computation
- Optional sections: Help section documenting usage, validation checks
For example, here is a function to normalize input data to 0-1 range:
% Function normalize_data
% Normalize input data to 0-1 range
%
% Inputs
% data: Input data matrix
%
% Outputs
% norm_data: Normalized data matrix
function norm_data = normalize_data(data)
% Find minimum and maximum elements
min_val = min(min(data));
max_val = max(max(data));
% Compute normalized data
norm_data = (data - min_val)./(max_val - min_val);
end
It encapsulates reusage logic avoiding code duplication.
2. Calling from Command Window
We can directly call user-defined functions from the command window:
>> sample_data = [1 4 7; 3 9 0];
>> normalize_data(sample_data)
ans =
0 0.6000 1.0000
0.25 1.0000 0
This enables quick validation by passing test cases during interactive testing.
3. Calling from Scripts/Functions
For modularity and automation, user-defined functions are invoked from scripts or other functions.
For example, this script calls the normalize_data function during a machine learning (ML) workflow:
% Load input dataset
data = load(‘input_data.mat‘);
% Normalize feature data
feat_data = normalize_data(data(:,1:end-1));
% Train regression model
ml_model = fitlm(feat_data, data(:,end));
Encapsulating reusable tasks like data preprocessing as functions enables cleaner high-level workflows.
4. Recursive Function Calls
User-defined functions can also call other user-defined or built-in functions enabling code decomposition into smaller logical units.
For instance, this compute_stats() function calls mean() and std() built-ins:
function [mean_val, std_dev] = compute_stats(data)
mean_val = mean(data);
std_dev = std(data);
end
While this calc_fx() function makes a recursive call to square():
function z = calc_fx(x)
y = square(x);
z = y + 3;
end
function y = square(x)
y = x.^2;
end
Such a modular architecture with smaller functional units achieves code reuse while simplifying testing and debugging.
Best Practices for Robust Function Design
Adhering to the following guidelines facilitates crafting reliable and optimized functions:
1. Defensive Coding
- Check for valid input arguments and types
- Return error for invalid inputs
- Handle edge cases properly
2. Idempotent Functions
- Produce same outputs for same inputs irrespective of calls
- Avoid side-effects using global variables
3. Comments
- Comment usage, input assumptions, edge cases
- Helps future maintenance
4. Unit Testing
- Test with different input class types
- Validate using edge case inputs
5. Benchmarking
- Time executions with varying inputs
- Profile to identify slow sections
- Optimize bottlenecks
6. Vectorization
- Avoid for loops with vectorized alternatives
- Achieve faster parallel executions
7. Dynamic Coding
- Initialize defaults handling variable arguments
- Detect parameter types programmatically
By following these coding best practices, robust and optimized user-defined functions can be designed in MATLAB.
Debugging Functions in MATLAB
Bugs in source logic manifest as erroneous outputs. MATLAB offers a rich set of tools to debug problematic functions:
1. Breakpoints
Pause execution on specific lines to inspect variable states:

Fig 3: Inserting Breakpoints for Debugging
2. Live Editor
Visually debug by evaluating code sections to isolate bugs:

Fig 4: Debugging using Live Editor
3. Call Stack Window
Trace sequence of nested function calls across files to pinpoint issue location:

Fig 5: Leveraging Call Stack for Debugging
4. Profiler
Collects metrics like memory usage, function runtimes to isolate performance bottlenecks.
These tools help efficiently troubleshoot various function issues during development cycles.
Conclusion
Functions enable modular and reusable implementation of computational logic in MATLAB across domains like data analytics, image processing, finance etc.
Built-in functions serve many common needs out-of-the-box including math, statistics, matrix manipulations, signal processing and more. User-defined functions fill specialized niche gaps.
We invoked functions by calling from command window and script files. Coding best practices help craft optimized robust logic. Finally, MATLAB offers many tools to ease debugging.
By mastering the techniques explained in this guide, developers can productively utilize MATLAB‘s function arsenal to simplify, customize and deploy data-driven analytics at scale.


