1. 显示输出数据的三种方式
1.1 改变数据格式
当数据重复再命令行窗口时,整数以整形形式显示,其他值将以默认格式显示。MATLAB的默认格式是精确到小数点后4位。如果一个数太大或太小,那么将会以科学记数法的形式显示。比如:
>> x=100.11x =100.1100>> y=1001.1y =1.0011e+03>> z=0.00010011z =1.0011e-04
改变默认输出格式要用到format命令,可根据下表改变数据的输出格式
其中美元格式是指按美元精确到美分的格式记数,隐藏/使用多余的换行符这个我也试出来有什么卵用。
1.2 disp函数
另一种显示数据的方法是用disp函数。disp需要一个数组参数,它将值显示在命令行窗口。如果这个数组是字符型,那么包含在这个数组中的字符串将会打印在命令行窗口。
此函数可联合num2str(将一个数转化为字符串)和int2str(讲一个整数转化为字符串)来产生新的信息,显示在命令行窗口中。例如,下面的语句将“the value of pi=3.1416”显示在命令行窗口中。第一句创建了一个字符型数组,第二句用于显示这个数组。
>> str=['the value of pi=' num2str(pi)];
>> disp(str);
the value of pi=3.1416
1.3 用fprintf函数格式化输出数据
用fprintf函数显示数据是一种十分简便方法。fprintf函数显示带有相关文本的一个或多个值,允许程序员控制显示数据的方式。它在命令行窗口打印一个数据的一般格式如下:
fprintf(format,data)
其中format用于表示一个描述打印数据方式的字符串,data代表要打印的一个或多个标量或数组。format包括两方面的内容,一方面是打印文本内容;另一方面是打印内容中的数据格式。例如
>> fprintf('the value of pi is%6.2f\n',pi)
the value of pi is 3.14
打印的结果为the value of pi is 3.14,后面带有一个换行符。转义序列%6.2f代表在本函数中的第一个数据项将占有6个字符宽度,小数点后有2位小数。
fprintf函数又一个重大的局限性,只能显示复数的实部。当我们的计算结果是复数时,这个局限性将会产生错误。在这种情况下,最好用disp显示数据。
例如
>> ians =0.0000 + 1.0000i>> disp([i])0.0000 + 1.0000i>> fprintf('i is%8.4f\n',i)
i is 0.0000
注意fprintf忽略了虚部
1.4 对比总结
- 改变数据的默认格式可以让数据以你想要的形式展现,包括精确到哪一位、多少进制显示、只显示正负等;
- 使用disp函数来打印可以打印所有的内容,包括负数,但要注意的是disp函数需要的是数组参数,并且只会打印数组内的字符串,所以如果是一个数字你需要使用int2str或num2str转化成字符串,但是如果是一个矩阵,你可以直接打印(至于为什么可以直接打印数字格式的矩阵,我也不明白);
- 使用fprintf函数可以以任何的数据格式打印数据,而且可以带有一个或多个值,但是要使用正确的特殊字符,但值得注意的是fprintf函数只能复数的实部,所以在有复数参加或产生的计算中,可能产生错误的结果;
总的来说,使用fprintf最为灵活方便,可以输出任何格式,而且可以有多个数据项,但fprintf需要定义数据项的字符宽度和数据格式,所以上手感觉有点繁琐。
2 将不同长度的一维数组存入二维数组
将多个不同长度的一维数组存入二维数组时,需要将所有一维数组的长度转为相同长度,可以采用在数组后边补零的方式实现。
如果a是行向量,M是你要的最终向量的长度,用
a=[a , zeros(1,M-length(a))];
如果a是列向量,改成
a=[ a ; zeros(M-length(a),1)];
3 数组中多少个不同的值
n = length(unique(B)); 不同值个数
unique(B,‘rows’) 所有的不同值
4 矩阵中nan元素的个数
方法一:numel(find(isnan(a)))
方法二:numel(a(isnan(a)))
5 去掉矩阵中的nan元素
a = [NaN 1 2 3 4];
p = find(isnan(a))
a(p) = [];
5.1 二维数组
1 设置一个含空NAN数组,代码:
test=[1;2;3;nan;5;nan;7];
2 将其中的空值nan去掉:
test(isnan(test(:,1))==1)=[];
test_2=test;
3 将其中的空值nan用0代替,代码:
test(isnan(test(:,1))==1)=0;
test_3=test;
4 将其用上一个数值代替,代码:
for i=1:7if isnan(test(i,1))==1test(i,1)=test(i-1,1);endendtest_4=test;
5.2 多维数组
如果是多位数组如何处理呢?这里设置一个7*2的数组,代码:
test_1=[1,1;2,2;3,3;nan,nan;5,5;nan,nan;7,7];
多维数组将其含空值nan的整行数组全部去掉,代码:
test_5=test_1(:,1).*test_1(:,2)for i=7:-1:1if isnan(test_5(i,1))==1test_1(i,:)=[];endendtest_1
6 统计一个数组中各数字(元素)出现的频数、频率和累积频率
n=sum(a==7)
6.1 统计数值型数组
>> x = [2 2 6 5 2 3 2 4 3 4 3 4 4 4 4 2 26 0 4 7 2 5 8 3 1 3 2 5 3 6 2 3 54 3 1 4 2 2 2 3 1 5 2 6 3 4 1 2 5];
>> tabulate(x(:))Value Count Percent0 1 1.96%1 4 7.84%2 14 27.45%3 10 19.61%4 10 19.61%5 6 11.76%6 4 7.84%7 1 1.96%8 1 1.96%
6.2 字符串
>> x = ['If x is a numeric array, TABLE is a numeric matrix.']';
>> tabulate(x)Value Count PercentI 1 2.44%f 1 2.44%x 2 4.88%i 5 12.20%s 2 4.88%a 5 12.20%n 2 4.88%u 2 4.88%m 3 7.32%e 2 4.88%r 5 12.20%c 2 4.88%y 1 2.44%, 1 2.44%T 1 2.44%A 1 2.44%B 1 2.44%L 1 2.44%E 1 2.44%t 1 2.44%. 1 2.44%
6.3 字符型数组
>> x = ['崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';'叶 鹏';'关泽满';'谢中华';'王宏志';'孙乃喆';'崔家峰';'谢中华'];
>> tabulate(x)Value Count Percent崔家峰 3 21.43%孙乃喆 2 14.29%安立群 1 7.14%王洪武 1 7.14%王玉杰 1 7.14%高纯静 1 7.14%叶 鹏 1 7.14%关泽满 1 7.14%谢中华 2 14.29%王宏志 1 7.14%
6.4 字符串元胞数组
>> x = {'崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';
'叶鹏';'关泽满';'谢中华';'王宏志';'孙乃喆';'崔家峰';'谢中华'};
>> tabulate(x)Value Count Percent崔家峰 3 21.43%孙乃喆 2 14.29%安立群 1 7.14%王洪武 1 7.14%王玉杰 1 7.14%高纯静 1 7.14%叶鹏 1 7.14%关泽满 1 7.14%谢中华 2 14.29%王宏志 1 7.14%
6.5 名义尺度(如性别,职业,产品型号等)数组
>> load fisheriris
>> species = nominal(species);
>> tabulate(species)Value Count Percentsetosa 50 33.33%versicolor 50 33.33%virginica 50 33.33%
7 矩阵内的0元素
7.1 统计非0元素的个数
%统计矩阵A中非0元素的个数
sum(sum(A~=0))
7.2 去除0元素
向量:
a=[1,0,2,3,0,4,5]a(find(a==0))=[]a =1 2 3 4 5
矩阵:
a=[0 0;1 2;0 0;3 4]a =0 01 20 03 4a(find(a==0))=[]a =1 3 2 4a=reshape(a,2,2)a =1 23 4
利用 [ ] 删除矩阵中全为0的某行
A=[ 0 0 0;
1 0 0;
1 1 1];A =0 0 01 0 01 1 1A(any(A,2)==0,:)=[]A =1 0 01 1 1
8 输出一行文字
!echo hello,matlab!
9 三维数组的操作
A = [1 2 3; 4 5 6; 7 8 9]
A(:,:,2) = [10 11 12; 13 14 15; 16 17 18]
B = cat(3,A,[3 2 1; 0 9 8; 5 3 7])
B(:,:,4) = 0
elA = A(1,2,2) % 访问 A 中下标为 1,2,2 的元素
C = A(:,[1 3],:) % 在第二个维度中使用索引向量 [1 3],只访问 A 的每一页上的第一列和最后一列
D = A(2:3,:,:) % 查找每一页的第二行和第三行
10 将每次循环的图绘制在一张图纸上
n = 5;
t = 0:0.05:2*pi;
for k = 1:nfigurex = k*sin(t);y = k*cos(t).*x;plot(x,y);hold on % 保持同一绘画框
end
1)没有figure
画出的图在一张图纸上
2)有figure
循环n次就有n张图
11 循环保存文件
11.1 二维数组
执行10次循环,每次循环生存一个矩阵temp.m,分别保存为temp1,temp2……
n = 10;
for k = 1 : nfilename = strcat('temp', num2str(k), '.m');save(['.\data\', filename],'ccdf_ValDelay'); % ccdf_ValDelay is the target variable o be saved
end
11.2 三维数组
Am_nor是一个已知的13页的三维数组,将每一页数组生成名为Am1,Am2…的矩阵
for SampleN0_i = 1:SampleN0_alleval(['depsize_n1f1_Rx', num2str(SampleN0_i),'depsize_n1f1tmp(:,:,SampleN0_i)']);
end
转化为二维数组
% Reshape array
aaa=[[1,2,3];[4,5,6]];
bbb=[[11,22,33];[44,55,66]];
bb=[[111,222,333];[444,555,666]];
b=[[1111,2222,3333];[4444,5555,6666]];
c(:,:,1)=aaa;
c(:,:,2)=bbb;
c(:,:,3)=bb;
c(:,:,4)=b;
[No_row,No_col,No_pag] = size(c);
ccc=reshape(c,[(No_row*No_col),No_pag])'
for i=1:No_pagfilename = strcat('testc', num2str(i));for j=1:No_rowcctrans(j,1:No_col) = ccc(i,j:2:(No_row*No_col));endsave(['.\data\', filename],'cctrans','-ascii');
end
for i=1:No_pagfilename = strcat('testc', num2str(i));testc1 = load(['.\data\',filename])
end
输出结果
ccc =列 1 至 41 4 2 511 44 22 55111 444 222 5551111 4444 2222 5555列 5 至 63 633 66333 6663333 6666testc1 =1 2 34 5 6testc1 =11 22 3344 55 66testc1 =111 222 333444 555 666testc1 =1111 2222 33334444 5555 6666
11.3 eval函数
eval的功能简单来说就是可以把字符串当做命令来执行
eval用于循环中是再好不过了,特别是有些变量的名字中含有有规律的数字,比如我们现在要依次把data1,data2,data3写入excel,并命名为data1.xlsx,data2.xlsx,data3.xlsx,
当然你可以写三行:
xlswrirte('data1.xlsx',data1)xlswrirte('data2.xlsx',data2)xlswrirte('data3.xlsx',data3)
但是假如现在有1000个这种data1,data2,…,data1000呢
这个时候就需要eval出马了,我们也可以只用三行:
for i=1:1000eval(['xlswrite(''data',num2str(i),'.xlsx'',','data',num2str(i),')'])end
注意上面的eval语句语句中第一个data前面有两个’’,而xlsx后面也有两个’’,这就是给我们初学者埋下的坑哈哈,两个’‘号中第一个’代表转义字符,意思是两个’'号中第二个’号为命令中的’号,不是用来分割字符串文本的!
使用eval时只需要先把想要表示的语句即命令写好,再用’号分割成一段段字符串,注意上面提到的’可以用作转义字符的情况
最后放一个我用来分表写入excel的实例吧,看起来复杂一点但是道理都是一模一样的:
这个是把2880个变量(15min一个,一天96个,30天2880个,按时间顺序已排好序)每96个变量一个excel,每个变量一个sheet:
clear
clc
close all
load time_volume_data.mat%载入数据
%把站点流量按天按时段写入excel文件
m=1;
day=1;
for n=1:2880eval(['xlswrite(''data',num2str(day),'.xlsx''',',','data',num2str(n),',','''sheet',num2str(m),''')']);if m==96m=0;endif mod(n,96)==0day=day+1;endm=m+1;
end
12 循环读取文件
将二维数组文件读取至三维数组
for SampleN0_i = 1:SampleN0_allfilename_CCDF_delay_f1 = strcat('RBC_t105_cdf50_90_CCDF_backlog_f1_Rx', num2str(SampleN0_i),'.m');CCDF_delay_f1tmp(:,:,SampleN0_i) = load(['.\data\', filename_CCDF_delay_f1]);
end
13 plot循环中不同颜色
color={'g.','r.','c.','m.','y.','k.'};
for i=1:kClusK=setdiff(Clusters(i,:),0);plot(xdata(ClusK,1),xdata(ClusK,2),color{i},'MarkerSize',10) % MarkerSize 表示点的大小,b.表示蓝色的点
end
14 colormap 函数
14.1 colormap简介
matlab中,每个figure都有(而且仅有)一个colormap,翻译过来就是色图。
colormap(map) 用map矩阵映射当前图形的色图。
colormap(‘default’) 默认的设置是 JET.
map= colormap(获得当前色图矩阵.
colormap(ax,…) 应用色图到ax坐标对应的图形,而非当前图形。
colormap实际上是一个m × 3的矩阵,每一行的3个值都为0-1之间数,分别代表颜色组成的rgb值,如[0 0 1]代表蓝色。
系统自带了一些colormap,如:winter、autumn等。输入winter,就可以看到它是一个64x3的矩阵。
用户可以自定义自己的colormap,而且不一定是64维的。
系统自带的colormap:
14.2 colormap用法
那么颜色在fill或patch中到底是如何显示的呢?
本质上,是把具体的颜色变成colormap中的相应index,也就是行数。
这个过程叫做换算映射:将指定的数值颜色向量(矩阵)C,映射到对应的颜色。
在matlab中,图形窗的属性’CdataMapping’缺省设置值为’scaled’,也就是线性映射。
映射过程如下:
首先,需要根据caxis取得Cmin和Cmax两个变量(默认值为0和1),画图时如果指定了数值颜色向量(矩阵)C,Cmin和Cmax自动设置为C中的最大值和最小值。当你想控制时,可以自定义。比如将Cmax减小,这样将把所有大于Cmax的C值,全部都映射到同一个颜色(colormap中index最大的行代表的颜色)。
根据Cij在Cmin和Cmax之间的比例关系,确定对应的颜色的index,默认为线性映射。
也就是说,当制定了数值颜色向量(矩阵)C之后画图,图中颜色的使用范围会自动占满整个颜色范围!!!
另外,fill中指定了某些点的颜色值,其他颜色值都是采用插值的方法确定。
14.3 实例
实例1:
colormap([spring;summer;autumn;winter])%相当于自定义了一个256*3维的colormap %实际上spring,summer,autumn,winter%都是64*3维的colormap
x=[0 1 1 0];
y=[0 0 1 1]; %定义四个点 [0 0] [1 0] [1 1] [0 1]
fill(x,y,[0 0.1 0.2 0.3]); %定义四个点的C值 %则Cmin=0,Cmax=0.3
colorbar;
map=colormap; %map为256*3矩阵
结果如下:
实例2:
%本例中颜色从[0 0 0] 变化到[1 1 0]
%增加row_cmap的值,如变化到100,则可看到颜色的渐变,而非跳跃型变化。
row_cmap = 15; %定义色图矩阵的行数
color_map=zeros(row_cmap,3); %定义色图矩阵
color_r = 0:1/(row_cmap-1):1;
color_g = 0:1/(row_cmap-1):1;
color_b = 0:1/(row_cmap-1):1;
color_map(:,1) = color_r;
color_map(:,2) = color_g;
colormap(color_map);x=[0 1 1 0];
y=[0 0 1 1]; %定义四个点 [0 0] [1 0] [1 1] [0 1]
fill(x,y,[0 0.1 0.2 0.3]); %定义四个点的C值 %则Cmin=0,Cmax=0.3
colorbar;
map=colormap; %map为15*3矩阵
colorbar;
结果如下:
15 循环加legend
figure
for i = 1:15plot(flavorType(i,:))hold onlegend_str{i} = ['flavor' num2str(i)];
end
legend(legend_str)
16 心心
figure
% 指定背景为本地图片
img = imread('img2.jpg');
imagesc([-20 20], [-20 15],img); % imagesc([min_x max_x], [min_y max_y],img);
hold on
% xlabel('Raster Column');
% ylabel('Raster Row');
% colormap(gray);
% figure
% 绘制心心
t = 0:pi/50:2*pi
x = 16*sin(t).^3
y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)
scatter(x,-5-y,'rd','filled')
17 删除指定文件夹内的文件夹及多个子文件夹
17.1 MATLAB Documentation - MathWorks 中国
地址:
MATLAB Documentation - MathWorks 中国https://ww2.mathworks.cn/help/matlab/index.html?s_tid=CRUX_lftnav
遇到MATLAB的问题首先打开MATLAB Documentation,查找文件操作部分内容,如下:
17.1 delete - 删除文件或对象
delete *.mat %删除当前文件夹中带有 .mat 扩展名的所有文件。
17.2 rmdir- 删除文件夹
删除非空文件夹
[status, message, messageid] = rmdir('myfiles') %删除空文件夹
[status, message, messageid] = rmdir('myfiles', 's') %删除非空文件夹
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
status - 文件夹删除状态
0 | 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
msg - 错误消息
错误消息,指定为字符向量。如果发生错误或警告,msg 将包含错误或警告的消息文本。否则,msg 为空,即 ''。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17.2 代码块
function deletebeforecd('E:\TEST') %进入所在文件夹delete *.txt %删除文件夹内所有.txt
delete *.cst %删除文件夹内所有.cstif exist('cable','dir') == 7 %检测是否存在名为'cable'的文件夹及子文件夹
files = dir('E:\TEST'); %遍历
%delete dir
filenum = length(files);for i = 1:filenumif(files(i).isdir && ~strcmp(files(i).name,'.') && ~strcmp(files(i).name,'..'))rmdir(files(i).name,'s') endend
endend
18 去掉数组中的NaN值
方法一:
clc
clear all
test = [0 1 0 5 0 NaN 5 NaN; 2 0 NaN NaN 8 NaN 5 NaN]
[row_samp col_samp] = size(test);
ind_nan = [];
for i=1:row_sampind_nani = find(~isnan(test(i,:)));ind_nan(i) = length(ind_nani);test1(i,1:ind_nan(i)) = test(i,ind_nani);
end
test1
结果
test =0 1 0 5 0 NaN 5 NaN2 0 NaN NaN 8 NaN 5 NaNtest1 =0 1 0 5 0 52 0 8 5 0 0ind_nan2 =1 2 5 7test2 =0 0 0 02 0 8 5
方法二:
可以通过importdata('data.txt')
将数据文件data.txt导入数组A中。
A=importdata('data.txt')
然后通过命令
z=find(~isnan(A))
将A数组中NaN所在的编号给找出来;
B=A(z)
就可以将A中所有的NaN值剔除掉了,如果希望得到非NaN值的编号,那么z就是了!
如果只求将A中NaN值去掉,那么B=A(~isnan(A))就可以搞定!
当然,我们此方法也可以将数组中某个数替换或者剔除。
比如我们有个数组
A=[1,2;0,3]
我们希望将数组A中的0给找出并剔除掉。
z=find(A==0);A(z)=[];
19 求状态转移矩阵的稳态概率分布
TPM= [0.368 0 0.632; 0.368 0.368 0.264; 0.184 0.368 0.448];
n = 10; % high dim TPM needs much larger n to obtain an accurate value of SSP
ssp = TPM^n;
SSP = ssp(1,:);
结果
ssp =0.2848 0.2632 0.45200.2848 0.2632 0.45200.2848 0.2632 0.4520SSP =0.2848 0.2632 0.4520
解释如下:
即矩阵TPM的稳态概率分布为:SSP=[0.285, 0.263, 0.452](保留三位有效小数)
20 循环给二维数组赋值
for i = 1:2test{i}=[1+i 2; 3+i 4];
end
test{2}
结果
ans =3 25 4
21 判断数组元素是否全部为零
any(a)
全是0为0,否则为1
二维及以上数组要注意any(a)结果值的对应关系
22 创建多个Legend
figure for d_i=1:length(Distance)indexP_3300 = find(Power_chg_rec_3300~=0);if ~isempty(indexP_3300)pSrPchg(d_i) = plot(Split_Ratio(1:len_SpRa),(10*log10(Power_chg_rec_3300(d_i,(1:len_SpRa)))),'linestyle',linestyle{2},'color',color{d_i},'Linewidth',1.5,'Marker',marker{1});hold onlegend_strP{d_i} = ['d = ' num2str(Distance(d_i))];end
end
for d_i=1:length(Distance)indexP = find(Power_chg_rec~=0);if ~isempty(indexP)plot(Split_Ratio(1:len_SpRa),(10*log10(Power_chg_rec(d_i,(1:len_SpRa)))),'linestyle',linestyle{1},'color',color{d_i},'Linewidth',1.5,'Marker',marker{2});hold onend
end
pSrPchgLeg(1) = plot(Split_Ratio(1),(10*log10(Power_chg_rec(d_i,(1:1)))),'linestyle',linestyle{2},'color',color{3},'Linewidth',1.5,'Marker',marker{1});
pSrPchgLeg(2) = plot(Split_Ratio(1),(10*log10(Power_chg_rec_3300(d_i,(1:1)))),'linestyle',linestyle{1},'color',color{3},'Linewidth',1.5,'Marker',marker{2});
legend_strPLeg1 = strcat('R = ',num2str(SampleN0_all));
legend_strPLeg2 = strcat('R = ',num2str(SampleN0_all_3300));
% % % 坐标轴范围
xlim_bottom = 0;
xlim_up = 1;
ylim_bottom = 45;
ylim_up = 65;ax1 = gca;
xlim(ax1,[xlim_bottom xlim_up]);
ylim(ax1,[ylim_bottom ylim_up]);% % % 第二axes
ax2 = axes( 'Position',get(ax1,'Position'),'Xlim',[xlim_bottom xlim_up],'Ylim',[ylim_bottom ylim_up],'Visible','off','color','none'); %ax2与ax1横纵坐标范围对应
% % %画两个legend
Leg1 = legend( ax1,pSrPchg,legend_strP ); % legend(legend_strP);
Leg2 = legend( ax2,pSrPchgLeg,legend_strPLeg1,legend_strPLeg2,'color','none' );xlabel(ax1,'Split Ratio \rho','fontsize',12);
ylabel(ax1,'Received Charging Power (dB)','fontsize',12);
hold off
grid on
title(['No. of Sample: ',num2str(SampleN0_all),', Input power: ',num2str(Power_in)])
23 如何放大figure图中的局部细节/区域
一、画图
在命令窗口中输入:
t=0:0.01:15;
y=sin(t);
figure(1)
plot(t,y)
二、放大局部细节
1 点击如图所示的箭头
2 点击鼠标右键→复制
3 粘贴
4 调整小图大小,并防止在合适的位置。选中小图,点放大(图片中“+”)
5 调整x轴、y轴的刻度,选择需要放大的位置。(选中小图,双击)
6 点击图中x左边的箭头,完成。
最后的图形
24 绘制三维图形
在Matlab中,三维图形的绘制包括三维曲线,三维网线图和三维曲面图。
24.1 几个函数
1.plot3(x,y,z,…)
其中,x,y,z为维数相同的向量,分别储存3个坐标值;
2.stem3(x,y,z,…)
常用的三维火柴杆图
3.mesh(x,y,z,…)
常用的网线图调用格式;
mesh(X,Y,Z) 创建一个网格图,该网格图为三维曲面,有实色边颜色,无面颜色。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度。边颜色因 Z 指定的高度而异。
4.surf(x,y,z,…)
常用的曲面图调用格式;
surf(X,Y,Z) 创建一个三维曲面图,它是一个具有实色边和实色面的三维曲面。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度。曲面的颜色根据 Z 指定的高度而变化。
5.contour(x,y,z,…)
常用的的等高线调用格式;
6.meshgrid(x,y)
格点矩阵生成函数;
24.2 例子
下面以两个例子,熟悉上述函数的用法
例一:plot3, stem3
绘制x=cos(t),y=sin(t),z=t所表示的曲线,其中t的范围为[0,10pi],要求绘制三维曲线图与三维火柴杆图。
分析:可以看到,函数中,x,y均为z的单值函数,所以用plot3和stem3就可以解决
代码:
t=0:pi/30:10*pi; %设定t的范围plot3(cos(t),sin(t),t,'-b','LineWidth',4); %绘制三维曲线,并且做修饰grid on %加网格axis square %命令坐标为方形figure(2) %新建图形窗口stem3(cos(t),sin(t),t,'-.g') %绘制三维火柴杆图
结果:
图1. 例一结果图(三维曲线图)
图2. 例一结果图(三维火柴杆图)
例二:meshgrid, surf, mesh, surf, contour
绘制二元方程
所表示的三维曲面,其中x,y的范围为[-8,8],要求绘制三维曲面图,三维网线图,三维等高线图。
分析:可以看出,函数中,z为与x,y都相关的函数,所以此处需要用meshgrid函数先构成格点矩阵
代码:
x=-8:0.5:8; % x范围 y=-8:0.5:8; % y范围% SpD_x,SpD_y=meshgrid(a,b); % SpD_x(m,m*n)每一行都相同,是将a(m,n)的列变行后追加成一行,保持a的行数; SpD_y(m,m*n)每一列都相同,第i行是b(1,m)的第i个元素,重复m*n次
% SpD_x(n,m)每一行都相同,是将a(1,m)重复n次;
% SpD_y(n,m)每一列都相同,是将b(1,n)的行变成列,重复m次[xx,yy]=meshgrid(x,y); %构成格点矩阵c=sqrt(xx.^2+yy.^2)+eps; %计算z的分母,为避免为0,加epsz=sin(c)./c; %计算zsubplot(2,2,1)surf(xx,yy,z);title('Surfplot'); %子图1,绘制三维图形subplot(2,2,2)mesh(xx,yy,z);title('Meshplot'); %子图2,绘制三维曲面subplot(2,2,3)surf(xx,yy,z);title('Surplot with shading interp'); %子图3,绘制三维曲面,表面为光滑shading interp;subplot(2,2,4)contour(xx,yy,z);title('Meshplot'); %子图4,绘制等高曲线
结果:
图 3. 例二结果图
希望大家能认真体会以上两个例子,现在给出一个思考题,如果能画出来的话,说明你已经掌握了这一技能,答案我将在下一期的帖子给出。
思考题:
给出一组数据,如下表所示,做出其三维曲面图
图 4.思考题数据截图
图 5.思考题答案图
注:本贴提及的程序及思考题数据位置为:http://www.jishulink.com/content/doc/280286
24.3 surf曲面绘图数据与颜色图的关系
1. 默认设置修改
s = surf(X,Y,Z,C);
默认情况下,C 等于 Z,即颜色随高度而异。
默认情况下,C 的范围线性映射到颜色图数组中的行数。
通过C=X,实现曲面上的颜色随 X 而异。
您也可以直接设置 CData 属性。以下命令将使得颜色随 Y 而异。
s.CData = Y;
颜色无需遵循单一维度的变化。实际上,CData 可以是任何与 Z 大小相同的数组。例如,以下平面上的颜色遵循 sinc 函数形状。
R = sqrt(X.^2 + Y.^2) + eps;
s.CData = sin®./®;
s.EdgeColor = 'none';
s.CData = SpD_y;
R = sqrt(SpD_x.^2 + SpD_y.^2) + eps;
s.CData = sin(R)./(R);
1. shading设置颜色着色属性
shading 函数控制曲面和补片图形对象的颜色着色。
shading flat 每个网格线段和面具有恒定颜色,该颜色由该线段的端点或该面的角边处具有最小索引的颜色值确定。
shading faceted 具有叠加的黑色网格线的单一着色。这是默认的着色模式。
shading interp 通过在每个线条或面中对颜色图索引或真彩色值进行插值来改变该线条或面中的颜色。
shading(axes_handle,…) 将着色类型应用于 axes_handle 指定的坐标区而非当前坐标区中的对象。使用函数形式时,可以使用单引号。例如:
shading(gca,‘interp’)
举例
tiledlayout(2,2)
nexttile
sphere(16)
title('Faceted Shading (Default)')nexttile
sphere(16)
shading flat
title('Flat Shading')nexttile
sphere(16)
shading interp
title('Interpolated Shading')
24.4 三维数据可视化
1. 三维图形
plot3(x,y,z):其中参数x,y和z都是具有相同的维数的向量或者矩阵
mesh()绘制三维网格图
surf()绘制彩色的三维曲面图
2. 特殊三维绘图
cylinder()产生柱面图的数据,然后采用mesh方便的绘制出三维旋转体
sphere():球面图
contour3():三维等高线
bar3():柱状图 bar3h()水平三维柱状图
pie3():饼状图
scatter3():三维散点图
3. 设置视角
view(az,el):az为方位角,el为仰角
view([x y z]):指向向量[x y z]所指的方向
view(2):二维视角
view(3):三维视角
rotate3d on/off:打开或关闭三维视角功能
4. 色彩控制
rgbplot()绘制色图
colorbar():水平颜色条
colormap():垂直颜色条
5. 光照效果
light()
6. 图形的输出
file菜单下的save as
25 逻辑函数
all——判断是否所有元素都是非零数
any——判断是否存在非零数
exist——判断变量或函数是否存在
find——找出非零元素的位置
isfinite——判断矩阵元素是否为有限值
isinf——判断矩阵元素是否为无限值
isempty——判断矩阵是否为空矩阵
isequal——判断几个对象是否相同
isnumeric——判断矩阵元素是否为数据
issparse——判断矩阵是否为稀疏矩阵
ischar——判断是否为字符串
islogical——判断矩阵是否为逻辑类型
isfield——判断是否为某个结构体矩阵的域
isstruct——判断是否为结构体类型
ishandle——判断是否为图像句柄
-
all——判断是否所有元素都是非零数
对于向量a(行向量或列向量),如果向量中所有元素都是非零数,则all(a)返回1;否则返回0。
对于矩阵A,all(A)是作用于列向量上的,若矩阵中某列的所有元素都是非零数,则返回1;如果存在0则返回0。因此对于矩阵A,all(A)结果为与A具有同列数的行向量。
判断矩阵元素是否都大于5——all(all(A > 5))
此处A>5返回一个逻辑矩阵,all(A>5)返回一个行向量,若该行向量中所有元素均大于0,则all(all(A>5))返回1,即说明该矩阵中所有元素均大于5. -
any——判断是否存在非零数
对于向量a(行向量或列向量),如果向量中至少有一个元素是非零数,则any(a)返回1;若所有元素均为0,返回0。
对于矩阵A,any(A)是作用于列向量上的,若矩阵中某列至少含有一个非零元素,则返回1;如果全为0,则返回0。因此对于矩阵A,any(A)结果为与A具有同列数的行向量。 -
exist——判断变量或函数是否存在
在MATLAB程序设计中,有时需要知道变量是否已经被定义过,即是否存在于当前内存中,有时还需要详细了解变量的类型,这是exist就显得非常有用。
exist的参数必须为字符串标量或字符向量,即格式为:exist(’ ')其返回值a与参数’A’的关系为:
-
find——找出非零元素的位置
若需要对矩阵中符合某一特定条件的元素进行定位,比如将矩阵中为0的元素设为1,运用find和各种逻辑、关系运算可以实现绝大多数条件的元素定位。
注意:按列查找!
a = find(A)——返回非零元素的序号
a = [0, 1, 4, 0, 5];
>> find(a)ans =2 3 5 >> a = [0, 1; 2, 3; 0, 4]a =0 12 30 4>> find(a)ans =2456>> % 所显示的序号是按列从1开始进行数的
>>
>> b(:, :, 1) = [0, 0; 1, 2];
>> b(:, :, 2) = [3, 4; 5, 6];
>> bb(:,:,1) =0 01 2b(:,:,2) =3 45 6>> find(b)ans =245678
[i, j] = find(A)——适用于矩阵,返回非零元素的行、列的序号。常用于稀疏矩阵中。
a = [1, 2, 3; 4, 5, 6; 7, 8, 9];
>> [i, j] = find(a)i =123123123j =111222333
[i, j, v] = find(A)——v中存放非零元素的值,i、j与上面的相同
a = [1, 2, 3; 4, 5, 6; 7, 8, 9];
>> [i, j, v] = find(a)i =123123123j =111222333v =147258369
矩阵替换:a(find(a == 3)) = b(find(a == 3))
a = [1, 1, 1; 2, 2, 2; 3, 3, 3];
>> b = [9, 9, 9; 8, 8, 8; 7, 7, 7];
>> aa =1 1 12 2 23 3 3>> bb =9 9 98 8 87 7 7>> a(find(a == 2)) = b(find(a == 2)); //将a矩阵中值为2的元素替换为b矩阵中相应位置的元素
>> aa =1 1 18 8 83 3 3
删除元素:a(find(5)) = []
a = [1, 2, 3; 4, 5, 6; 7, 8, 9]a =1 2 34 5 67 8 9>> a(find(a == 5)) = []; //删除矩阵中值为5的元素,同时将矩阵转化为一个向量
>> aa =1 4 7 2 8 3 6 9>> whosName Size Bytes Class Attributesa 1x8 64 double
删除矩阵中的某一行——赋值为[ ]
a = [1, 2, 3; 4, 5, 6; 7, 8, 9]a =1 2 34 5 67 8 9>> a(2, :) = []; //删除矩阵中的第2行
>> a a =1 2 37 8 9
-
isfinite——判断矩阵元素是否为有限值
若是有限值,则相应位置返回1, 否则返回0 -
isinf——判断矩阵元素是否为无限值
若是无限值,则相应位置返回1, 否则返回0
注意:NaN、+Inf、-Inf等都被视为无限值。
isinfinite和isinf函数返回的都是与参数规模相同的矩阵。
a = [1, 2, 3; 4, 5, 6; 7, 8, 9];
>> isfinite(a)ans =3×3 logical 数组1 1 11 1 11 1 1
- isempty——判断矩阵是否为空矩阵
矩阵为空则返回1,否则返回0.
注意区分:空矩阵、零矩阵、矩阵不存在
空矩阵:矩阵存在,但矩阵中没有元素
零矩阵:矩阵中所有元素均为0
矩阵不存在:当前工作空间中没有定义该矩阵变量
- isequal——判断几个对象是否相同
a = [1, 2, 3; 4, 5, 6; 7, 8, 9];
>> b = [1, 2, 3; 4, 5, 6; 7, 8, 9];
>> c = [1, 2, 3; 4, 5, 6; 7, 8, 9];
>> isequal(a, b, c)
ans =logical1
-
isnumeric——判断矩阵元素是否为数据
如果矩阵是数据矩阵,如稀疏矩阵、双精度矩阵、复数矩阵等,则返回1;反之,如果是字符串、结构体矩阵等,则返回0. -
issparse——判断矩阵是否为稀疏矩阵
-
ischar——判断是否为字符串
-
islogical——判断矩阵是否为逻辑类型
-
isfield——判断是否为某个结构体矩阵的域
-
isstruct——判断是否为结构体类型
-
ishandle——判断是否为图像句柄
————————————————
现有原文链接:
https://blog.csdn.net/SailingLT/article/details/80673556
https://blog.csdn.net/naturly/article/details/107742732
https://blog.csdn.net/shguo2/article/details/80581480
https://blog.csdn.net/qq_38412868/article/details/79185883
https://blog.csdn.net/me4weizhen/article/details/53912156
https://blog.csdn.net/google0802/article/details/16342633
https://blog.csdn.net/ckzhb/article/details/79828622
https://blog.csdn.net/qq_36581390/article/details/103568050
https://blog.csdn.net/Sunflower02/article/details/100661633
https://www.cnblogs.com/adong7639/p/10330387.html
https://blog.csdn.net/qq_39671345/article/details/118382918
https://python.iitter.com/other/79174.html