Matlab语法随笔(暂停更新)

本文档中大多数内容都可以通过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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容