遇到过的MATLAB函数小总结

MATLAB遇到过的函数小总结

由于MATLAB中用过的函数总是会忘,于是想总结一下。虽然没什么时间去复习(也没这个必要),用的时候直接百度就完事了。但总结一遍总会有那么一丁点用吧,慢慢更新,持续更新,见到一个新的且有意义的就总结下来!电脑端可直接Ctrl+F搜索想看的函数。

一:常用乱七八糟函数

randint

旧的输出整数矩阵,新版MATLAB用randi代替了,但是参数不太一样
randint(1,LEN,MAX)
>> 输出1行,LEN列矩阵,范围为0 ~ MAX - 1

randi

输出整数矩阵
randi([0, MAX], 1, LEN)
>> 输出1行,LEN列矩阵,范围为0 ~ MAX,均匀分布整数
randi(MAX, 1, LEN)
>> 输出1行,LEN列矩阵,范围为1 ~ MAX,均匀分布整数

randn

randn(ROW, COL)
>> 输出ROW行COL列符合标准正态分布的随机数N(0,1)

normrnd

normrnd(mu, delta, 1, LEN)
直接输出1行,LEN列符合正态分布N(mu,delta^2)的随机数,注意输入为标准差

rand

rand(ROW, COL)
>> 输出ROW行COL列符合[0, 1]间均匀分布的随机数

unidrnd

unidrnd(n, ROW, COL)
>> 输出(0, n]之间的离散均匀分布随机整数

randperm

输出不重复随机向量排列
randperm(6)
>> 3 2 6 1 4 5

eval

可以做到类似str2dec操作
eval(\'123\')
>> 123

findstr

找到字符串的下标(从1开始)
findstr(\'asdfgasdfgaasdf\',\'as\')
>> 1 6 12

find

找到数组非零元素
findstr([1 2 3; 1 2 3; 1 2 3])
>> 1 2 3 4 5 6 7 8 9

vpa

设置变量的精度,比如运算过程中a = 3.141
vpa(a, 8)
>>a = 3.14159265

linspace

输出x到y,固定点数n,点之间间隔相等的的一串向量。不设n默认100点
linspace(x,y,n)

conj

求共轭

floor

地板函数,向下取整

ceil

天花板函数,向上取整

mod

mod(x,y),取模(余),结果与y的符号一致,注意与rem的区别
mod(-10,3)
>> 2
因为-10 = -4 * 3 + 2

mod(10,-3)
>> -2
因为10 = -4 * -3 + (-2)

rem

rem(x,y),取余,结果与x的符号一致,注意与mod的区别
rem(-10,3)
>> -1
因为-10 = -3 * 3 + (-1)

rem(10,-3)
>> 1
因为10 = -3 * -3 + 1

round

四舍五入

二:矩阵简单变换

fftshift、ifftshift

前半后半交换,目的是为了傅里叶变换后频谱中心为0Hz对称
ifftshift([1 1 1; 2 2 2; 3 3 3; 4 4 4])
>> 3 3 3; 4 4 4; 1 1 1; 2 2 2

circshift

循环按行移位
circshift([1 1 1; 2 2 2; 3 3 3; 4 4 4], 1)
>> 4 4 4; 1 1 1; 2 2 2; 3 3 3

reshape

将向量或矩阵A重新排列成M行N列,注意MATLAB先行后列读取和写入
reshape(A, [M, N])

strcat

将字符串拼接在一起,注意MATLAB中string和char没什么区别,可以混用的感觉
strcat(\'qwe\', \'123\', \'ok\')
>> \'qwe123ok\'

size

返回矩阵A每维度的长度
size(A)

diag

输入矩阵的话,返回矩阵对角线元素;
输入向量的话,返回以向量为对角线的方阵

eye

产生单位矩阵
eye(3)

isempty

矩阵A是否为空(什么数都没有才为空)

mean

求均值,当输入为矩阵时,求每一列的均值         

trace

计算输入矩阵主对角线元素之和

diff

求差分(或者说导数),等于后一个数减前一个数的值,输入为矩阵时按列求
diff([1, 2, 4, 7])
>> 1 2 3

setdiff(A, B)

找到A里面除了B里数据的下标
setdiff([1 2; 3 4], [1 6 4])
>> 2
   3

repmat(A, ROW, COL)

将矩阵A进行ROW行COL列平铺
repmat([1 2], 2, 2)
>> 1 2 1 2
   1 2 1 2

squeeze(A)

删除矩阵A中长度为1的维度

permute

置换矩阵A维度
permute(A, [2 1 3])

kron

返回矩阵A和B的Kronecker张量积

A = 1 -2  B = 4 -3
   -1  0      2  3
kron(A, B)

>> 1*4  1*-3  -2*4 -2*-3
   1*2  1*3   -2*2 -2*3 

  -1*4 -1*3   0*4  0*-3
  -1*2 -1*3   0*2  0*3

cumsum

累加和,类似斐波那契数列这种,第n个数返回前n个数的和
A = 1 2 3
    4 5 6
cumsun(A)

>> 1 2 3
   5 7 9

unique

去重,元素和向量的重都可以去
a = 1 1 2 3
unique(a)
>> 1 2 3

A = 1 2 3
    1 2 3
    2 3 4
unique(A, \'row\')
>>  1 2 3
    2 3 4


三:集成复杂操作

fft(A, FFTSIZE)、ifft(A, FFTSIZE)

对矩阵A进行FFTSIZE点fft、ifft,按列进行

svd

[U, S, V] = svd(A)
A的奇异值分解,S降序排列

awgn

awgn(in, snr)
对输入信号in添加信噪比为snr的高斯白噪声,注意snr单位dB

inv/pinv

非奇异矩阵/奇异矩阵求逆

eig

求矩阵特征向量和特征值,特征值在主对角线上,从小到大排列
a = [3 0; 0 0]
[v, d] = eig(a)
>> v = 0 1
       1 0

   d = 0 0
       0 3 

orth

求矩阵A所有列的标准正交基,对所有列进行施密特正交化也能求标准正交基(注意结果的列数等于A的秩)
A = 1 0 0 
    0 2 0
orth(A)
>>  0 1
    1 0

null

求矩阵A的零空间的标准正交基,A * null(A) = 0。也等于对A进行svd分解右酉矩阵对应奇异值为0的那几列
A = 1 0 0 
    0 2 0
null(A)
>>  0
    0
    1

rref

得到矩阵A的简化行阶梯型矩阵
A = 1 1 1
    0 2 0
[R, p] = rref(A)
>> 
R = 1 0 1
    0 1 0

p = 1 2 (p返回阶梯所在的行号)

sort(A, dim)

把矩阵A按第dim维度排序,res返回排序后的值,index返回排序后每个数据的原位置指示
[res, index] = sort([1 4; 2 3], 1)
>> res = 
   1 3
   2 4
   index = 
   1 2
   2 1

norm

求范数
1>输入向量时
norm(a, 2)
求向量a的2范数(平方和再开根)
2>输入矩阵时
norm(A, 2)
求矩阵A的2范数(sqrt(A最大奇异值))
=max(svd(A)) = eig(A\'*A)中最大特征值开根号
norm(A, \'fro\')
求矩阵A的F范数(所有元素的平方和再开方,可以表现矩阵的能量)

fi

定点化操作
a = fi(-0.789, 1, 16, 15)
把-0.789转化成16位,小数占15位的有符号定点数
a.bin >> \'1001101100000010\'
a.hex >> \'9b02\'
a.dec >> \'39682\'
-0.789*2^15 + 2^16 也等于39682(定点负数取补码) 

solve

可以解一元方程
syms x
eq = 1000*(0.9)^x == 200
double(solve(eq,x))
>> 15.2755

四:画图

plot、stem

先来个画图全家桶
subplot(2,1,1);
plot(t,y1,,\'g\',t,y2,\'r\');
legend(\'微分信号\',\'信号包络\');
title(\'已调信号微分后时域图\'); xlabel(\'时间(s)\'); ylabel(\'幅度\');
xlim([0 10]);ylim([0 10])

scatterplot

输入一串复数,输出所有数的复平面的位置图。输出星座图时使用
```matlab

text
```matlab
在图像中添加文字
text(2.1, 3.2, \'txt\', \'r\')
>> 在坐标(2.1, 3.2)处添加红色的文字\'txt\'

semilogy

绘制对数纵坐标图,纵坐标为10^i

五:图像处理

ginput

imresize

imshow


六:比特位运算相关

xor

异或
xor([0 1 0], [1 1 1])
>> 1 0 1

bitget

输出数字a在指定比特位上的比特值
a = 8
bitget(a, 1 : 5)
>> 0 0 0 1 0

七:类型转换

dec2bin、bin2dec

十进制转二进制字符串
b = dec2bin([1 2; 3 4])
>>  \'001\'
    \'011\'
    \'010\'
    \'100\'

二进制字符串转十进制
d = bin2dec(b)
>> 1
   3
   2
   4

num2str

将数组原封不动的转换成字符数组形式
num2str([1 2; 3 4])
>> \'1 2\'
   \'3 4\'

八:文件相关

fopen

fid = fopen(\'.../xx.dat\', \'w+\')
打开某地址指定的文件,成功返回一个正数

fprintf

fprintf(fid, \'%04x\n\', data)
将data数据,按照规定的格式,写入到fid指定的文件中。注意data按列写

fscanf

按规定的格式读取数据到矩阵中
A = fscanf(fid, \'4x\')

fgetl

读取文件的一行,下一次读会自动跳到下一行
fgetl(fid)

feof

判断当前文件是否到读完,读完了返回1,否则返回0
feof(fid)

fclose

fclose(fid)
关闭fid指定的文件

九:结构体元胞数组相关

isfield

判断结构体中是否包含某个字段,包含返回1,不包含返回0
a.a1 = \'aaa\';
isfield(a, \'a1\')
>> 1

fieldnames

把结构体的字段名称输出为一列元胞数组
a.a1 = \'aaa\'; a.a2 = 123;
fieldnames(a)
>> {\'a1\'}
   {\'a2\'} 

struct2cell

把结构体存储的变量输出为一列元胞数组中
a.a1 = \'aaa\'; a.a2 = 123;
struct2cell(a)
>> {\'aaa\'}
   {123}

cell2struct

cell2mat

将cell中的数据转换成矩阵形式(可以拼接相同格式的数据)
a = {[1 2]} {2 1}
cell2mat(a)
>> [1 2 2 1]

b = {\'aaa\'}; {\'bbb\'}
cell2mat(b)
>> \'aaa\'
   \'bbb\'