Matlab 对数组/矩阵的常用操作(矩阵运算,数学函数)

Part.I Introduction

Chap.I 传送门

Chap.II 预备知识

关于数组的索引,详见下图:

Part.II 数组矩阵相关

Chap.I 构造

  • 构造一个复数:a = 0 + 1i
  • 构造一个m*n的零矩阵:zeros(m,n)
  • 构造一个m*n的单位阵(长方形就用0补齐):eye(m,n)

1.简单创建
//空数组-标量-行/列向量-二维/多维数组 []
A=[];//空数组
A=[1 2 3 4]; //直接输入法-行向量
A=[1;2;3;4]; //直接输入法-列向量
A=start:step:end; //冒号法-行向量
A=linespace(start,end,n) //等差数列
A=logspace(start,end,n)  //等比数列 

2.函数创建
//下列函数中若参数只有一个,则产生方阵
zeros(m,n)  	//产生m x n 的零矩阵
ones(m,n)   	//产生所有元素都为1 的 m x n 矩阵
eye(m,n)  		//产生m x n 的单位阵
pascal(m,n)  	//产生m x n 的Pascal 矩阵
hilb(n)  		//产生n x n 的Hilbert 矩阵
rand(m,n)  		//产生m x n [0,1] 均匀分布的随机数矩阵
randn(m,n)  	//产生m x n (0,1)的正态分布的随机数矩阵
magic(n)  		//产生n x n 的魔方阵,其每行、列及对角线上的元素和都相等
diag(v,k)  		//对角数组
/*其第k条对角线元素对应向量v的元素,k缺省为0 
k>0表示主对角线向右上偏离k个元素位置的对角线, 
k<0则向左下偏离
如果输入参数v是二维数组,则函数diag提取对角元素组成一个一维向量*/
diag([1 2],1)

3.数组属性
//1.测试函数,返回值为逻辑上的0(false) / 1(true)
isempty,  isscalar,  isvector,  issparse
size(x)  		//返回数组大小,一个保存数组维数的行向量
length(x) 		//返回数组维数中较大的那一个
numel(x)  		//返回数组所有元素个数
//单下标与全下标的转换:对于m行n列的数组A,
A(x,y)=A((y-1)*m+x)
sub2ind(size(x),2,10)
[i j]=ind2sub(size(x),20)

Chap.II 矩阵运算

  • 两个向量的点积(内积,标量积;相乘相加):dot(a,b)
  • 两个向量的叉积(外积,矢量积;结果垂直于两向量形成的平面,或者说结果是两向量形成平面的法向量):cross(a,b)
  • 两个矩阵的点乘除(两矩阵size一致,对应元素做运算):c=a.*b
  • 两个矩阵的乘除(矩阵运算):c=a*bc=a/b=a*inv(b)
  • 将一个向量单位化(归一化):p=p/norm(p)
  • 求矩阵的特征值和特征向量:[X,D]=eig(A);,得到的结果中D 是一个对角矩阵,对角线上的元素就是其各个特征值;X各列是特征值对应的特征向量。
  • 已知 A B = 0 AB=0 AB=0 A A A,求 B B BB=null(A)的列向量为方程 A x = 0 Ax=0 Ax=0 的正交规范基( B T B = I B^TB=I BTB=I);B=null(A,'r')的列向量为方程 A x = 0 Ax=0 Ax=0 的有理基;实际上,函数null用来求解零空间,即满足方程组 A X = 0 AX=0 AX=0 的解空间。实际上是求出的是解空间的一组解(基础解系)。
  • 已知特征值求特征向量:因为 A x = λ x Ax=\lambda x Ax=λx,所以 ( λ I − A ) x = 0 (\lambda I-A)x=0 (λIA)x=0;所以x=null(lambda*eye(n)-A,'r')
1.数组连接
cat(dim,A1,A2,)//按照指定的方向将多个数组连接成大尺寸数组
horzcat(A1,A2,)//水平方向连接数组,相当于cat(2,A1,A2,…)
vertcat(A1,A2,)//垂直方向连接数组,相当于cat(1,A1,A2,…)
repmat(A,m,n)   //块状复制函数-把数组A当作单个元素,扩展出m行n列的由此单个元素组成的扩展数组
blkdiag(A, B,)//对角块生成函数-把数组A,B作为新数组的主对角块,其他位置用零数组块填充

2.数组翻转
fliplr(A)//flip matrix in left/right direction -左右翻转
flipud(A)//上下翻转
flipdim(A,k)//按指定方向翻转, k=1上下, k=2左右
rot90(A,k)//逆时针旋转k*90度
reshape(A,m,n)//数组尺寸调整,将数组调整为 m x n 形式

3.数组运算
A+B
A-B
A*B
A/B // A*inv(B)
A\B // inv(A)*B
A^n // n为整数, n个A相乘
A.*B// 两个数组的对应元素相乘
A./B// A的各个元素为分子, B的对应元素为分母,逐个做除法
A.\B// A的各个元素为分母, B的对应元素为分子,逐个做除法
A.^B// 逐个元素求幂
sum(A,1)	// 按列方向对矩阵元素求和,得到一个行向量
sum(A,2)	// 按行方向对矩阵元素求和,得到一个列向量
cumsum(A,1)	// 按列方向对矩阵元素累积求和,得到一个和原矩阵 size 相同的矩阵
cumsum(A,2) // 按行方向对矩阵元素累积求和,得到一个和原矩阵 size 相同的矩阵

4.数组查找
a=find(A)//返回单下标
[a,b]=find(A)//返回双下标
//find函数通常结合各种关系运算和逻辑运算,实现各种查找功能

5.数组排序
sort(A)
...

Chap.III 比较杂的功能实现

判断两个矩阵是否相等

判断两个矩阵是否相等有函数isequal()all(A(:) == B(:)),首先做了如下实验:

//逻辑上的 0(false) / 1(true)
isequal(1,1) //1
isequal(nan,nan) //0
isequal(inf,inf) //1

matlab判断两个浮点数是否相等实际上并不是判断他们两个绝对意义上是否相等,而是有一个精度限制的,用代码表示为:

a=[1:5];  // 1     2     3     4     5
b=[1:5];  // 1     2     3     4     5
all(a(:) == b(:));   //1
a(1,1)=1+1e-30;      //1     2     3     4     5
all(a(:) == b(:));   //1
abs(a-b)<eps         //判断a,b是否相等相当于判断他俩的绝对值是否小于eps
//eps是一个很小的数,可能可以自己设置。

现在我们已经知道,在matlab里面nan~=nan,如果想判断两个矩阵(里面有nan元素)是否相等,咋整呢?这里提供一个小函数,大体思路就是,把nan换成inf,然后再判断两个矩阵知否相等。

%myequal.m
function eq=myequal(mat1,mat2)
mat1(isnan(mat1))=inf;  %这个数字可以是其他的,只要不是nan即可
mat2(isnan(mat2))=inf;
eq=isequal(mat1,mat2);
end

求卷积
卷积就是相乘相加,相爱相杀。
普通版求卷积:con=sum(sum(mat1.*mat2))
nan版求卷积:con=nansum(nansum(mat1.*mat2));
naninf版求卷积:

%convol.m
%卷积小函数 convolution 
function con=convol(mat1,mat2)
mat1(mat1==inf)=nan; %把inf换成nan而已
mat2(mat2==inf)=nan;
con=nansum(nansum(mat1.*mat2));
end

Chap.IV 矩阵分解

R = chol(A)			// Cholesky 分解,A=R^T*R
[U,S,V] = svd(A)	// svd 分解
[L,U,P]=lu(A)		// LU 分解,我们要的通常意义上的 L=P'L, P 称为置换矩阵


Part.III 数学相关函数

下面是数学上相关函数在Matlab中的实现

  • Γ \Gamma Γ 函数:gamma(X)

数学上的求最值、众数、中位数、统计频率等

m=yourmat;
[a,b]=size(m);					// 矩阵的行列是a,b
num=a*b-numel(find(isnan(a))); 	// 矩阵中除了nan外所有元素的个数
m1=reshape(m,a*b,1);      		// 搞成一个列向量,或者直接m1=m(:);
max1=max(m1);             		// 计算最大值
min1=min(m1);             		// 计算最小值
mean1=nanmean(m1);        		// 计算除nan之外的均值,mean
mode1=mode(m1);           		// 除了nan 返回值最小的那个众数
med1=nanmedian(m1);       		// 求除了nan的中位数,median
k(isinf(m1))=[];          		// 去掉inf
k(isnan(m1))=[];          		// 去掉nan
per=tabulate(k);          		// 统计频率和频数
find(m==1);               		// 找到m中等于1的元素的位置,列向量
sum(sum(m>3));            		// 求m矩阵大于3的元素个数
sum(sum(m==3));           		// 求m矩阵等于3的元素个数
A=m(:);                   		// 快速把一个多维矩阵变成一个列向量
photo1(isnan(photo1))=inf;		// 把一个数替换成另一个数
photo1(photo1==1)=inf;
//注:上述求最值的函数是对列向量的操作,若对矩阵操作可重叠函数使用。
R=corrcoef(cov1);		  		// 求协方差矩阵的相关系数矩阵

Reference

  1. 描述矩阵特征(属性)的值
  2. 常用的概念汇总(矩阵、矩阵关系、空间)
  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值