【Matlab基础】02. 矩阵与元胞数组

【Matlab基础】02. 矩阵与元胞数组

4 年前 · 来自专栏 数学建模与数学实验

Matlab的基本数据元素就是矩阵,可以是2维、1维(向量)、3维或更多维。

一、矩阵创建与表示

Matlab不用提前声明或定义变量,直接“起变量名、赋值、使用”。

:Matlab的变量名必须字母开头,由字母、下划线、数字构成,对字母大小写敏感;起变量名时应避开Matlab里的关键词。


1. 特殊向量

k=1:1:10  %创建行向量k, 起始值1, 步长1,终止值10
          %默认步长是1, 同k=1:10          
          %Matlab语句结束用分号, 否则将自动输出该语句的执行结果

运行结果 :k = 1 2 3 4 5 6 7 8 9 10


2.一般矩阵 (字符串为元素的矩阵建议用元胞数组)

A=[1 2,3;4 5,6] %创建2行3列矩阵A, 矩阵大小不用预先定义
                    %矩阵元素必须放在“[ ]”内
                    %同行元素间用“, 或空格”隔开
                    %行与行间用“;”隔开
                    %矩阵元素可以是数值、变量、字符、函数表达式

运行结果 :A = 1 2 3

4 5 6

3.特殊矩阵

ones(m,n)——生成m×n维的全“1”矩阵

zeros(m,n)——生成m×n维的全“0”矩阵

eye(m,n)——生成m×n维的单位矩阵(多余的行或列全为0)

diag(k或A) ——生成或提取对角矩阵

triu(A)——提取矩阵A的上三角部分生成上三角矩阵

tril(A)——提取矩阵A的下三角部分生成下三角矩阵

rand(m,n)——生成m×n维的(0,1)区间均匀分布的随机矩阵

randn(m,n)——生成m×n维均值为0,方差为1的标准正态分布随机矩阵

fiplr(A)——矩阵A左右翻转

fipud(A)——矩阵A上下翻转

fipdim(A,dim)——矩阵A特定维度dim(1,2)翻转

sparse()——生成稀疏矩阵

full()——将稀疏矩阵化为普通矩阵

4.矩阵的维度、大小、长度

a=ndims(A)     %返回矩阵A的维度(几维矩阵)
[I,J]=size(A) %返回矩阵A各维度维数的大小(几行,几列)
L=length(A)   %返回矩阵A各维度维数的最大值(行数,列数的最大值),常用来测量向量的大小

运行结果:a = 2 I = 2 J = 3
L = 3


5. 矩阵拼接、扩充、变形

C = [A, B]——水平拼接

D = [A; B]——垂直拼接

repmat(A,[m,n])——重复生成m×n个的A

reshape(X, 3, 8)——把X变形为3×8的二维矩阵


二、矩阵元素的寻址和访问

1. 访问2维矩阵元素有两种方式

(1) 行列下标索引

A(i,j)——第i行,第j列的元素

(2)线性索引,也是矩阵存放元素的顺序,reshape()变形保持该顺序

A(1),A(2), …, A(m*n)——元素依次取自第1列,再第2列,……

故A(i,j) = A( (j-1)*m+i)

两种索引间的转换函数:

[I,J] = ind2sub( size(A), IND)

[IND]= sub2ind(size(A), I, J)


find()函数常用来查找矩阵中满足一定条件的元素

A=[1 2 3;4 5 6]
ind=find(A>4)    %返回A中大于4的元素的线性索引值
[m,n]=find(A>4)  %返回A中大于4的元素的行列下标索引值
[I,J]=ind2sub(size(A),ind); %线性索引转行列下标索引
IND=sub2ind(size(A),I,J);  %行列下标索引转线性索引

运行结果
A = 1 2 3

4 5 6

IND = 4 6

m = 2
2

n = 2

3

2. 用冒号“:”获取矩阵的一些元素

A(i,:)——矩阵A的第i行,所有列

A(:,j)——矩阵A的第j列,所有行

A(:,i:j)——矩阵A的第i到第j列,所有行

A(i:j,k:end)——矩阵A的第i到第j行,第k到最后一列

A(:,[1,3])——矩阵A的第1、第3列,所有行

A(:)——按线性索引返回矩阵A的所有元素(向量)


3. 利用空矩阵删除矩阵元素

A(i,:) = []——删除矩阵A的第i行

A(:, j) = []——删除矩阵A的第j列

A(i:j,:) = []——删除矩阵A的第i到第j行

A(:,i:j) = []——删除矩阵A的第i到第j列

A(sub2ind(size(A),i, j)) = []——删除矩阵A的第i行第j列的元素


三、矩阵运算与矩阵函数

1. 矩阵运算

(1) 通常的矩阵间运算

加、减、乘、幂: + - * ^

左除 \ : AX=B \rightarrow X = A^{-1}B \rightarrow X = A \backslash B

右除 / : YA=C \rightarrow Y = C A^{-1} \rightarrow Y = C / A

(2) 点运算——同型矩阵各个对应位置的元素做该运算

点乘、点左除、点右除、点幂: .* .\ ./ .^

.+ .- 同+ -

(3) 矩阵运算

A’——转置

inv(A)——方阵的逆

pinv(A)——非方阵的广义逆,即ABA=A, BAB=B

norm(A)= norm(A,2); norm(A,1); norm(A,inf)——矩阵或向量的范数

det(A)——方阵的行列式

rank(A)——矩阵的秩

trace(A)——矩阵的迹

null(A)——基础解系(矩阵的零空间)

orth(A)——标准正交化

rref(A)——化行最简型(初等行变换解线性方程组)

subspace(A,B)——两个子空间的夹角(两个向量的夹角

[v,d]=eig(A)——方阵的特征值(对角阵d)与特征向量(v的列向量)


2. 矩阵函数

min(A)——按列求矩阵A最小值,min(x,[],2)按行求最小值

max(A)——按列求矩阵A的最大值,max(x,[],2)按行求最大值

mean(A)=mean(A,1)——按列求矩阵A的平均值(A非行向量)

sort(A)——矩阵各列按递增顺序排序

sort(A,'descend')——矩阵各列按递减顺序排序

sum(A)——矩阵A各列元素求和

prod(A)——矩阵A各列元素求积

dot(A,B)——A,B(同型)各列做内积(点积)

cross(A,B)——A,B(至少某个维度是3维)的外积(叉积)

cumsum(A)——每列元素的累计和(第i行是A前i-1行元素的和)

cumprod(A)——每列元素的累计积


四、三维矩阵

可以想象成一本书的“行、列、页”。

处理k个m×n的二维矩阵,可用一个m×n×k的三维矩阵A:

A(:,:, 1) 表示第1个m×n矩阵(第1页)

A(:,:, 2) 表示第2个m×n矩阵(第2页)

………………

A(:,:, k) 表示第k个m×n矩阵(第k页)

每个A(:, :, k)与2维矩阵操作一样。

五、元胞数组

矩阵只适合存放和处理若干相同类型的数据,要想同时存放和处理多种类型的数据就需要用元胞数组。

1. 元胞数组的创建

用“{ }”来创建,以区别创建矩阵的“[ ]”。


(1) 赋值语句创建

a = {'hello' [1 2 3; 4 5 6]; 1 {'1' '2'}}  
%创建2×2的元胞数组,
%同行元素间用“, 或空格”隔开
%行与行间用“;”隔开
%第1行第1列的元胞,存放字符串'hello';
%第1行第2列的元胞,存放一个2×3矩阵
%第2行第1列的元胞,存放数 1
%第2行第2列的元胞,存放1×2元胞数组