python矩阵左除_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 %恢复上一步操作之前的状态

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函数

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函数

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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值