### M

### ATLAB

®support@mathworks.com Technical support

suggest@mathworks.com Product enhancement suggestions

bugs@mathworks.com Bug reports

doc@mathworks.com Documentation error reports

service@mathworks.com Order status, license renewals, passcodes

info@mathworks.com Sales, pricing, and general information

508-647-7000 Phone

508-647-7001 Fax

The MathWorks, Inc. Mail 3 Apple Hill Drive

Natick, MA 01760-2098

For contact information about worldwide offices, see the MathWorks Web site.

*MATLAB Programming*

COPYRIGHT 1984 - 2004 by The MathWorks, Inc.

The software described in this document is furnished under a license agreement. The software may be used
or copied only under the terms of the license agreement. No part of this manual may be photocopied or
repro-duced in any form without prior written consent from The MathWorks, Inc*.*

FEDERAL ACQUISITION: This provision applies to all acquisitions of the Program and Documentation by, for, or through the federal government of the United States. By accepting delivery of the Program or Documentation, the government hereby agrees that this software or documentation qualifies as commercial computer software or commercial computer software documentation as such terms are used or defined in FAR 12.212, DFARS Part 227.72, and DFARS 252.227-7014. Accordingly, the terms and conditions of this Agreement and only those rights specified in this Agreement, shall pertain to and govern the use, modification, reproduction, release, performance, display, and disclosure of the Program and Documentation by the federal government (or other entity acquiring for or through the federal government) and shall supersede any conflicting contractual terms or conditions. If this License fails to meet the government's needs or is inconsistent in any respect with federal procurement law, the government agrees to return the Program and Documentation, unused, to The MathWorks, Inc.

MATLAB, Simulink, Stateflow, Handle Graphics, and Real-Time Workshop are registered trademarks, and TargetBox is a trademark of The MathWorks, Inc.

Other product or brand names are trademarks or registered trademarks of their respective holders.

**Contents**

**1**

**Data Structures**

**Creating and Concatenating Matrices** . . . **1-3**
Constructing a Simple Matrix . . . **1-4**
Specialized Matrix Functions . . . **1-4**
Concatenating Matrices . . . **1-7**
Matrix Concatenation Functions . . . **1-8**
Generating a Numeric Sequence . . . **1-10**
Combining Unlike Data Types . . . **1-11**

**Accessing Elements of a Matrix** . . . **1-14**
Accessing Single Elements . . . **1-14**
Linear Indexing . . . **1-15**
Functions That Control Indexing Style . . . **1-16**
Accessing Multiple Elements . . . **1-16**
Logical Indexing . . . **1-18**

**Getting Information About a Matrix** . . . **1-19**
Dimensions of the Matrix . . . **1-19**
Data Types Used in the Matrix . . . **1-20**
Data Structures Used in the Matrix . . . **1-21**

**Resizing and Reshaping Matrices** . . . **1-22**
Expanding the Size of a Matrix . . . **1-22**
Diminishing the Size of a Matrix . . . **1-23**
Reshaping a Matrix . . . **1-24**

**Empty Matrices, Scalars, and Vectors** . . . **1-32**
The Empty Matrix . . . **1-32**
Scalars . . . **1-33**
Vectors . . . **1-34**

**Full and Sparse Matrices** . . . **1-35**
Sparse Matrix Functions . . . **1-35**

**Multidimensional Arrays** . . . **1-37**
Overview . . . **1-37**
Creating Multidimensional Arrays . . . **1-39**
Accessing Multidimensional Array Properties . . . **1-43**
Indexing Multidimensional Arrays . . . **1-43**
Reshaping Multidimensional Arrays . . . **1-47**
Permuting Array Dimensions . . . **1-49**
Computing with Multidimensional Arrays . . . **1-51**
Organizing Data in Multidimensional Arrays . . . **1-53**
Multidimensional Cell Arrays . . . **1-55**
Multidimensional Structure Arrays . . . **1-56**

**Summary of Matrix and Array Functions** . . . **1-58**

**2**

**Data Types**

**Overview of MATLAB Data Types** . . . **2-2**

Identifying Numeric Types . . . **2-14**
Display Format for Numeric Values . . . **2-14**
Function Summary . . . **2-16**

**Logical Types** . . . **2-20**
Creating a Logical Array . . . **2-20**
How Logical Arrays Are Used . . . **2-22**
Identifying Logical Arrays . . . **2-24**

**Characters and Strings** . . . **2-25**
Creating Character Arrays . . . **2-25**
Cell Arrays of Strings . . . **2-27**
String Comparisons . . . **2-29**
Searching and Replacing . . . **2-32**
Converting from Numeric to String . . . **2-34**
Converting from String to Numeric . . . **2-35**
Function Summary . . . **2-37**

**Dates and Times** . . . **2-41**
Types of Date Formats . . . **2-41**
Conversions Between Date Formats . . . **2-43**
Date String Formats . . . **2-44**
Output Formats . . . **2-44**
Current Date and Time . . . **2-46**
Function Summary . . . **2-47**

Replacing Lists of Variables with Cell Arrays . . . **2-72**
Applying Functions and Operators . . . **2-74**
Organizing Data in Cell Arrays . . . **2-74**
Nesting Cell Arrays . . . **2-75**
Converting Between Cell and Numeric Arrays . . . **2-77**
Cell Arrays of Structures . . . **2-78**
Function Summary . . . **2-79**

**Function Handles** . . . **2-80**
Constructing and Invoking a Function Handle . . . **2-80**
Calling a Function Using Its Handle . . . **2-80**
Simple Function Handle Example . . . **2-81**

**MATLAB Classes** . . . **2-82**

**Java Classes** . . . **2-83**

**3**

**Basic Program Components**

**Variables** . . . **3-2**
Types of Variables . . . **3-2**
Naming Variables . . . **3-6**
Guidelines to Using Variables . . . **3-7**
Scope of a Variable . . . **3-7**
Lifetime of a Variable . . . **3-8**

**Keywords** . . . **3-9**

**Operators** . . . **3-12**
Arithmetic Operators . . . **3-12**
Relational Operators . . . **3-13**
Logical Operators . . . **3-15**
Operator Precedence . . . **3-20**

**MATLAB Expressions** . . . **3-22**
String Evaluation . . . **3-22**
Shell Escape Functions . . . **3-23**

**Regular Expressions** . . . **3-25**
MATLAB Regular Expression Functions . . . **3-25**
Elements of an Expression . . . **3-26**
Character Classes . . . **3-26**
Character Representation . . . **3-29**
Logical Operators . . . **3-30**
Lookaround Operators . . . **3-33**
Quantifiers . . . **3-36**
Tokens . . . **3-40**
Handling Multiple Strings . . . **3-46**
Operator Summary . . . **3-49**

**Comma-Separated Lists** . . . **3-54**
Generating a List from a Cell Array . . . **3-54**
Generating a List from a Structure . . . **3-55**
How to Use the Comma-Separated List . . . **3-56**
Fast Fourier Transform Example . . . **3-58**

**Program Control Statements** . . . **3-60**
Conditional Control — if, switch . . . **3-60**
Loop Control — for, while, continue, break . . . **3-64**
Error Control — try, catch . . . **3-67**
Program Termination — return . . . **3-68**

Exclamation Point — ! . . . **3-75**
Parentheses — ( ) . . . **3-76**
Percent — % . . . **3-76**
Percent-Brace — %{ %} . . . **3-77**
Semicolon — ; . . . **3-77**
Single Quotes — ' ' . . . **3-78**
Space Character . . . **3-78**
Slash and Backslash — / \ . . . **3-79**
Square Brackets — [ ] . . . **3-79**

**MATLAB Functions** . . . **3-81**
M-File Functions . . . **3-81**
Built-In Functions . . . **3-82**
Overloaded MATLAB Functions . . . **3-83**

**4**

**M-File Programming**

**Program Development** . . . **4-2**
Creating a Program . . . **4-2**
Getting the Bugs Out . . . **4-3**
Cleaning Up the Program . . . **4-4**
Improving Performance . . . **4-5**
Checking It In . . . **4-6**

**M-File Scripts and Functions** . . . **4-16**
M-File Scripts . . . **4-16**
M-File Functions . . . **4-17**
Types of Functions . . . **4-18**
Identifying Dependencies . . . **4-19**

**Function Arguments** . . . **4-21**
Checking the Number of Input Arguments . . . **4-21**
Passing Variable Numbers of Arguments . . . **4-23**
Returning Output Arguments . . . **4-25**

**Function Handles** . . . **4-27**
Constructing a Function Handle . . . **4-27**
Calling a Function Using Its Handle . . . **4-28**
Functions That Operate on Function Handles . . . **4-29**
Additional Information on Function Handles . . . **4-29**

**Calling Functions** . . . **4-31**
What Happens When You Call a Function . . . **4-31**
Determining Which Function Is Called . . . **4-31**
MATLAB Calling Syntax . . . **4-34**
Passing Certain Argument Types . . . **4-37**
Passing Arguments in Structures or Cell Arrays . . . **4-39**
Calling External Functions . . . **4-40**

**5**

**Types of Functions**

**Overview of MATLAB Function Types** . . . **5-2**

Variable Scope in Nested Functions . . . **5-18**
Using Function Handles with Nested Functions . . . **5-20**
Examples of Nested Functions . . . **5-25**

**Subfunctions** . . . **5-31**
Calling Subfunctions . . . **5-32**
Accessing Help for a Subfunction . . . **5-32**

**Private Functions** . . . **5-33**
Private Directories . . . **5-33**
Accessing Help for a Private Function . . . **5-33**

**Overloaded Functions** . . . **5-34**
Class Directories . . . **5-34**

**6**

**Data Import and Export**

**Overview** . . . **6-3**
Text Data . . . **6-3**
Graphics Files . . . **6-3**
Audio and Audio/Video Data . . . **6-4**
Spreadsheets . . . **6-4**
Scientific Formats . . . **6-4**
The Internet . . . **6-4**
Low-Level File I/O . . . **6-5**
Toolboxes for Importing Data . . . **6-5**

**Supported File Formats** . . . **6-15**

**Saving and Loading MAT-Files** . . . **6-17**
Exporting Data to MAT-Files . . . **6-17**
Importing Data from MAT-Files . . . **6-22**

**Importing Text Data ** . . . **6-26**
The MATLAB Import Wizard . . . **6-26**
Using Import Functions with Text Data . . . **6-26**
Importing Numeric Text Data . . . **6-29**
Importing Delimited ASCII Data Files . . . **6-30**
Importing Numeric Data with Text Headers . . . **6-30**
Importing Mixed Alphabetic and Numeric Data . . . **6-31**
Importing from XML Documents . . . **6-33**

**Exporting Text Data ** . . . **6-34**
Exporting Delimited ASCII Data Files . . . **6-35**
Using the diary Function to Export Data . . . **6-37**
Exporting to XML Documents . . . **6-38**

**Working with Graphics Files** . . . **6-39**
Getting Information About Graphics Files . . . **6-39**
Importing Graphics Data . . . **6-40**
Exporting Graphics Data . . . **6-40**

**Working with Audio and Video Data** . . . **6-42**
Getting Information About Audio/Video Files . . . **6-42**
Importing Audio/Video Data . . . **6-43**
Exporting Audio/Video Data . . . **6-44**

**Working with Spreadsheets** . . . **6-46**
Microsoft Excel Spreadsheets . . . **6-46**
Lotus 123 Spreadsheets . . . **6-49**

**Exporting MATLAB Data to an HDF4 File** . . . **6-94**
Example: Exporting Data to an HDF4 File . . . **6-94**
Using the MATLAB HDF Utility API . . . **6-101**

**Using Low-Level File I/O Functions** . . . **6-103**
Opening Files . . . **6-104**
Reading Binary Data . . . **6-106**
Writing Binary Data . . . **6-108**
Controlling Position in a File . . . **6-108**
Reading Strings Line by Line from Text Files . . . **6-110**
Reading Formatted ASCII Data . . . **6-112**
Writing Formatted Text Files . . . **6-113**
Closing a File . . . **6-114**

**Exchanging Files over the Internet** . . . **6-116**
Downloading Web Content and Files . . . **6-116**
Creating and Uncompressing Zip Archives . . . **6-118**
Sending E-Mail . . . **6-119**
Performing FTP File Operations . . . **6-121**

**7**

**Error Handling**

**Checking for Errors with try-catch** . . . **7-2**
Nested try-catch Blocks . . . **7-3**

**Message Identifiers** . . . **7-8**
Identifier Format . . . **7-8**
Using Message Identifiers with lasterr . . . **7-9**

**Warnings** . . . **7-12**
Reporting a Warning . . . **7-12**
Identifying the Cause . . . **7-13**

**Warning Control** . . . **7-14**
Warning Statements . . . **7-14**
Warning Control Statements . . . **7-15**
Output from Control Statements . . . **7-17**
Saving and Restoring State . . . **7-20**
Debug, Backtrace, and Verbose Modes . . . **7-21**

**Debugging Errors and Warnings** . . . **7-23**

**8**

**Classes and Objects**

**Classes and Objects: An Overview** . . . **8-2**
Features of Object-Oriented Programming . . . **8-2**
MATLAB Data Class Hierarchy . . . **8-3**
Creating Objects . . . **8-4**
Invoking Methods on Objects . . . **8-4**
Private Methods . . . **8-5**
Helper Functions . . . **8-5**
Debugging Class Methods . . . **8-5**
Setting Up Class Directories . . . **8-6**
Data Structure . . . **8-7**
Tips for C++ and Java Programmers . . . **8-7**

Handling Subscripted Assignment . . . **8-17**
Object Indexing Within Methods . . . **8-18**
Defining end Indexing for an Object . . . **8-19**
Indexing an Object with Another Object . . . **8-19**
Converter Methods . . . **8-20**

**Overloading Operators and Functions** . . . **8-21**
Overloading Operators . . . **8-21**
Overloading Functions . . . **8-23**

**Example — A Polynomial Class** . . . **8-24**
Polynom Data Structure . . . **8-24**
Polynom Methods . . . **8-24**
The Polynom Constructor Method . . . **8-24**
Converter Methods for the Polynom Class . . . **8-25**
The Polynom display Method . . . **8-28**
The Polynom subsref Method . . . **8-28**
Overloading Arithmetic Operators for polynom . . . **8-29**
Overloading Functions for the Polynom Class . . . **8-31**
Listing Class Methods . . . **8-33**

**Building on Other Classes** . . . **8-35**
Simple Inheritance . . . **8-35**
Multiple Inheritance . . . **8-36**
Aggregation . . . **8-37**

The Asset display Method . . . **8-44**
The Asset fieldcount Method . . . **8-45**
Designing the Stock Class . . . **8-45**
The Stock Constructor Method . . . **8-46**
The Stock get Method . . . **8-48**
The Stock set Method . . . **8-49**
The Stock subsref Method . . . **8-50**
The Stock subsasgn Method . . . **8-51**
The Stock display Method . . . **8-53**

**Example — The Portfolio Container** . . . **8-54**
Designing the Portfolio Class . . . **8-54**
The Portfolio Constructor Method . . . **8-55**
The Portfolio display Method . . . **8-56**
The Portfolio pie3 Method . . . **8-57**
Creating a Portfolio . . . **8-58**

**Saving and Loading Objects** . . . **8-60**
Modifying Objects During Save or Load . . . **8-60**

**Example — Defining saveobj and loadobj for Portfolio** . . **8-61**
Summary of Code Changes . . . **8-61**
The saveobj Method . . . **8-62**
The loadobj Method . . . **8-62**
Changing the Portfolio Constructor . . . **8-63**
The Portfolio subsref Method . . . **8-64**

**Object Precedence** . . . **8-65**
Specifying Precedence of User-Defined Classes . . . **8-66**

Example: Displaying a Message . . . **9-3**

**Creating Timer Objects** . . . **9-4**
Timer Object Naming . . . **9-5**

**Working with Timer Object Properties** . . . **9-6**
Retrieving the Value of Timer Object Properties . . . **9-6**
Setting the Value of Timer Object Properties . . . **9-7**

**Starting and Stopping Timers** . . . **9-9**
Starting a Timer . . . **9-9**
Starting a Timer at a Specified Time . . . **9-10**
Stopping Timer Objects . . . **9-10**
Blocking the MATLAB Command Line . . . **9-11**

**Creating and Executing Callback Functions** . . . **9-13**
Associating Commands with Timer Object Events . . . **9-13**
Creating Callback Functions . . . **9-14**
Specifying the Value of Callback Function Properties . . . **9-16**

**Timer Object Execution Modes** . . . **9-18**
Executing a Timer Callback Function Once . . . **9-18**
Executing a Timer Callback Function Multiple Times . . . **9-19**
Handling Callback Function Queuing Conflicts . . . **9-20**

**Deleting Timer Objects from Memory** . . . **9-22**
Testing the Validity of a Timer Object . . . **9-22**
Deleting All Existing Timer Objects . . . **9-22**

**10**

**Improving Performance and Memory Usage**

**Analyzing Your Program’s Performance** . . . **10-2**
The M-File Profiler Utility . . . **10-2**
Stopwatch Timer Functions . . . **10-2**

**Techniques for Improving Performance** . . . **10-4**
Vectorizing Loops . . . **10-4**
Preallocating Arrays . . . **10-7**
Coding Loops in a MEX-File . . . **10-9**
Assigning to Variables . . . **10-9**
Operating on Real Data . . . **10-10**
Using Appropriate Logical Operators . . . **10-10**
Overloading Built-In Functions . . . **10-11**
Functions Are Generally Faster Than Scripts . . . **10-11**
Load and Save Are Faster Than File I/O Functions . . . **10-11**
Avoid Large Background Processes . . . **10-11**

**Making Efficient Use of Memory** . . . **10-12**
Memory Management Functions . . . **10-12**
Preallocating Arrays to Reduce Fragmentation . . . **10-13**
Enlarging Arrays with repmat . . . **10-13**
Working with Variables . . . **10-13**
Converting Full Matrices into Sparse . . . **10-15**
Structure of Arrays vs. Array of Structures . . . **10-15**
Working with Large Amounts of Data . . . **10-15**

Syntax Help . . . **11-3**
Command and Function Syntaxes . . . **11-3**
Command Line Continuation . . . **11-3**
Completing Commands Using the Tab Key . . . **11-4**
Recalling Commands . . . **11-4**
Clearing Commands . . . **11-5**
Suppressing Output to the Screen . . . **11-5**

**Help** . . . **11-6**
Using the Help Browser . . . **11-6**
Help on Functions from the Help Browser . . . **11-7**
Help on Functions from the Command Window . . . **11-7**
Topical Help . . . **11-7**
Paged Output . . . **11-8**
Writing Your Own Help . . . **11-8**
Help for Subfunctions and Private Functions . . . **11-9**
Help for Methods and Overloaded Functions . . . **11-9**

**Development Environment** . . . **11-10**
Workspace Browser . . . **11-10**
Using the Find and Replace Utility . . . **11-10**
Commenting Out a Block of Code . . . **11-11**
Creating M-Files from Command History . . . **11-11**
Editing M-Files in EMACS . . . **11-11**

**M-File Functions** . . . **11-12**
M-File Structure . . . **11-12**
Using Lowercase for Function Names . . . **11-12**
Getting a Function’s Name and Path . . . **11-13**
What M-Files Does a Function Use? . . . **11-13**
Dependent Functions, Built-Ins, Classes . . . **11-13**

Passing Arguments in a Structure . . . **11-15**
Passing Arguments in a Cell Array . . . **11-15**

**Program Development** . . . **11-16**
Planning the Program . . . **11-16**
Using Pseudo-Code . . . **11-16**
Selecting the Right Data Structures . . . **11-16**
General Coding Practices . . . **11-17**
Naming a Function Uniquely . . . **11-17**
The Importance of Comments . . . **11-17**
Coding in Steps . . . **11-18**
Making Modifications in Steps . . . **11-18**
Functions with One Calling Function . . . **11-18**
Testing the Final Program . . . **11-18**

**Debugging** . . . **11-19**
The MATLAB Debug Functions . . . **11-19**
More Debug Functions . . . **11-19**
The MATLAB Graphical Debugger . . . **11-20**
A Quick Way to Examine Variables . . . **11-20**
Setting Breakpoints from the Command Line . . . **11-21**
Finding Line Numbers to Set Breakpoints . . . **11-21**
Stopping Execution on an Error or Warning . . . **11-21**
Locating an Error from the Error Message . . . **11-21**
Using Warnings to Help Debug . . . **11-22**
Making Code Execution Visible . . . **11-22**
Debugging Scripts . . . **11-22**

Search and Replace Using Regular Expressions . . . **11-29**

**Evaluating Expressions** . . . **11-30**
Find Alternatives to Using eval . . . **11-30**
Assigning to a Series of Variables . . . **11-30**
Short-Circuit Logical Operators . . . **11-31**
Changing the Counter Variable within a for Loop . . . **11-31**

**MATLAB Path** . . . **11-32**
Precedence Rules . . . **11-32**
File Precedence . . . **11-33**
Adding a Directory to the Search Path . . . **11-33**
Handles to Functions Not on the Path . . . **11-33**
Making Toolbox File Changes Visible to MATLAB . . . **11-34**
Making Nontoolbox File Changes Visible to MATLAB . . . **11-35**
Change Notification on Windows . . . **11-35**

**Program Control** . . . **11-36**
Using break, continue, and return . . . **11-36**
Using switch Versus if . . . **11-37**
MATLAB case Evaluates Strings . . . **11-37**
Multiple Conditions in a case Statement . . . **11-37**
Implicit Break in switch-case . . . **11-38**
Variable Scope in a switch . . . **11-38**
Catching Errors with try-catch . . . **11-38**
Nested try-catch Blocks . . . **11-39**
Forcing an Early Return from a Function . . . **11-39**

**Files and Filenames** . . . **11-43**
Naming M-files . . . **11-43**
Naming Other Files . . . **11-43**
Passing Filenames as Arguments . . . **11-44**
Passing Filenames to ASCII Files . . . **11-44**
Determining Filenames at Run-Time . . . **11-44**
Returning the Size of a File . . . **11-45**

**Input/Output** . . . **11-46**
File I/O Function Overview . . . **11-46**
Common I/O Functions . . . **11-46**
Readable File Formats . . . **11-46**
Using the Import Wizard . . . **11-47**
Loading Mixed Format Data . . . **11-47**
Reading Files with Different Formats . . . **11-47**
Reading ASCII Data into a Cell Array . . . **11-48**
Interactive Input into Your Program . . . **11-48**

**Starting MATLAB** . . . **11-49**
Getting MATLAB to Start Up Faster . . . **11-49**

**Operating System Compatibility** . . . **11-50**
Executing O/S Commands from MATLAB . . . **11-50**
Searching Text with grep . . . **11-50**
Constructing Paths and Filenames . . . **11-50**
Finding the MATLAB Root Directory . . . **11-51**
Temporary Directories and Filenames . . . **11-51**

**Demos** . . . **11-52**
Demos Available with MATLAB . . . **11-52**

**Reference Documentation** . . . **A-5**

**1**

### Data Structures

The most basic data structure in MATLAB® is the *matrix*: a two-dimensional, rectangularly shaped
data structure capable of storing multiple elements of data in an easily accessible format. These data
elements can be numbers, characters, logical states of true or false, or even other MATLAB structure
types. MATLAB uses these two-dimensional matrices to store single numbers and linear series of
numbers as well. In these cases, the dimensions are 1-by-1 and 1-by-n respectively, where n is the
length of the numeric series. MATLAB also supports data structures that have more than two
dimensions. These data structures are referred to as *arrays* in the MATLAB documentation.

Creating and Concatenating Matrices (p. 1-3)

Create a matrix or construct one from other matrices.

Accessing Elements of a Matrix (p. 1-14)

Access single elements or a range of elements in a matrix using methods of row and column indexing.

Getting Information About a Matrix (p. 1-19)

Retrieve information about the structure or contents of a matrix.

Resizing and Reshaping Matrices (p. 1-22)

Change the size, shape, or arrangement of elements in an existing matrix.

Shifting and Sorting Matrices (p. 1-26)

Shift matrix elements along one or more dimensions, or sort them into an ascending or descending order.

Operating on Diagonal Matrices (p. 1-30)

Construct and manipulate matrices along a diagonal of the rectangular shape.

Empty Matrices, Scalars, and Vectors (p. 1-32)

Work with matrices that have one or more dimensions equal to zero or one.

Multidimensional Arrays (p. 1-37) Create and work with arrays that have more than two dimensions.

Summary of Matrix and Array Functions (p. 1-58)

Creating and Concatenating Matrices

**Creating and Concatenating Matrices**

MATLAB is a matrix-based computing environment. All of the data that you enter into MATLAB is stored in the form of a matrix or a multidimensional array. Even a single numeric value like 100 is stored as a matrix (in this case, a matrix having dimensions 1-by-1):

A = 100;

whos A

Name Size Bytes Class

A 1x1 8 double array

Regardless of the data type being used, whether it is numeric, character, or logical true or false data, MATLAB stores this data in matrix (or array) form. For example, the string 'Hello World' is a 1-by-11 matrix of individual character elements in MATLAB. You can also build matrices composed of more complex data types, such as MATLAB structures and cell arrays.

To create a matrix of basic data elements such as numbers or characters, see
**•**“Constructing a Simple Matrix” on page 1-4

**•**“Specialized Matrix Functions” on page 1-4
To build a matrix composed of other matrices, see
**•**“Concatenating Matrices” on page 1-7

**•**“Matrix Concatenation Functions” on page 1-8
This section also describes

**Constructing a Simple Matrix**

The simplest way to create a matrix in MATLAB is to use the matrix constructor operator, []. Create a row in the matrix by entering elements (shown as E below) within the brackets. Separate each element with a comma or space:

row = [E1, E2, ..., Em] row = [E1 E2 ... Em] For example, to create a one row matrix of five elements, type

A = [12 62 93 -8 22];

To start a new row, terminate the current row with a semicolon:
A = [row_{1}; row_{2}; ...; row_{n}]

This example constructs a 3 row, 5 column (or 3-by-5) matrix of numbers. Note that all rows must have the same number of elements:

A = [12 62 93 -8 22; 16 2 87 43 91; -4 17 -72 95 6] A =

12 62 93 -8 22 16 2 87 43 91 -4 17 -72 95 6

The square brackets operator constructs two-dimensional matrices only, (including 0-by-0, 1-by-1, and 1-by-n matrices). To construct arrays of more than two dimensions, see “Creating Multidimensional Arrays” on page 1-39. For instructions on how to read or overwrite any matrix element, see “Accessing Elements of a Matrix” on page 1-14.

**Specialized Matrix Functions**

MATLAB has a number of functions that create different kinds of matrices. Some create specialized matrices like the Hankel or Vandermonde matrix. The functions shown in the table below create a matrices for more general use.

**Function** **Description**

Creating and Concatenating Matrices

Most of these functions return matrices of type double (double-precision floating point). However, you can easily build basic arrays of any numeric type using the ones, zeros, and eye functions.

To do this, specify the MATLAB class name as the last argument: A = zeros(4, 6, 'uint32')

A =

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

**Examples**

Here are some examples of how you can use these functions.

**Creating a Magic Square Matrix.** A magic square is a matrix in which the sum of
the elements in each column, or each row, or each main diagonal is the same.
To create a 5-by-5 magic square matrix, use the magic function as shown.

eye Create a matrix with ones on the diagonal and zeros elsewhere.

accumarray Distribute elements of an input matrix to specified locations in an output matrix, also allowing for accumulation.

diag Create a diagonal matrix from a vector.

magic Create a square matrix with rows, columns, and diagonals that add up to the same number.

rand Create a matrix or array of uniformly distributed random numbers.

randn Create a matrix or array of normally distributed random numbers and arrays.

randperm Create a vector (1-by-n matrix) containing a random permutation of the specified integers.

A = magic(5) A =

17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9

Note that the elements of each row, each column, and each main diagonal add up to the same value: 65.

**Creating a Random Matrix.** The rand function creates a matrix or array with
elements uniformly distributed between zero and one. This example multiplies
each element by 20:

A = rand(5) * 20 A =

3.8686 13.9580 9.9310 13.2046 14.5423 13.6445 7.5675 17.9954 6.8394 6.1858 6.0553 17.2002 16.4326 5.7945 16.7699 10.8335 17.0731 12.8982 6.8239 11.3614 3.0175 11.8713 16.3595 10.6816 7.4083

**Creating a Diagonal Matrix.** Use diag to create a diagonal matrix from a vector.
You can place the vector along the main diagonal of the matrix, or on a diagonal
that is above or below the main one, as shown here. The -1 input places the
vector one row below the main diagonal:

A = [12 62 93 -8 22];

B = diag(A, -1) B =

Creating and Concatenating Matrices

**Concatenating Matrices**

Matrix concatenation is the process of joining one or more matrices to make a new matrix. The brackets [] operator discussed earlier in this section serves not only as a matrix constructor, but also as the MATLAB concatenation operator. The expression C = [A B] horizontally concatenates matrices A and B. The expression C = [A; B] vertically concatenates them.

This example constructs a new matrix C by concatenating matrices A and B in a vertical direction:

A = ones(2, 5) * 6; % 2-by-5 matrix of 6 s

B = rand(3, 5); % 3-by-5 matrix of random values

C = [A; B] % Vertically concatenate A and B C =

6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 0.6154 0.7382 0.9355 0.8936 0.8132 0.7919 0.1763 0.9169 0.0579 0.0099 0.9218 0.4057 0.4103 0.3529 0.1389

**Keeping Matrices Rectangular**

You can construct matrices, or even multidimensional arrays, using

concatenation as long as the resulting matrix does not have an irregular shape (as in the second illustration shown below). If you are building a matrix horizontally, then each component matrix must have the same number of rows. When building vertically, each component must have the same number of columns.

This diagram shows two matrices of the same height (i.e., same number of rows) being combined horizontally to form a new matrix.

4 3 3-by-4 4 3 3-by-6 3-by-2 7 23 11 41 90 -1

46 0 13 -4 98 44 62 31

3 51 -9 25

The next diagram illustrates an attempt to horizontally combine two matrices of unequal height. MATLAB does not allow this.

**Matrix Concatenation Functions**

The following functions combine existing matrices to form a new matrix.

**Examples**

Here are some examples of how you can use these functions.

**Concatenating Matrices and Arrays.** An alternative to using the [] operator for
concatenation are the three functions cat, horzcat, and vertcat. With these
functions, you can construct matrices (or multidimensional arrays) along a
specified dimension. Either of the following commands accomplish the same
task as the command C = [A; B] used in the section on “Concatenating
Matrices” on page 1-7:

C = cat(1, A, B); % Concatenate along the first dimension C = vertcat(A, B); % Concatenate vertically

**Function** **Description**

cat Concatenate matrices along the specified dimension horzcat Horizontally concatenate matrices

vertcat Vertically concatenate matrices

repmat Create a new matrix by replicating and tiling existing matrices

blkdiag Create a block diagonal matrix from existing matrices 3

2-by-4 3-by-2

7 23 41 11 -1 90

46 0 13 -4 44 62 31 98

7 23 46 0 13 -4 41 44 62 31 98 -1 90

Creating and Concatenating Matrices

**Replicating a Matrix.** Use the repmat function to create a matrix composed of
copies of an existing matrix. When you enter

repmat(M, v, h)

MATLAB replicates input matrix Mv times vertically and h times horizontally. For example, to replicate existing matrix A into a new matrix B, use

A = [8 1 6; 3 5 7; 4 9 2] A =

8 1 6 3 5 7 4 9 2

B = repmat(A, 2, 4) B =

8 1 6 8 1 6 8 1 6 8 1 6 3 5 7 3 5 7 3 5 7 3 5 7 4 9 2 4 9 2 4 9 2 4 9 2 8 1 6 8 1 6 8 1 6 8 1 6 3 5 7 3 5 7 3 5 7 3 5 7 4 9 2 4 9 2 4 9 2 4 9 2

**Creating a Block Diagonal Matrix.** The blkdiag function combines matrices in a
diagonal direction, creating what is called a block diagonal matrix. All other
elements of the newly created matrix are set to zero:

A = magic(3);

B = [-5 -6 -9; -4 -4 -2]; C = eye(2) * 8;

D = blkdiag(A, B, C) D =

**Generating a Numeric Sequence**

Because numeric sequences can often be useful in constructing and indexing into matrices and arrays, MATLAB provides a special operator to assist in creating them.

This section covers
**•**“The Colon Operator”

**•**“Using the Colon Operator with a Step Value”

**The Colon Operator**

The colon operator (first:last) generates a 1-by-n matrix (or *vector*) of
sequential numbers from the first value to the last. The default sequence is
made up of incremental values, each 1 greater than the previous one:

A = 10:15 A =

10 11 12 13 14 15

The numeric sequence does not have to be made up of positive integers. It can include negative numbers and fractional numbers as well:

A = -2.5:2.5 A =

-2.5000 -1.5000 -0.5000 0.5000 1.5000 2.5000

By default, MATLAB always increments by exactly 1 when creating the sequence, even if the ending value is not an integral distance from the start:

A = 1:6.3 A =

1 2 3 4 5 6

Also, the default series generated by the colon operator always increments rather than decrementing. The operation shown in this example attempts to increment from 9 to 1 and thus MATLAB returns an empty matrix:

A = 9:1 A =

Empty matrix: 1-by-0

Creating and Concatenating Matrices

**Using the Colon Operator with a Step Value**

To generate a series that does not use the default of incrementing by 1, specify an additional value with the colon operator (first:step:last). In between the starting and ending value is a step value that tells MATLAB how much to increment (or decrement, if step is negative) between each number it generates.

To generate a series of numbers from 10 to 50, incrementing by 5, use A = 10:5:50

A =

10 15 20 25 30 35 40 45 50

You can increment by noninteger values. This example increments by 0.2: A = 3:0.2:3.8

A =

3.0000 3.2000 3.4000 3.6000 3.8000

To create a sequence with a decrementing interval, specify a negative step value:

A = 9:-1:1 A =

9 8 7 6 5 4 3 2 1

**Combining Unlike Data Types**

Data type conversion is done with respect to a preset precedence of data types. The following table shows the five data types you can concatenate with an unlike type without generating an error.

For example, concatenating a double and single matrix always yields a matrix of type single. MATLAB converts the double element to single to accomplish this.

**Empty Matrices**

If you construct a matrix using empty matrix elements, the empty matrices are ignored in the resulting matrix:

A = [5.36; 7.01; []; 9.44] A =

5.3600 7.0100 9.4400

**Examples**

Here are some examples of data type conversion during matrix construction.

**Combining Single and Double Types.** Combining single values with double values
yields a single matrix. Note that 5.73*10^300 is too big to be stored as a
single, thus the conversion from double to single sets it to infinity. (The
class function used in this example returns the data type for the input value):

x = [single(4.5) single(-2.8) pi 5.73*10^300] x =

4.5000 -2.8000 3.1416 Inf

**TYPE** **character** **integer** **single** **double** **logical**

**character** character character character character invalid

**integer** character integer integer integer integer

**single** character integer single single single

**double** character integer single double double

Creating and Concatenating Matrices

class(x) % Display the data type of x ans =

single

**Combining Integer and Double Types.** Combining integer values with double values
yields an integer matrix. Note that the fractional part of pi is rounded to the
nearest integer. (The int8 function used in this example converts its numeric
argument to an 8-bit integer):

x = [int8(21) int8(-22) int8(23) pi 45/6] x =

21 -22 23 3 7

class(x) ans = int8

**Combining Character and Double Types.** Combining character values with double
values yields a character matrix. MATLAB converts the double elements in
this example to their character equivalents:

x = ['A' 'B' 'C' 68 69 70] x =

ABCDEF

class(x) ans = char

**Combining Logical and Double Types.** Combining logical values with double
values yields a double matrix. MATLAB converts the logicaltrue and false
elements in this example to double:

x = [true false false pi sqrt(7)] x =

1.0000 0 0 3.1416 2.6458

**Accessing Elements of a Matrix**

This section explains how to use subscripting and indexing to access and assign values to the elements of a MATLAB matrix. It covers the following:

**•**“Accessing Single Elements” on page 1-14
**•**“Linear Indexing” on page 1-15

**•**“Functions That Control Indexing Style” on page 1-16
**•**“Accessing Multiple Elements” on page 1-16

**•**“Logical Indexing” on page 1-18

**Accessing Single Elements**

To reference a particular element in a matrix, specify its row and column number using the following syntax, where A is the matrix variable. Always specify the row first and column second:

A(row, column)

For example, for a 4-by-4 magic square A, A = magic(4)

A =

16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1

you would access the element at row 4, column 2 with A(4, 2)

ans = 14

Accessing Elements of a Matrix

**Linear Indexing**

With MATLAB, you can refer to the elements of a matrix with a single subscript, A(k). MATLAB stores matrices and arrays not in the shape that they appear when displayed in the MATLAB Command Window, but as a single column of elements. This single column is composed of all of the columns from the matrix, each appended to the last.

So, matrix A

A = [2 6 9; 4 2 8; 3 0 1] A =

2 6 9 4 2 8 3 5 1

is actually stored in memory as the sequence 2, 4, 3, 6, 2, 5, 9, 8, 1

The element at row 3, column 2 of matrix A (value = 5) can also be identified as
element 6 in the actual storage sequence. To access this element, you have a
choice of using the standard A(3,2) syntax, or you can use A(6), which is
referred to as *linear indexing*.

If you supply more subscripts, MATLAB calculates an index into the storage column based on the dimensions you assigned to the array. For example, assume a two-dimensional array like A has size [d1 d2], where d1 is the number of rows in the array and d2 is the number of columns. If you supply two subscripts (i, j) representing row-column indices, the offset is

(j-1) * d1 + i

**Functions That Control Indexing Style**

If you have row-column subscripts but want to use linear indexing instead, you can convert to the latter using the sub2ind function. In the 3-by-3 matrix A used in the previous section, sub2ind changes a standard row-column index of (3, 2) to a linear index of 6:

A = [2 6 9; 4 2 8; 3 0 1];

linearindex = sub2ind(size(A), 3, 2) linearindex =

6

To get the row-column equivalent of a linear index, use the ind2sub function: [row col] = ind2sub(size(A), 6)

row = 3 col = 2

**Accessing Multiple Elements**

For the 4-by-4 matrix A shown below, it is possible to compute the sum of the elements in the fourth column of A by typing

A = magic(4);

A(1,4) + A(2,4) + A(3,4) + A(4,4)

You can reduce the size of this expression using the colon operator. Subscript expressions involving colons refer to portions of a matrix. The expression

A(1:m, n)

refers to the elements in rows 1 through m of column n of matrix A. Using this notation, you can compute the sum of the fourth column of A more succinctly:

Accessing Elements of a Matrix

**Nonconsecutive Elements**

To refer to nonconsecutive elements in a matrix, use the colon operator with a step value. The m:3:n in this expression means to make the assignment to every third element in the matrix. Note that this example uses linear indexing:

B = A;

B(1:3:16) = -10 B =

-10 2 3 -10 5 11 -10 8 9 -10 6 12 -10 14 15 -10

**The end Keyword**

MATLAB provides a keyword called end that designates the last element in the dimension in which it appears. This keyword can be useful in instances where your program doesn’t know how many rows or columns there are in a matrix. You can replace the expression in the previous example with

B(1:3:end) = -10

**Note The keyword **end has two meanings in MATLAB. It can be used as
explained above, or to terminate a certain block of code (e.g., if and for
blocks).

**Specifying All Elements of a Row or Column**

The colon by itself refers to *all* the elements in a row or column of a matrix.
Using the following syntax, you can compute the sum of all elements in the
second column of a 4-by-4 magic square A:

sum(A(:, 2)) ans =

By using the colon with linear indexing, you can refer to all elements in the entire matrix. This example displays all the elements of matrix A, returning them in a column-wise order:

A(:) ans = 16 5 9 4 . . . 12 1

**Using a Matrix As an Index**

You can repeatedly access an array element using the ones function. To create a new 2-by-6 matrix out of the ninth element of a 4-by-4 magic square A,

B = A(9 * ones(2, 6)) B =

3 3 3 3 3 3 3 3 3 3 3 3

**Logical Indexing**

A logical matrix provides a different type of array indexing in MATLAB. While
most indices are numeric, indicating a certain row or column number, logical
indices are positional. That is, it is the *position* of each 1 in the logical matrix
that determines which array element is being referred to.

Getting Information About a Matrix

**Getting Information About a Matrix**

This section explains how to get the following information about an existing matrix:

**•**“Dimensions of the Matrix” on page 1-19
**•**“Data Types Used in the Matrix” on page 1-20
**•**“Data Structures Used in the Matrix” on page 1-21

**Dimensions of the Matrix**

These functions return information about the shape and size of a matrix.

The following examples show some simple ways to use these functions. Both use the 3-by-5 matrix A shown here:

A = rand(5) * 10; A(4:5, :) = [] A =

9.5013 7.6210 6.1543 4.0571 0.5789 2.3114 4.5647 7.9194 9.3547 3.5287 6.0684 0.1850 9.2181 9.1690 8.1317

**Example Using numel**

Using the numel function, find the average of all values in matrix A: sum(A(:))/numel(A)

ans = 5.8909

**Function** **Description**

length Return the length of the longest dimension. (The length of a matrix or array with any zero dimension is zero.)

**Example Using ndims, numel, and size**

Using ndims and size, go through the matrix and find those values that are between 5 and 7, inclusive:

if ndims(A) ~= 2 return

end

[rows cols] = size(A); for m = 1:rows

for n = 1:cols x = A(m, n);

if x >= 5 && x <= 7

disp(sprintf('A(%d, %d) = %5.2f', m, n, A(m,n))) end

end end

The code returns the following: A(1, 3) = 6.15

A(3, 1) = 6.07

**Data Types Used in the Matrix**

These functions test elements of a matrix for a specific data type.

**Function** **Description**

isa Detect if input is of a given data type. iscell Determine if input is a cell array.

Getting Information About a Matrix

**Example Using isnumeric and isreal**

Pick out the real numeric elements from this vector: A = [5+7i 8/7 4.23 39j pi 9-2i];

for m = 1:numel(A)

if isnumeric(A(m)) && isreal(A(m)) disp(A(m))

end end

The values returned are 1.1429

4.2300 3.1416

**Data Structures Used in the Matrix**

These functions test elements of a matrix for a specific data structure. isnumeric Determine if input is a numeric array.

isreal Determine if input is an array of real numbers. isstruct Determine if input is a MATLAB structure array.

**Function** **Description**

isempty Determine if input has any dimension with size zero. isscalar Determine if input is a 1-by-1 matrix.

issparse Determine if input is a sparse matrix.

isvector Determine if input is a 1-by-n or n-by-1 matrix.

**Resizing and Reshaping Matrices**

You can easily enlarge or shrink the size of a matrix, modify its shape, or rotate it about various axes. This section covers

**•**“Expanding the Size of a Matrix” on page 1-22
**•**“Diminishing the Size of a Matrix” on page 1-23
**•**“Reshaping a Matrix” on page 1-24

**Expanding the Size of a Matrix**

Attempting to access an element outside of the matrix generates an error: A = magic(4);

B = A(4, 7)

Index exceeds matrix dimensions

However, if you store a value in an element outside of the matrix, the size of the matrix increases to accommodate the new element.

A(4, 7) = 17 A =

16 2 3 13 0 0 0 5 11 10 8 0 0 0 9 7 6 12 0 0 0 4 14 15 1 0 0 17

Similarly, you can expand a matrix by assigning to a series of matrix elements. This example expands a 4-by-4 matrix to new dimensions, 5-by-7:

A(2:5, 5:7) = 5 A =

Resizing and Reshaping Matrices

**Diminishing the Size of a Matrix**

You can delete rows and columns from a matrix by assigning the empty array [] to those rows or columns. Start with

A = magic(4) A =

16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1

Then, delete the second column of A using A(:, 2) = []

This changes matrix A to A =

16 3 13 5 10 8 9 6 12 4 15 1

If you delete a single element from a matrix, the result isn’t a matrix anymore. So expressions like

A(1,2) = []

result in an error. However, you can use linear indexing to delete a single element, or a sequence of elements. This reshapes the remaining elements into a row vector:

A(2:2:10) = []

results in A =

**Reshaping a Matrix**

The following functions change the shape of a matrix.

**Examples**

Here are a few examples to illustrate some of the ways you can reshape matrices.

**Reshaping a Matrix.** Reshape 3-by-4 matrix A to have dimensions 2-by-6:
A = [1 4 7 10; 2 5 8 11; 3 6 9 12]

A =

1 4 7 10 2 5 8 11 3 6 9 12

B = reshape(A, 2, 6) B =

1 3 5 7 9 11 2 4 6 8 10 12

**Function** **Description**

reshape Modify the shape of a matrix. rot90 Rotate the matrix by 90 degrees. fliplr Flip the matrix about a vertical axis. flipud Flip the matrix about a horizontal axis. flipdim Flip the matrix along the specified direction.

transpose Flip a matrix about its main diagonal, turning row vectors into column vectors and vice versa.

Resizing and Reshaping Matrices

**Transposing a Matrix.** Transpose A so that the row elements become columns. You
can use either the transpose function or the transpose operator (.') to do this:

B = A.' B =

1 2 3 4 5 6 7 8 9 10 11 12

There is a separate function called ctranspose that performs a complex conjugate transpose of a matrix. The equivalent operator for ctranpose on a matrix A is A':

A = [1+9i 2-8i 3+7i; 4-6i 5+5i 6-4i] A =

1.0000 + 9.0000i 2.0000 -8.0000i 3.0000 + 7.0000i 4.0000 -6.0000i 5.0000 + 5.0000i 6.0000 -4.0000i

B = A' B =

1.0000 -9.0000i 4.0000 + 6.0000i 2.0000 + 8.0000i 5.0000 -5.0000i 3.0000 -7.0000i 6.0000 + 4.0000i

**Rotating a Matrix.** Rotate the matrix by 90 degrees:
B = rot90(A)

B =

10 11 12 7 8 9 4 5 6 1 2 3

**Flipping a Matrix.** Flip A in a left-to-right direction:
B = fliplr(A)

B =

**Shifting and Sorting Matrices**

You can sort matrices, multidimensional arrays, and cell arrays of strings along any dimension and in ascending or descending order of the elements. The sort functions also return an optional array of indices showing the order in which elements were rearranged during the sorting operation.

This section covers

**•**“Shift and Sort Functions” on page 1-26

**•**“Shifting the Location of Matrix Elements” on page 1-26
**•**“Sorting the Data in Each Column” on page 1-28

**•**“Sorting the Data in Each Row” on page 1-28
**•**“Sorting Row Vectors” on page 1-29

**Shift and Sort Functions**

Use these functions to shift or sort the elements of a matrix.

**Shifting the Location of Matrix Elements**

The circshift function shifts the elements of a matrix in a circular manner along one or more dimensions. Rows or columns that are shifted out of the matrix circulate back into the opposite end. For example, shifting a 4-by-7 matrix one place to the left moves the elements in columns 2 through 7 to columns 1 through 6, and moves column 1 to column 7.

**Function** **Description**

circshift Circularly shift matrix contents.

sort Sort array elements in ascending or descending order. sortrows Sort rows in ascending order.

Shifting and Sorting Matrices

Create a 5-by-8 matrix named A and shift it to the right along the second (horizontal) dimension by three places. (You would use [0,-3] to shift to the left by three places):

A = [1:8; 11:18; 21:28; 31:38; 41:48] A =

1 2 3 4 5 6 7 8 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 28 31 32 33 34 35 36 37 38 41 42 43 44 45 46 47 48

B = circshift(A, [0, 3]) B =

6 7 8 1 2 3 4 5 16 17 18 11 12 13 14 15 26 27 28 21 22 23 24 25 36 37 38 31 32 33 34 35 46 47 48 41 42 43 44 45

Now take A and shift it along both dimensions: three columns to the right and two rows up:

A = [1:8; 11:18; 21:28; 31:38; 41:48];

B = circshift(A, [-2, 3]) B =

26 27 28 21 22 23 24 25 36 37 38 31 32 33 34 35 46 47 48 41 42 43 44 45 6 7 8 1 2 3 4 5 16 17 18 11 12 13 14 15

Since circshift circulates shifted rows and columns around to the other end of a matrix, shifting by the exact size of A returns all rows and columns to their original location:

B = circshift(A, size(A));

all(B(:) == A(:)) % Do all elements of B equal A? ans =

**Sorting the Data in Each Column**

The sort function sorts matrix elements along a specified dimension. The syntax for the function is

sort(matrix, dimension)

To sort the columns of a matrix, specify 1 as the dimension argument. To sort along rows, specify dimension as 2.

This example first constructs a 3-by-5 matrix: A = rand(3,5) * 10

A =

9.5013 7.6210 6.1543 4.0571 0.5789 2.3114 4.5647 7.9194 9.3547 3.5287 6.0684 0.1850 9.2181 9.1690 8.1317

Sort each column of A in ascending order: c = sort(A, 1)

c =

2.3114 0.1850 6.1543 4.0571 0.5789 6.0684 4.5647 7.9194 9.1690 3.5287 9.5013 7.6210 9.2181 9.3547 8.1317

issorted(c(:, 1)) ans =

1

**Sorting the Data in Each Row**

Sort each row of A in descending order. Note that issorted tests for an ascending sequence. You can flip the vector to test for a sorted descending sequence:

r = sort(A, 2, 'descend') r =

Shifting and Sorting Matrices

issorted(fliplr(r(1, :))) ans =

1

When you specify a second output, sort returns the indices of the original matrix A positioned in the order they appear in the output matrix. In the following example, the second row of index contains the sequence 4 3 2 5 1, which means that the sorted elements in output matrix r were taken from A(2,4), A(2,3), A(2,2), A(2,5), and A(2,1):

[r index] = sort(A, 2, 'descend'); index

index =

1 2 3 4 5 4 3 2 5 1 3 4 5 1 2

**Sorting Row Vectors**

The sortrows function keeps the elements of each row in their original order but sorts the entire row vectors according to the order of the elements in the first column:

rowsort = sortrows(A) rowsort =

2.3114 4.5647 7.9194 9.3547 3.5287 6.0684 0.1850 9.2181 9.1690 8.1317 9.5013 7.6210 6.1543 4.0571 0.5789

To run the sort based on a different column, include a second input argument that indicates which column to use. This example sorts the row vectors so that the elements in the third column are in ascending order:

rowsort = sortrows(A, 3) rowsort =

9.5013 7.6210 6.1543 4.0571 0.5789 2.3114 4.5647 7.9194 9.3547 3.5287 6.0684 0.1850 9.2181 9.1690 8.1317

issorted(rowsort(:, 3)) ans =

**Operating on Diagonal Matrices**

There are several MATLAB functions that work specifically on diagonal matrices.

**Constructing a Matrix from a Diagonal Vector**

The diag function has two operations that it can perform. You can use it to generate a diagonal matrix:

A = diag([12:4:32]) A =

12 0 0 0 0 0 0 16 0 0 0 0 0 0 20 0 0 0 0 0 0 24 0 0 0 0 0 0 28 0 0 0 0 0 0 32

You can also use the diag function to scan an existing matrix and return the values found along one of the diagonals:

A = magic(5) A =

17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9

**Function** **Description**

blkdiag Construct a block diagonal matrix from input arguments. diag Return a diagonal matrix or the diagonals of a matrix. trace Compute the sum of the elements on the main diagonal. tril Return the lower triangular part of a matrix.

Operating on Diagonal Matrices

diag(A, 2) % Return contents of second diagonal of A ans =

1 14 22

**Returning a Triangular Portion of a Matrix**

The tril and triu functions return a triangular portion of a matrix, the former returning the piece from the lower left and the latter from the upper right. By default, the main diagonal of the matrix divides these two segments. You can use an alternate diagonal by specifying an offset from the main diagonal as a second input argument:

A = magic(6);

B = tril(A, -1) B =

0 0 0 0 0 0 3 0 0 0 0 0 31 9 0 0 0 0 8 28 33 0 0 0 30 5 34 12 0 0 4 36 29 13 18 0

**Concatenating Matrices Diagonally**

**Empty Matrices, Scalars, and Vectors**

Although matrices are two dimensional, they do not always appear to have a rectangular shape. A 1-by-8 matrix, for example, has two dimensions yet is linear. These matrices are described in the following sections:

**•**“The Empty Matrix” on page 1-32

An *empty matrix* has one of more dimensions that are equal to zero. A
two-dimensional matrix with both dimensions equal to zero appears in
MATLAB as []. The expression A = [] assigns a 0-by-0 empty matrix to A.
**•**“Scalars” on page 1-33

A *scalar* is 1-by-1 and appears in MATLAB as a single real or complex
number (e.g., 7, 583.62, -3.51, 5.46097e-14, 83+4i).

**•**“Vectors” on page 1-34

A *vector* is 1-by-n or n-by-1, and appears in MATLAB as a row or column of
real or complex numbers:

Column Vector Row Vector

53.2 53.2 87.39 4-12i 43.9 87.39

4-12i 43.9

**The Empty Matrix**

A matrix having at least one dimension equal to zero is called an empty matrix. The simplest empty matrix is 0-by-0 in size. Examples of more complex matrices are those of dimension 0-by-5 or 10-by-0.

To create a 0-by-0 matrix, use the square bracket operators with no value specified:

A = [];

whos A

Name Size Bytes Class

Empty Matrices, Scalars, and Vectors

You can create empty matrices (and arrays) of other sizes using the zeros, ones, rand, or eye functions. To create a 0-by-5 matrix, for example, use

A = zeros(0,5)

**Operating on an Empty Matrix**

The basic model for empty matrices is that any operation that is defined for m-by-n matrices, and that produces a result whose dimension is some function of m and n, should still be allowed when m or n is zero. The size of the result of this operation is consistent with the size of the result generated when working with nonempty values, but instead is evaluated at zero.

For example, horizontal concatenation C = [A B]

requires that A and B have the same number of rows. So if A is m-by-n and B is m-by-p, then C is m-by-(n+p). This is still true if m or n or p is zero.

As with all matrices in MATLAB, you must follow the rules concerning compatible dimensions. In the following example, an attempt to add a 1-by-3 matrix to a 0-by-3 empty matrix results in an error:

[1 2 3] + ones(0,3)

??? Error using ==> +

Matrix dimensions must agree.

**Scalars**

Any individual real or complex number is represented in MATLAB as a 1-by-1 matrix called a scalar value:

A = 5;

ndims(A) % Check number of dimensions in A ans =

2

size(A) % Check value of row and column dimensions ans =

Use the isscalar function to tell if a variable holds a scalar value: isscalar(A)

ans = 1

**Vectors**

Matrices with one dimension equal to one and the other greater than one are called vectors. Here is an example of a numeric vector:

A = [5.73 2-4i 9/7 25e3 .046 sqrt(32) 8j];

size(A) % Check value of row and column dimensions ans =

1 7

You can construct a vector out of other vectors, as long as the critical

dimensions agree. All components of a row vector must be scalars or other row vectors. Similarly, all components of a column vector must be scalars or other column vectors:

A = [29 43 77 9 21]; B = [0 46 11];

C = [A 5 ones(1,3) B] C =

29 43 77 9 21 5 1 1 1 0 46 11

Concatenating an empty matrix to a vector has no effect on the resulting vector. The empty matrix is ignored in this case:

A = [5.36; 7.01; []; 9.44] A =

5.3600 7.0100 9.4400

Use the isvector function to tell if a variable holds a vector: isvector(A)

Full and Sparse Matrices

**Full and Sparse Matrices**

It is not uncommon to have matrices with a large number of zero-valued elements and, because MATLAB stores zeros in the same way it stores any other numeric value, these elements can use memory space unnecessarily and can sometimes require extra computing time.

Sparse matrices provide a way to store data that has a large percentage of zero
elements more efficiently. While *full matrices* internally store every element in
memory regardless of value, *sparse matrices* store only the nonzero elements
and their row indices. Using sparse matrices can significantly reduce the
amount of memory required for data storage.

You can create sparse matrices for the double and logical data types. All MATLAB built-in arithmetic, logical, and indexing operations can be applied to sparse matrices, or to mixtures of sparse and full matrices. Operations on sparse matrices return sparse matrices and operations on full matrices return full matrices.

See the section on “Sparse Matrices” in the MATLAB Mathematics documentation for more information on working with sparse matrices.

**Sparse Matrix Functions**

This table shows some of the functions most commonly used when working with sparse matrices.

**Function** **Description**

full Convert a sparse matrix to a full matrix. issparse Determine if a matrix is sparse.

nnz Return the number of nonzero matrix elements. nonzeros Return the nonzero elements of a matrix.

nzmax Return the amount of storage allocated for nonzero elements.

spalloc Allocate space for a sparse matrix.

speye Create a sparse identity matrix.

sprand Create a sparse uniformly distributed random matrix.

Multidimensional Arrays

**Multidimensional Arrays**

An array having more than two dimensions is called a multidimensional array in MATLAB. Most of the operations that you can perform on matrices (i.e., two-dimensional arrays) can also be done on multidimensional arrays. This section shows how to create and manipulate these arrays. It covers

**•**“Overview” on page 1-37

**•**“Creating Multidimensional Arrays” on page 1-39

**•**“Accessing Multidimensional Array Properties” on page 1-43
**•**“Indexing Multidimensional Arrays” on page 1-43

**•**“Reshaping Multidimensional Arrays” on page 1-47
**•**“Permuting Array Dimensions” on page 1-49

**•**“Computing with Multidimensional Arrays” on page 1-51
**•**“Organizing Data in Multidimensional Arrays” on page 1-53
**•**“Multidimensional Cell Arrays” on page 1-55

**•**“Multidimensional Structure Arrays” on page 1-56

**Overview**

Multidimensional arrays in MATLAB are an extension of the normal two-dimensional matrix. Matrices have two dimensions: the row dimension and the column dimension.

You can access a two-dimensional matrix element with two subscripts: the first representing the row index, and the second representing the column index.

(1,1) (1,2) (1,3) (1,4)

(2,1) (2,2) (2,3) (2,4)

(3,1) (3,2) (3,3) (3,4)

(4,1) (4,2) (4,3) (4,4)

column

Multidimensional arrays use additional subscripts for indexing. A
three-dimensional array, for example, uses three subscripts:
**•**The first references array dimension 1, the row.

**•**The second references dimension 2, the column.

**•**The third references dimension 3. This illustration uses the concept of a *page*
to represent dimensions 3 and higher.

To access the element in the second row, third column of page 2, for example, you use the subscripts (2,3,2).

row

(1,1,3) (1,2,3) (1,3,3) (1,4,3)

(2,1,3) (2,2,3) (2,3,3) (2,4,3)

(3,1,3) (3,2,3) (3,3,3) (3,4,3)

(4,1,3) (4,2,3) (4,3,3) (4,4,3) (1,1,2) (1,2,2) (1,3,2) (1,4,2)

(2,1,2) (2,2,2) (2,3,2) (2,4,2)

(3,1,2) (3,2,2) (3,3,2) (3,4,2)

(4,1,2) (4,2,2) (4,3,2) (4,4,2) (1,1,1) (1,2,1) (1,3,1) (1,4,1)

(2,1,1) (2,2,1) (2,3,1) (2,4,1)

(3,1,1) (3,2,1) (3,3,1) (3,4,1)

(4,1,1) (4,2,1) (4,3,1) (4,4,1) page

column

A(:,:,1) =

1 0 3 4 -1 2 8 2 1

A(:,:,2) =

6 8 3 4 3 6 5 9 2 6 8 3

4 3 6 5 9 2 1 0 3

4 -1 2 8 2 1

Multidimensional Arrays

As you add dimensions to an array, you also add subscripts. A four-dimensional array, for example, has four subscripts. The first two reference a row-column pair; the second two access the third and fourth dimensions of data.

**Note The general multidimensional array functions reside in the **datatypes
directory.

**Creating Multidimensional Arrays**

You can use the same techniques to create multidimensional arrays that you use for two-dimensional matrices. In addition, MATLAB provides a special concatenation function that is useful for building multidimensional arrays. This section discusses

**•**“Generating Arrays Using Indexing” on page 1-39
**•**“Extending Multidimensional Arrays” on page 1-40

**•**“Generating Arrays Using MATLAB Functions” on page 1-41

**•**“Building Multidimensional Arrays with the cat Function” on page 1-41

**Generating Arrays Using Indexing**

One way to create a multidimensional array is to create a two-dimensional array and extend it. For example, begin with a simple two-dimensional array A.

A = [5 7 8; 0 1 9; 4 3 6];

A is a 3-by-3 array, that is, its row dimension is 3 and its column dimension is 3. To add a third dimension to A,

A(:,:,2) = [1 0 4; 3 5 6; 9 8 7]

MATLAB responds with A(:,:,1) =

A(:,:,2) =

1 0 4 3 5 6 9 8 7

You can continue to add rows, columns, or pages to the array using similar assignment statements.

**Extending Multidimensional Arrays**

To extend A in any dimension:
**•**Increment or add the appropriate subscript and assign the desired values.
**•**Assign the same number of elements to corresponding array dimensions. For

numeric arrays, all rows must have the same number of elements, all pages must have the same number of rows and columns, and so on.

You can take advantage of the MATLAB scalar expansion capabilities, together with the colon operator, to fill an entire dimension with a single value:

A(:,:,3) = 5;

A(:,:,3) ans =

5 5 5 5 5 5 5 5 5

To turn A into a 3-by-3-by-3-by-2, four-dimensional array, enter A(:,:,1,2) = [1 2 3; 4 5 6; 7 8 9];

A(:,:,2,2) = [9 8 7; 6 5 4; 3 2 1]; A(:,:,3,2) = [1 0 1; 1 1 0; 0 1 1];