目录
1. Matlab 矩阵拼接
2. Matlab找出矩阵中满足条件的子矩阵
3. Matlab字符串数组
4. Matlab 绘图子图相关
4.1 绘制子图
4.2 坐标轴属性设置
4.3 调整子图的大小
4.4 合并子图
4.5 保存图像
5. Matlab cell数组
6. Matlab 常用函数
6.1 字符串拼接
6.2 int与字符串进行转换
6.3 求平均值
6.4 Matlab cell2mat函数
6.5 Matlab 读取txt文件
6.6 Matlab中image、imagesc和imshow函数用法解析
Matlab 矩阵拼接
两个矩阵横向拼接,可以使用类似k = [m,n]
或者k=[m n]
的方式。详见以下例子。
>> m = [1 2 3;2 3 4;3 4 5;4 5 6];
>> n = [1 3 5;2 4 6;3 5 7;4 6 8];
>> k = [m,n];
k =
1 2 3 1 3 5
2 3 4 2 4 6
3 4 5 3 5 7
4 5 6 4 6 8
如果是纵向拼接,则可以使用类似k=[m;n]
的方式。此外,也可以使用cat函数来进行矩阵的拼接。基本语法如下:
- C = cat(dim, A, B)
- C = cat(dim, A1, A2, A3, A4, …)
从上述语法可以看出,cat函数可以进行多个矩阵的拼接。其中,C = cat(1,A,B)
相当于垂直拼接,等价于C=vertcat(A,B)
;C = cat(2,A,B)
相当于水平拼接,等价于C = horzcat(A,B)
。
例子如下:
>> a1 = [1 3 41];
>> a2 = [2 20 18];
>> b = cat(1, a1, a2); %垂直拼接
>> c = cat(2, a1, a2); %水平拼接
>> d = cat(3, a1, a2); %三维数组拼接
%运行结果如下:
b =
1 3 41
2 20 18
c =
1 3 41 2 20 18
d(:,:1) =
1 3 41
d(:,:2) =
2 20 18
如果是动态矩阵的话,可以使用如下代码来进行矩阵拼接。
d = []
for i = 1:10
a = [i, 2*i, 3*i]
d = vertcat(d, a)
end
但是这种方法没有预先分配内存,所以执行的效率很低,不建议这样使用。同时Matlab还会给出warning提示*变量似乎会随着迭代次数改变而变化,请预分配内存以提高运行速度”问题**。还是应该预先给变量分配好大小,这样会使得程序效率更高一些。
此外还有以下两个函数比较常用:
- repmat 通过对现有矩阵进行复制和粘贴操作生成新的矩阵
- blkdiag 现有矩阵构造对角矩阵
Matlab找出矩阵中满足条件的子矩阵
Matlab中的find函数可以用来找到满足条件的行或列。 基本语法为:
ind = find(X)
ind = find(X, k)
ind = find(X, k, 'first')
ind = find(X, k, 'last')
[row,col] = find(X, ...)
[row,col,v] = find(X, ...)
ind = find(X)用来查询非零元素的位置,如果X是一个行向量,则返回一个行向量,否则,返回一个列向量。如果X全是零元素或者是空数组,则返回一个空数组。 所以在得到ind后要判断ind的size,然后再进行后续的处理。
[row,col V] = find(X, …)用来查询满足一定条件的元素的行和列。 X一般为逻辑表达式,如X>5等。其中,row为返回满足条件的元素行的位置。col为返回满足条件的元素的列的位置。如果X是一个逻辑表达式,则V返回一个逻辑数组,一般如果存在满足要求的元素,则返回一个单位列向量。如果不存在满足要求的元素,则V返回一个空向量。
[vRowIdx,~] = find(tmpIdList(:,1) <= tEnd & tmpIdList(:,2) >= tStart);
volumeSet = tmpIdList(vRowIdx,:);
比较两种调用方式返回的V的区别: [r,c,v]= find(A>12):V返回一个单位列向量 [r,c,v]=find(x) :V返回由满足要求的元素构成一个列向量
ind = find(X, k, ‘first’) ind = find(X, k, ‘last’) 返回K个满足条件X的元素的行和列的位置,其中’first’表示从第一个开始算起,’last’表示从最后一个元素开始算起。
>> a=[4 0 3 1 0 9 2];
>> find(a,3,'first')
ans =
1 3 4
>> find(a,3,'last')
ans =
4 6 7
Matlab字符串数组
Matlab中字符串数组可以用元胞数组来实现,比如:
dayList = {'20130225','20130226','20130227','20130228','20130301'};
% 其中size(dayList,1) = 1, size(dayList,2) = 5, 使用dayList{i}来表示每一个元素值
而一般的字符串如a = 'hello world!'
这种就可以看成字符数组。
Matlab 绘图子图相关
-
绘制子图
Matlab使用subplot函数来绘制子图。subplot是把一个figure分成
m x n
块区域,把图标分别画进不同的区域。 基本语法为subplot(m,n,x)
,其中m代表分割的行数,n代表分割的列数,x代表划入的区域代码,以2 x 2
为例,左上角x为1,右上角x为2,左下角x为3,右下 角x为4,以此类推。
-
坐标轴属性设置
figure; %设置坐标轴线宽,加边框,坐标字号 axes('linewidth',1, 'box', 'on', 'FontSize',16); %设置坐标轴label xlabel('时间(s)','FontSize',16); ylabel('压力(pa)','FontSize',16); grid on; hold on; plot(ScopeData1.time, ScopeData1.signals.values, 'k', 'linewidth', 1); %设置坐标轴上下限 xlim([0, 0.5]); ylim([5300000, 5800000]);
常见的坐标轴控制方法:
axis off; % 去掉坐标轴 axis tight; % 紧坐标轴 axis equal; % 等比坐标轴 axis([-0.1, 8.1, -1.1, 1.1]); % 坐标轴的显示范围 % gca: gca, h=figure(...); set(gca, 'XLim',[3 40]); % X轴的数据显示范围 set(gca, 'XTick',[-3.14,0,3.14] ); % X轴的记号点 set(gca, 'XTicklabel',{'-pi','0','pi'}); % X轴的记号 set(gca, 'xtick', []); % 清除X轴的记号点 set(gca,'xtick',[],'ytick',[]); %同时去掉x轴和y轴的刻度 set(gca, 'XGrid','on'); % X轴的网格 set(gca, 'XDir','reverse'); % 逆转X轴 set(gca, 'XColor','red'); % X轴的颜色
具体可以看这篇博客
-
调整子图的大小
可以用subplot(‘position’,[left bottom width height])来创建子图,顺便指定子图的大小和间距。这里的left,bottom,width,height的范围是[0,1],表示比例。而且left和bottom都是针对figure的左下角而言的。
其中,title函数可以给单个子图添加标题,suptitle函数可以给subplot添加总的标题。
例子如下:
subplot('position',[0.1,0.1,0.35,0.35]); plot(speedList, fluxList, 'k*-'); %scatter(volumeList, speedList, 50, 'k'); title('Subplot 3'); xlabel('speed'); ylabel('flux'); %set(gca,'xtick',0:0.5:3,'ytick',0:10:40); subplot('position',[0.55,0.1,0.35,0.35]); %scatter(volumeList, fluxList, 50, 'k'); plot(volumeList, fluxList,'k*-'); title('Subplot 4'); xlabel('volume'); ylabel('flux'); %set(gca,'xtick',0:0.5:3,'ytick',0:10:40); subplot('position',[0.1,0.55,0.35,0.35]); plot(speedList, 'k*-'); title('Subplot 1'); xlabel('index'); ylabel('speed'); %set(gca,'xlim',[0 1000]); %set(gca,'xtick',0:200:1000); subplot('position',[0.55,0.55,0.35,0.35]); plot(fluxList,'k*-'); title('Subplot 2'); xlabel('index'); ylabel('flux');
subplot的子窗口都是固定的,其设置是内置的默认值,也可以通过axes函数来重新规定子窗口的大小和位置。如:
axes('position',[.1 .1 .8 .6]) mesh(peaks(20)); axes('position',[.1 .7 .8 .2]) pcolor([1:10;1:10]);
-
合并子图
Matlab合并子图的时候只需把subplot声明部分的x改成数组形式就可以了。例子如下:
clear clc x=-4*pi+eps:0.01:4*pi; y1=sin(x); y2=cos(x); y3=tan(x); figure subplot(2,2,1);plot(x,y1);title('sin(x)') subplot(2,2,2);plot(x,y2);title('cos(x)') subplot(2,2,[3,4]);plot(x,y3);title('tan(x)') %将第二行的两个合并为一个 figure subplot(2,2,[1 2]);plot(x,y1);title('sin(x)') %将第一行的两个合并为一个 subplot(2,2,3);plot(x,y2);title('cos(x)') subplot(2,2,4);plot(x,y3);title('tan(x)') figure subplot(2,2,[1 3]);plot(x,y1);title('sin(x)') %将第一列的两个合并为一个 subplot(2,2,2);plot(x,y2);title('cos(x)') subplot(2,2,4);plot(x,y3);title('tan(x)') figure subplot(2,2,1);plot(x,y1);title('sin(x)') subplot(2,2,3);plot(x,y2);title('cos(x)') subplot(2,2,[2 4]);plot(x,y3);title('tan(x)') %将第二列的两个合并为一个
-
保存图像
Matlab可以使用saveas函数来保存图片
num = 1; saveas(gcf, strcat('figure/fig_', int2str(num), '.png'));
figure图片存储的时候,使用saveas命令,如果不做设定,只能存储默认大小,但是有的时候需要存储特定比例拉伸的图片。 matlab里面figure相关对象的关系是: screen→figure→axis,所以在设置图片大小的时候,先设定figure相对于screen的位置和大小,然后设定axes相对于figure的位置和大小。
使用以下的命令可以存储特定大小的图片。
-
法一:截图
set(gcf,'position',[100,100, 500, 300]); %设定figure的位置和大小 set(gcf,'color','white'); %设定figure的背景颜色 A=getframe(gcf); imwrite(A.cdata,'try.png') %存储调整过大小的图片
还可以根据需求调整坐标轴的位置和大小,比如不想要白边一类。
set(gca,'DataAspectRatio',[3,4,1]); %调整坐标轴比率 set(gca,'position',[0,0,1,1]); %调整坐标轴位置
最后说明一下,saveas存储的大小是默认大小,imwrite相当于截屏;存图片的时候要养成好习惯,顺便存一个figure,以方便以后修改。
-
法二:设定保持长宽比存图
如果要发表paper,上面这种做法就不可取了,因为存下的图片是截图;不少杂志(比如PR系列),直接说了,Not Screen!(截图丢失信息,不方便出版方的再次排版一类)。
图片画出来以后,执行以下命令,就可以保持长宽比率保存图片(但是图片的绝对大小会变化)。
set(gcf,'color','white','paperpositionmode','auto'); saveas(gcf,'exprimentLightBundles.eps','psc2');
-
Matlab cell数组
cell数组是MATLAB的一种特殊矩阵,或者叫做广义矩阵。矩阵的每个元素可以是任何一种数据类型的常数、常量或者矩阵,所以矩阵的每个的元素叫做cell。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。
-
用cell函数产生空单元数组
cell函数创建空元胞数组的主要目的是为数组预先分配连续的存储空间,节约内存占用,提高执行效率。
-
cell(N)
:该函数产生一个N*N的空单元数组>> c1 = cell(3) c1 = [] [] [] [] [] [] [] [] [] >> c1 = cell(0); % 相当于c1 = {} >> c1 = cell(1); % 相当于c1 = {[]}
-
cell(M, N)
:该函数产生一个M*N的空单元数组>> c1 = cell(2,3) c1 = [] [] [] [] [] []
-
cell(size(A))
:该函数产生一个与A维度相同的空单元数组>> A = [1 2 3;4 5 6] A = 1 2 3 4 5 6 >> cell(size(A)) ans = [] [] [] [] [] []
-
-
对单元数组的元素进行设置
可以对空的数组的一些元素进行设置,这就建立了自己想要的单元数组
>> c2{1,1} = [1 2 3; 4 5 6]; >> c2{2,2} = "CHINA"; >> c2{2,1} = 100; >> c2 c2 = [2 * 3 double] [] [] [ 100] 'CHINA' []
-
从元胞数组中读取数据,可保存为一个标准的数组或一个新的单元数组,或取出数组进行计算。
通过小括号()里面加下标,访问cell数组中的数据,返回的是对应的cell。
通过大括号{}里面加下标,访问cell数组中的数据,返回的是对应cell的内容。 -
使用元胞的下标,可将一个元胞数组的子集赋值给另一个变量,创建新的元胞数组。
-
元胞数组的删除和重塑
-
要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。
>> a={123,'abcde';zeros(3,5),ones(3,3)} a = [ 123] 'abcde' [3x5 double] [3x3 double] >> a(1,:)=[] a = [3x5 double] [3x3 double] >> a={123,'abcde';zeros(3,5),ones(3,3)} a = [ 123] 'abcde' [3x5 double] [3x3 double] >> a{1}=[] a = [] 'abcde' [3x5 double] [3x3 double] >> a={123,'abcde';zeros(3,5),ones(3,3)} a = [ 123] 'abcde' [3x5 double] [3x3 double] >> a(1)=[] a = [3x5 double] 'abcde' [3x3 double] >> a={123,'abcde';zeros(3,5),ones(3,3)} a = [ 123] 'abcde' [3x5 double] [3x3 double] >> a(2)=[] a = [123] 'abcde' [3x3 double]
-
元宝数组和其他数组一样,也可以通过reshape函数改变形状,改变后的元胞数组与原元胞数组的元素个数相同,不能通过改变形状来添加或删除元胞数组中的元素。
>> a={123,'abcde';zeros(3,5),ones(3,3)} a = [ 123] 'abcde' [3x5 double] [3x3 double] >> size a ans = 1 1 >> size(a) ans = 2 2 >> b=reshape(a,1,4) b = [123] [3x5 double] 'abcde' [3x3 double] >> size(b) ans = 1 4
-
-
元胞数组中的操作函数
- cell:创建空的元胞数组
-
cellfun:为元胞数组的每个元胞执行指定的函数,主要功能是对元胞数组的元素(元胞)分别指定不同的函数。 能在cellfun中使用的函数:
- isempty:若元胞元素为空,则返回逻辑真
- islogical:若元胞元素为逻辑类型,则返回逻辑真
- isreal:若元胞元素为实数,则返回逻辑真
- length:元胞元素的长
- ndims:元胞元素的维数
- prodofsize:元胞元素包含的元素个数
- celldisp:显示所有元胞的内容
- cellplot:利用图形方式显示元胞数组
- cell2mat:将元胞数组转变成为普通的矩阵
- mat2cell:将数值矩阵转变成为元胞数组
- num2cell:将数值数组转变成为元胞数组
- deal:将输入参数赋值给输出
- cell2struct:将元胞数组转变成为结构
- struct2cell:将结构转变为元胞数组
- iscell:判断输入是否为元胞数组
使用例子如下:
>> a={123,'abcde';1-7i,ones(3,3)} a = [ 123] 'abcde' [1.0000 - 7.0000i] [3x3 double] >> b=cellfun('isreal',a) b = 1 1 0 1 >> c=cellfun('length',a) c = 1 5 1 3 >> d=cellfun('isclass',a,'double') d = 1 0 1 1
-
元胞数组的嵌套
元胞数组的元胞中包含其他的元胞数组,称为嵌套元胞数组,没有嵌套结构的元胞则称为页元胞。使用嵌套的大括号或cell函数,或直接用赋值表达式,都可以创建嵌套单元数组,另外还可以访问嵌套元胞数组的子数组、元胞或元胞的元素。
Matlab 常用函数
-
字符串拼接
Matlab中可以使用
strcat
函数来进行字符串拼接,而不能使用”+”来进行字符串拼接。c = strcat('hello', 'world');
但strcat函数也需要注意以下的问题。
>> strcat({'Red','Yellow'},{'Green','Blue'}) ans = 'RedGreen' 'YellowBlue' >> strcat(['Red','Yellow'],['Green','Blue']) ans = RedYellowGreenBlue
-
int与字符串进行转换
Matlab中可以使用
int2str
函数来将int转化成字符串,而用str2num
函数来将字符串转换成int。num = 1; c_str = int2str(num);
-
求平均值
Matlab中使用mean函数来求平均值,可以返回沿数组中不同维的元素的平均值。基本语法为
M = mean(A);
,如果A是一个向量,mean(A)返回A中元素的平均值。
如果A是一个矩阵,mean(A)将其中的各列视为向量,把矩阵中的每列看成一个向量,返回一个包含每一列所有元素的平均值的行向量。
还有一种语法M = mean(A,dim)
,返回A中沿着标量dim指定的维数上的元素的平均值。对于矩阵,mean(A,2)就是包含每一行的平均值的列向量。例子如下:
A = [1 2 3; 3 3 6; 4 6 8; 4 7 7]; mean(A) ans = 3.0000 4.5000 6.0000 mean(A,2) %对矩阵每一行求平均值 ans = 2.0000 4.0000 6.0000 6.0000
-
Matlab cell2mat函数
cell2mat函数的作用是把一个由多个矩阵构成的元胞数组转换成一个矩阵,意即把元胞数组中的多个矩阵合并成一个矩阵。需要注意的是并非任何情况下都能得到正确的结果。要得到正确的结果,一个基本要求是,在元胞数组中,处于同行的矩阵要有相等的行数,处于同列的矩阵要有相等的列数。
比如:
myCell= {A, B; C, D}
这里我们构造了一个2行2列的元胞数组, 其中A、B、C、D是四个矩阵。
如果
A:一行一列 B:一行三列
C:二行一列 D:二行三列
那么我们可以通过调用cell2mat将A、B、C、D合并成一个矩阵。
语法格式:m = cell2mat(c)
-
Matlab 读取txt文件
详见这篇博客的介绍,其中有关于High level routines和Low level routines两种I/O函数。
-
Matlab中image、imagesc和imshow函数用法解析
详见这篇博客的介绍。