本文档中大多数内容都可以通过type(显示文件内容)和help(显示函数帮助)来理解
下面部分的功能和函数说明适用于深度学习方面的知识。
基础
1、基本符号:
clc
清空历史窗口中的内容,但是变量值不会变
clear
变量全部清空
不等于符号:~=
异或运算符:xor(a,b)
例:xor(1,0)
则ans=1
其他符号参考c++,基本一致。
输入PS1('>> ');
回车:前面提示符变成>>
disp(a)
显示变量值
disp(sprintf('2 decimals :%0.2f',a))
输出,并且冒号后跟上a的值,a保留两位小数。写法和c差不多。
disp(['the value of a:',a])
字符串后跟上变量
exit
quit
可以退出主程序。
close
可以关闭绘图窗口
addpath('c:\Desktop')
将路径添加到窗口中。这样即便你到了其他路径也能使用该路径下的文件和方法。
addpath(genpath('C:\ProgramSoftware\MatLab\DeepLearnToolbox-master'))
将根路径为'C:\ProgramSoftware\MatLab\DeepLearnToolbox-master'目录下的所有子文件夹都加入到路径下
...
(英文格式下输入。) 续行符,代码比较长一行写不下可以使用续行符进行续行。但是使用续行符时前面要加上空格,不然无效。
assert(er < 0.10, 'Too big error');
assert函数,如果er>=0.10就输出错误信息。
2、基本类型
%matlab中默认的数值类型为双精度浮点型,一般通过整型函数将浮点型数据转换成整型数据。
%不同的整形数据所占的内存是不同的。
int8() int16() int32() int64() %存储字节数(1 2 4 8)不同,正向正无穷大取整,负向负无穷大取整
uint8() uint16() uint32() uint64() %存储字节数(1 2 4 8)不同,向0取整
3、矩阵写法
>>A = [1 2; 3 4; 5 6]
A=
1 2
3 4
5 6
>>A=[1 2;
>3 4;
>5 6]
A=
1 2
3 4
5 6
%以上>符号都是控制台自带前缀,不用手打
>>A(3,2) %访问矩阵A的第三行第二列
ans=
6
>>A(3,:) %冒号表示所有元素,即提取A矩阵第三行的所有元素
>>A([1 3],:) %获取1、3行的所有元素
>>A=[A,[1;3;4]] %右侧加上新的一列
>>A(:) %将A中的所有元素加入到一个列向量里
>>C=[A B] %在右侧连接(此写法同C=[A,B])
>>C=[A ;B] %在下方连接
>>v=1:0.1:2 %步长为0.1,包含1和2的1x11矩阵,这里为了篇幅不过长不显示出来结果。
>>v=1:6 %从1到6包含1和6的6个整数的矩阵。
>>ones(2,3)
ans=
1 1 1
1 1 1
%同理还有zeros(a,b)函数生成全为0的矩阵、rand(a,b)生成全为0~1之间随机数的矩阵、
%randn(a,b)生成服从高斯分布(均值为0,标准差或方差为1)的随机数矩阵,等等,生成随机数下面会提到。
>>eye(4) %生成单位矩阵
ans =
Diagonal Matrix
1 0 0 0
1 1 0 0
1 0 1 0
1 0 0 1
>>size(A) %显示矩阵A的大小
ans= %ans是一个1x2的矩阵
3 2
>>size(A,1) %返回A矩阵第一维度大小
ans=
3
>>length(A) %返回矩阵A较长维度。如果是向量就返回向量长度
ans=
3
hist(w) %将w绘制成一个直方图
hist(w,50) %将w绘制成一个有50个竖条的直方图
>>q([i2 i1]) %输出q向量下标为i2和i1的变量。
>>qnew([i1 i2])=q([i2 i1]) %向量i1下标和i2下标变量位置互换
4、访问文件数据
大部分命令和linux环境下的命令很像。具体如下:
>>pwd %查看当前路径
>>cd 'C:\Users\administrator\Desktop' %跳到某路径下
>>ls %查看当前路径下的文件
>>load a.dat %加载当前目录下的a.dat文件数据
>>load('a.dat') %效果同上
>>who %查看当前内存中存储的变量
>>whos %显示当前内存中变量,并且显示大小、数据类型等详细数据
>>clear x %从内存中删除x变量
>>v=x(1:10) %x变量内的前10个元素赋值给v
>>save hello.mat v %将变量v存储到hello.dat文件内
>>save hello.txt v -ascii %存储为ASCII编码格式的txt文件
5、生成随机数
rand(1) %随机生成0~1之间的一个随机数字
rand(m,n) %生成m行n列均匀分布的伪随机数,分布在(0,1)之间
rand(m,n,'double') %生成指定精度的伪随机数参数还可以是single
rand('state',0) %保持每次随机都是同样的状态(用于读者运行能获得和笔者一样的效果)
randn %生成标准正态分布的伪随机数均值0方差1,语法和上一样
randi %生成均匀分布的伪随机整数
randi(a) %在开区间(0,a)生成均匀分布的整数伪随机整数
randi(a,m,n) %在开区间(0,a)之间生成mxn矩阵
randi([a,b],m,n) %在开区间(a,b)生成mxn矩阵
unidrnd(n) %产生一组从1~n的离散均匀随机整数
%其中n可以是一个向量、矩阵、[多维数组](当然也可以是一个数,即1乘以1的矩阵),但n中所有元素都必须是正整数。(0不行,会NaN)
%这种调用方式将产生一个和n具有相同尺寸(行、列、维数)的矩阵
R = unidrnd(N,v)
%这种调用格式中v是一个行向量,如果v是一个1乘以2的向量, 则v中的两个元素分别指定了生成的矩阵R的行数(由v(1)指定)和列数(由v(2)指定)。如果v是一个1乘以n的矩阵, 则R是一个n维数组。
R = unidrnd(N,m,n)
%这里m和n分别指定生成的矩阵R的行数和列数。
randperm:
>>p=randperm(n) %返回一行从1~n的整数。行向量。
>>p = randperm(n,k) %从1-n的数字序列里面随机返回k个数(k个数互相之间不一样)
>>new = old( randperm( size(old,1) ) , : ) %数组中各行被重排列的例子
randsample:
>>y = randsample(n,k) %产生k个1~n的数(列向量)
>>y = randsample(population,k) %从数组里随机取出k个不相同的数
>> y = randsample(n,k,replacement) %replacement是一个bool函数1可能重复,0可能不重复
>> y = randsample(population,k,replacement)
>> y = randsample(n,k,true,w)
>> y = randsample(population,k,true,w)
>> y = randsample(s,...)
6、关键字
format
format short %默认格式,小数点后保留4位
format long %有效数字16位
format long e %有效数字16位加3位指数
format short e %有效数字5位加3位指数
format bank %保留两位小数位
format + %只给出正负
format rational %以分数的形式表示
format hex %以16进制数表示
format long g %15位有效数
format short g %5位有效数
format compact %去掉命令行中的多余的空行
format loose %恢复上一步操作之前的状态
具体可以参考https://jingyan.baidu.com/article/3f16e003e7486b2590c10372.html
7、数据导入
>>a=rand(5,10)
>>xlswrite('data5.xls',a,'Sheet1','B2')
%把矩阵a写到excel文件data5.xls文件中的表单Sheet1 B2列开始的域中
>>b=xlsread('data5.xls','Sheet2','C3:F6')
%把Exp1中生成的Excel文件data5.xls中表单Sheet1的域“C3:F6”中的数据赋给b
>>load test
%加载test.mat文件中的内容到test变量内。
8、字符串连接
>>SC=[str1,str2] %方法1
>>strcat(str,str1) %方法2
>>strcat({‘Red’,’Yellow’},{‘Green’,’Blue’})
ans =
‘RedGreen’ ‘YellowBlue’
>>strcat([‘Red’,’Yellow’],[‘Green’,’Blue’])
ans =
RedYellowGreenBlue
>>STR=sprintf(‘%s%d’,str1,number) %方法3
9、字符串截取
>>i1=strfind(temp,',') %从temp字符串中获得值为','的下标,赋值给i1
%这里注意 ,如果temp中有多个',',i1将会是一个下标向量。
>>i2=temp(1:6) %将temp字符串中的下标为1~6之间的值取出来给i2
函数
1、repmat函数
基本语法:
B = repmat(A,m,n)
B = repmat(A,[m n])
B = repmat(A,[m n p...])
处理内容有重复的大矩阵的时候使用这个函数。比如:如果A矩阵是一个1x2x3的矩阵,那么B=repmat(A,2,3)
后的矩阵B就是2x6x3
同时重复的也不仅仅是矩阵,也能是字符串,甚至是NaN:
下例程来源于https://blog.csdn.net/anqier1009/article/details/5214978
B=repmat([1 2;3 4],2,3)
B=
1 2 1 2 1 2
3 4 3 4 3 4
1 2 1 2 1 2
3 4 3 4 3 4
其结果变为4x6.A也可以放置文字串,如:
C=repmat('Long live the king!',2,2)
C=
Long live the king! Long live the king!
Long live the king! Long live the king!
也可以放置其他的:
>>D=repmat(NaN,2,5)
D=
NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN
2、sum函数和prod函数
顾名思义,求和函数,但是在matlab中已经有+号了,为什么还要sum函数呢?这是用来计算矩阵的。例如:(简书不支持自定义颜色之类的,下面的%号后的颜色并没有变化,但是//实在是太难看了,这里还是改成了%。值得一提的是:matlab中多行注释可以选中需要注释的字段,然后按下ctrl+R,就可以快速注释。取消注释是ctrl+T)
>>x=[1 2 3;4 5 6;7 8 9]
x=
1 2 3
4 5 6
7 8 9
>>sum(x) %列求和,等价于sum(x,1),即从第一维度去看
ans=
12 15 18
>>sum(x,2) %行求和
ans=
6
15
24
>>sum(x(:)) %矩阵求和
ans=
45
>>prod(A) %求得矩阵A内所有元素的乘积
3、round函数
round(A) %返回A的四舍五入取整。A可以是一个数也可以是数组或者矩阵
4、svd函数
此函数用于奇异值求解。具体可以看官方文档:https://ww2.mathworks.cn/help/matlab/ref/svd.html这里不多作赘述。
5、矩阵计算
.* 和 * 的区别是什么:
在两个数值相乘中,不存在任何区别。只是有些时候需要在提示莫名错误的时候加上一个点。但是在矩阵相乘中,.*表示矩阵中对应位置的数字相乘,结果放在这个位置,然后形成一个新的矩阵。但是*表示的确实实实在在的矩阵相乘。需要进行相应行列乘积操作。同样的,.*在数组中也是代表对应位置相乘。两个数组*起来会报错,但是两个数组.*就是一个新的数组。
同理,A.^2表示的就是A矩阵中每个元素都分别平方。
>>log(A) %矩阵A每个元素分别进行log计算
>>exp(A) %矩阵A每个元素进行以e为底,A中元素为指数的幂运算
>>abs(A) %计算每个元素分别的绝对值
>>-A % -1*A
%max function example
>>A=[1 2 5 0]
>>val=max(A)
val=5
>>[val,ind]=max(A)
val=5
ind=3
%如果A是一个矩阵:
max(A)会得到每一列的最大值。
>>max(A,[],1) %返回每一列的最大值,1表示从A矩阵的第一维度去取(max函数默认形式)
>>max(A,[],2) %返回每一行的最大值,2也表示从A矩阵第二维度去取
%max function example
>>A<3 %这里的A是上面的A
A=
1 1 0 1
>>find(A<3) %这里的A是上面定义的A返回A中小于3的元素的索引
数组右除法:
A./B,A 和 B 的元素逐个对应相除:A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量。
数组左除法:
A.\B,A 和 B 的元素逐个对应相除:B(i,j)/A(i,j)两数组之间必须有相同的形,或其中一个是标量。
矩阵右除法:
A/B 矩阵除法,等价于 A*inv(B), inv(B)是 B 的逆阵。
矩阵左除法:
A\B 矩阵除法,等价于 inv(B)*A, inv(A)是 A 的逆阵。
这里需要注意:matlab中矩阵求逆有两个函数,一个是pinv
,一个是inv
,这两个技术实现上有很大的区别。数学上能证明,pinv能够计算出矩阵的逆,即便这是一个不可逆的矩阵, 仍然能返回一个值。
数组指数运算:
A.^B,AB中的元素逐个进行如下运算:A(i,j)^B(i,j),A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量。
顺带一提,如果x是一个矩阵,那么x'指的是x矩阵的转置。
6、magic函数
>>A=magic(3) %返回一个三阶幻方
A=
8 1 6
3 5 7
4 9 2
>>[r,c]=find(A>=7)
r=
1
3
2
c=
1
2
3
7、一些简单函数
>>floor(A) %A中所有元素向下取整
>>ceil(A) %A中所有元素向上取整
8、flipud函数
flipud(A) %使矩阵A进行垂直翻转
9、matlab程序运行时间计算
写论文作对比试验免不了需要检测程序运行时间。这个时候就需要用到matlab的这一功能了。matlab中时间计算有三种方法:
方法一:
tic and toc
example:
>>tic %开始计算时间
>>disp(num2str(toc)) %输出与上一个tic间隔时间
方法二:
etime配合clock
>>t1=clock
>>t2=clock
>>etime(t2,t1) %间隔时间输出
方法三:
cuptime
>>t1=cputime
>>t2=cputime-t1
Matlab官方推荐的是使用tic and toc。
10、图像绘制
plot(x,y) %以x为x轴,y为y轴绘制二维图像
hold on %在原图像基础上再添加接下来画的图像。
plot(x,y,'r') %画出红色线。这里使用颜色首字母表示颜色。
xlabel('time') %x轴标签名
ylabel('value') %y轴标签名
title('this is title') %标示出图表题目
legend('x function','y function') %将x、y对应颜色线标示出来。
print -dpng 'myPlot.png' %将图片保存为png格式在当前目录下。
figure(1) %表示开始绘制第一张图。如果使用不同的数字标示,则表示开始画第二张图
subplot(1,2,1) %将绘制图像的面板划分成1x2,然后使用第一个格子。
%后面再使用plot则会画在格子里。
axis([0.5 1 -1 1]) %设置x轴范围为0.5~1,y轴范围为-1~1
clf %清除图像
A=magic(5)
imagesc(A) %画出5x5的彩色格子,不同颜色对应不同值。
imagesc(A),colorbar,colormap gray; %colorbar:加入颜色条,colormap gray:灰度图
%使用逗号可以隔开连续执行的操作命令。
11、循环
%for循环
%v是一个向量,使用i作为下标进行访问。下面写了两个最简单的for循环
>>for i=1:10,
> v(i)=1;
>end;
>>indices=1:10;
>>for i=indices,
> disp(i);
>end;
%while循环
>>while i<=5,
> v(i)=100;
> i=i+1;
>end;
%break 的写法,continue同。举个例子,其实除了语法和c++差不多
>>i=1;
>>while true,
> i=i+1;
> if i==6,
> break;
> end;
>end;
%ifelse
>>if a==1
>> disp('1');
>>elseif a==2
>> disp('2');
>>else
>> disp('3');
>>end;
%并行for循环
>>parfor i=1:3, %输出顺序不按照1~3
> disp(i)
> c(:,i) = eig(rand(1000));
>end
12、自定义函数
function [y1,y2]=myFunction(x) %返回两个参数,x是形参。
y1=x*2;
y2=x*3;
>>[a,b]=myFunction(1) %调用函数
13、find函数
b=find(a) %查询a中非零元素的位置。如果a是行向量就返回一个行向量
%否则,就返回一个列向量
b=find(a,2) %找出a中最先出现的两个不为零的数
b=find(a,2,'last') %参数还可以是'first',此命令意为从最后一个非零元素起
[a1,a2]=find(a) %找出a矩阵中非零元素所在的行和列,分别存储在列向量a1,a2里
[a1,a2,v]=find(a) %找出a矩阵中非零元素所在的行,列,值,分别放在a1,a2,v中
如果不存在:则会返回'Empty matrix:0-by-1'
14、numel函数
n = numel(A);
n= numel(A,条件);
%返回数组A中元素个数。若是一幅图像,则numel(A)将给出它的像素数。
15、元胞数组
①cell数组的创建
a={'winter',123,'coming','哈哈'}; %直接赋值
a=cell(1,4);a={'winter',123,'coming','哈哈'}; %通过cell函数预分配内存,再赋值
②cell数组的访问
>>a(1) %访问cell单元
ans =
'winter'
>>a{1} %访问cell单元储存的值
ans=
winter
③cell数组删除
a{1}=[];%并不能删除第一个cell单元,只是变成空值
a(1)=[];%删除第一个单元
a(:)=[];%一次性删除所有cell单元
16、特殊符号
CostFunction=@(q) MyCost(q,model);%以后用到这个函数只需要传入一个q参数
%并且一直使用model变量。
%调用例子如下
[x.Cost, x.Sol]=CostFunction(x.Position); %只传入一个x.Position参数
17、kron函数
计算矩阵的Kronecker积
C=kron(A,B) %矩阵A中的每个元素都乘以矩阵B,示例如下
>>x=[1 2;3 4]
x =
1 2
3 4
>> y=[1 0;0 1]
y =
1 0
0 1
>> kron(x,y)
ans =
1 0 2 0
0 1 0 2
3 0 4 0
0 3 0 4
QLib包使用
1、param_dm_2x_rand函数
param_dm_2x_rand([2 3]); %随机生成2*3行和列的矩阵,即6*6的方形矩阵。
神经网络和仿真
1、归一化
mapinmax函数
>>X=[2,3,4,5,6;7,8,9,10,11]
>>[Y,PS]=mapminmax(X,0,1) %规定ymax=1 ymin=0的归一化默认ymax=1 ymin=-1
%这里需要注意的是,mapminmax归一化的是转置的矩阵。
>>PS
PS =
name: 'mapminmax'
xrows: 2
xmax: [2x1 double]
xmin: [2x1 double]
xrange: [2x1 double]
yrows: 2
ymax: 1
ymin: 0
yrange: 1
gain: [2x1 double]
xoffset: [2x1 double]
no_change: 0
% 其中y=(ymax-ymin)*(x-xmin)/(xmax-xmin)+ymin
%(这里的x是X矩阵中的一项,y是Y矩阵中对应X矩阵对应位置的项)
>>A2= mapminmax('reverse',A1,PS) %反归一化
>>temp= mapminmax('apply',260,PS) %某一个值按照PS进行单独的归一化
premnmx函数
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)%是对P和T分别按照行进行归一化处理
%其中P T分别为原始的输入和输出数据
%pn:p的归一化结果,minp: p的每行的最小值,maxp: p的每行的最大值
%tn: t矩阵的归一化结果,mint: t矩阵的最小值,maxt: t矩阵的最大值
%下面举个例子便于理解
>>[pn,minp,maxp,tn,mint,maxt]=premnmx([2,4,3,5;4,2,1,6],[5,2,3,8])
pn =
-1.0000 0.3333 -0.3333 1.0000
0.2000 -0.6000 -1.0000 1.0000
minp =
2
1
maxp =
5
6
t为1行4列的数据,对其归一化结果为 tn:
tn =0 -1.0000 -0.6667 1.0000
mint =2
maxt=8
相对应的,反归一化就是postmnmx函数。
2、newcf(新版本中的cascadeforwardnet)
创建一个级联的前向神经网络
3、newff
%本例是基于matlab 2016a
>>net2 = newff(P, T, [5 3]); %不用进行归一化,隐藏层有两层,神经元数分别为5、3
最后,由于各方面原因,包括matlab对于某些数据类型支持不够、某些库函数无法调用的原因,笔者改回了python继续进行研究,暂停更新博文。人生苦短,我选python。
网友评论