Matlab 语句

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

print

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Probability, Matringale,Markov Chain, MCMC

一、基本知识 1. 条件概率 条件概率是指在某件事情已经发生的前提下,另一件事情在此基础上发生的概率,举例来说P(A丨B)表示B发生的基础上,A也发生的概率,基本公式为: 2. 条件期望 在上述概率下的期望我们称之为条…

html 按钮 按下 状态_科普|你身边的手动火灾报警按钮,您了解吗?

手动火灾报警按钮手动火灾报警按钮,是火灾报警系统中的一个设备类型,当建筑发生火灾时在火灾探测器没有探测到火灾的时候人员手动按下手动火灾报警按钮,报告火灾信号,向建筑所属消防控制室报火警。正常情况下当手动火灾报警按钮报…

马尔可夫蒙特卡罗 MCMC 原理及经典实现

我们在做机器学习、深度学习或自然语言处理等项目时,经常采用什么方法采样呢?大家马上会想到吉布斯 Gibbs 采样,今天我们来分享一种比较实用的采样方法:马尔可夫蒙特卡罗方法,吉布斯采样是其中的一种。 Markov chain …

les物流执行系统_【精益运营】立足智慧物流 推进仓储智能化稳步升级

近年来,“智能制造”成为制造行业的热门词汇,也成为引领物流行业发展的风向标。今年在两会中,“智能”一词首次写入报告,为传统行业改造升级、实现协同共享带来了新的发展机遇。早在2017年12月,根据公司对VMI业务整合工…

增益比值 dB 以及 dBw-dBmv 等之详解

dB 分贝(工程应用),dB(Decibel,分贝)是一个纯计数单位,本意是表示两个量的比值大小,没有单位。在工程应用中经常看到貌似不同的定义方式(仅仅是看上去不同)。…

带有Spring Boot 2支持的Apache Camel 2.22发布

今天,我们发布了最新的Apache Camel 2.22.0版本 ,这是第一个正式完全支持Spring Boot 2的版本。这是一项重大的工作,因为针对像Apache Camel这样的大型框架将Spring Boot v1升级到v2付出了很多努力–感谢骆驼队和他们的贡献。 对Spring Boot …

java 分布式事务_Java核心知识 Spring原理十五 JPA 原理

1. 事务事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。2. 本地事务紧密依赖于底层资源管理器(例如数据库连接 ),事务处理局限在当前事务资源内…

Latex中定理、引理、证明、假设、空白行的编写

1. 引理 \newtheorem{lemma}{Lemma}[section] \begin{lemma} \label{lemma1}\end{lemma}编译效果: 2. 定理 \newtheorem{thm}{\bf Theorem}[section] \begin{thm}\label{thm1} Suppose system (\ref{l1}) satisfies Assumption (\ref{mim1}), the closed-loop s…

Latex设置字体大小

全局模式 \documentclass[12pt]{article} 在文档的开头,有设置整个文章的字体大小,如:12pt。 局部模式 设置字体大小的命令从小到大为: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge \Huge…

c 结构体在声明时赋值_C/C++编程笔记:C++入门知识,C++多态性和虚函数解析

本篇要学习的内容和知识结构概览多态性编译时的多态性称为静态联编. 当调用重载函数时, 在编译期就确定下来调用哪个函数.运行时的多态性称为动态联编. 在运行时才能确定调用哪个函数, 由虚函数来支持.静态联编中的赋值兼容性及名字支配规律派生一个类的原因并非总是为了添加新…

concurrent vs. simultaneous

Both the words mean “occurring at the same time”, but “concurrent” represents the events that occur over a period of time whereas “simultaneous” represents the events that occur at a point in time. https://www.perfmatrix.com/concurrent-users-vs-simul…

使用Spring Boot和GraphQL构建安全的API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 GraphQL是Facebook在2012年开发的一种数据查询语言,用于解决REST API和传…

ue4材质节点大全_转载于知乎:UE4 多象限(UDIM)贴图在UE4中的应用

各位小伙伴早上好啊!真的又隔了很久才再次见面。。这次是工作上一个同事在网上看到了一篇有意思的文章分享给我,觉得这种方式确实挺有意思,反正我是之前没有这么去考虑过。希望能够给大家带来一点启发!!此文章转载于知乎:UE4 多象限(UDIM)贴图…

Latex各种命令、符号、公式、数学符号、排版等

本文仅供学习参考使用,一切版权和解释权均归原作者所有,转载地址:http://blog.csdn.net/garfielder007/article/details/51646604 数学符号详细内容见:http://mohu.org/info/symbols/symbols.htm 直接查看链接 http://www.mohu.o…

app inventor调用图像识别_+AI场景,3步懂图像识别产品

本文重点讲述基于成熟的第三方AI平台阿里、某度、腾讯、谷歌等等中选择一个可供使用的SDK基于Python语言实现图像识别功能的GUI界面,从而一观图像识别车型、图像识别文本产品的实现过程。我们正处于各种图像识别的场景里,你去某些生鲜超市不用手机可以实…

适用于Java EE / Jakarta EE开发人员的Micronaut

城镇中有一个名为Micronaut的新微服务框架。 在本文中,我将从Java EE / Jakarta EE的角度讨论如何冒险使用Micronaut框架。 我是Java EE开发人员,因此使用诸如Eclipse MicroProfile之类的解决方案开发微服务更接近我的专业知识,但是Micronaut…

塔罗牌第五张是什么牌_塔罗牌四季牌阵:冬至将至,快来看看未来这三个月运势如何?...

塔罗牌四季牌阵,是一个神奇的牌阵,因为一年之中只有占卜四次的机会。塔罗牌四季牌阵最初从塔罗师 Marcia Masino 的《Best Tarot Practices》,作为占卜接下来三个月也就是一个季度整体运势的一种特殊牌阵,只能在每年四个季节转变的…

了解Beamforming

波束成形技术是将信号以一种能量集中和定向方式发送给无线终端的技术,能全面改善无线终端接收的信号质量,并提升吞吐量。 如果要采用波束成形技术, 前提是必须采用多天线系统。例如,多进多出(MIMO)&#xf…

saiku docker配置部署_【安装教程】01 Gitea Docker 安装部署 - 【SkywenCode】技术团队基...

在2016年-2019年,SkywenCode技术团队使用码云Gitee 作为线上代码库管理,基于敏捷开发和持续构建的思路,我们整体基础建设以Drone / Jenkins Docker 的方式构建和部署整个基础建设体系。在接下来的时间里,SkywenCode技术团队基础建…

通信系统的主要性能指标

性能指标的作用就是用来衡量这个系统是否是一个好的系统。 总体的性能指标包括:有效性,可靠性,适用性,经济性,标准性,可维护性等。 其中关键的指标主要是有效性和可靠性。 一. 有效性 (1&…