【随手记录,如侵即删】
保存数据
- 获取当前路径:pwd
save([pwd, '\dataname.mat'], 'dataname');
- 需要注意的是,路径中的文件名(方括号中的那些路径和文件名,包括dataname.mat中的dataname)是不区分大小写的。这与matlab中变量名区分大小写的规定有所区别。
连续执行下述两条命令后:
save([pwd, '\ZDR.mat'], 'ZDR');
save([pwd, '\Zdr.mat'], 'Zdr')
结果就是最终只有一个文件,即ZDR.mat,但是这个文件里存的数据又是Zdr.mat的数据!!!
外部数据读取
矩阵维度
矩阵纬度的变换
- 取矩阵的行列数
[N_R, N_theta] = size(Vr);
- meshgird:网格点采样
X,Y的维度有种交换的意思,但是如果是三维,依旧是X Y 交换,与Z无关。
>> x=zeros(3,1);y=zeros(4,1);temp1=meshgrid(x,y);size(temp1)
ans =
4 3
>> x=zeros(3,1);y=zeros(4,1);z=zeros(5,1);temp2=meshgrid(x,y,z);size(temp2)
ans =
4 3 5
- 数组串联
二维通常直接串,三维需要用到函数cat(),详见数组串联函数cat
三维串联示例:(以下两种相同)
>> a=zeros(41,41,20);b=zeros(41,41,1);c=cat(3,a,b);size(c)
ans =
41 41 21
>> a=zeros(41,41,20);b=zeros(41,41);c=cat(3,a,b);size(c)
ans =
41 41 21
矩阵纬度的限制
通过修改预设限制,解决部分“数组超过预设的最大数组大小”问题
数据类型转换
cell类转数组类:解决cell2mat报错‘要串联的数组不一致’问题
小数位格式调整
- 取整
向上取整:ceil;向0取整:fix;向下取整:floor;
四舍五入取整:round - 保留几位小数
roundn(data, -n):按四舍五入保留n位小数
基本数据处理函数
插值
- v1 = interp3(x0, y0, z0, v0, x1, y1, z1)
适用于三维函数插值,x0, y0, z0, v0对应样本坐标点和样本数据, x1, y1, z1对应需要插值的新坐标网格,要求这四组数据为同样大小的矩阵,其中,x0, y0, z0要求为meshgrid数据格式; - v1 = interpn(x0, y0, z0, v0, x1, y1, z1)
同上,适用于n元函数插值,要求这四组数据为同样大小的矩阵,其中,x0, y0, z0要求为ndgrid数据格式
注意:上述两种函数要求 x1, y1, z1为同样大小的矩阵,但不要求是否为meshgrid格式或ndgrid格式;meshgrid格式与ndgrid格式可分别由meshgrid()和ndgrid()函数生成,具体细节见此链接
针对输入样本点数据格式要求,处理雷达数据时可以:
1 均匀球坐标(对应非均匀直角坐标) 插值到 非均匀球坐标(对应均匀直角坐标)
2 均匀直角坐标(对应非均匀球坐标)插值到 非均匀直角坐标(对应均匀球坐标)
直角坐标与球坐标的相互转换:cart2sph(); sph2cart(). - ndgrid与meshgrid转换
错误使用 griddedInterpolant
数据为 MESHGRID 格式,需要使用 NDGRID 格式。
请按如下所示转换数据:
P = [2 1 3];
X = permute(X, P);
Y = permute(Y, P);
Z = permute(Z, P);
V = permute(V, P);
F = griddedInterpolant(X,Y,Z,V)
经纬度转xy
- [xEast,yNorth,zUp] = latlon2local(lat,lon,alt, [latOrigin,lonOrigin,altOrigin] )
gridient 基于矩阵数据求偏导数
gridient的维度设计本来与meshgrid格式类似,详见gridient官方解释,当数据为ndgrid时,代码设计如下:
x = -100:10:100; y = -90:10:90; z = -80:10:80;
[XX, YY, ZZ] = ndgrid(x, y, z);
a = 2*XX.^2;
[a_y, a_x, a_z] = gradient(a, squeeze(YY(1,:,1)),squeeze(XX(:,1,1)), squeeze(ZZ(1,1,:)) );
a_x_should = 4*XX;
[a_xy, a_xx, a_xz] = gradient(a_x, squeeze(YY(1,:,1)),squeeze(XX(:,1,1)), squeeze(ZZ(1,1,:)) );
a_xx_should = 4*ones(size(XX));
以上代码运行后,除了边缘数据以外,a_x=a_x_should(表示a对XX的一阶偏导数) ,a_xx=a_xx_should(表示a对XX的二阶偏导数) 。
边缘数据用的是前向/后向差分计算,中间的数据都用的中心差分。
其他
- find:找出符合条件的矩阵元素的线性索引(matlab中矩阵下标转线性下标按列索引)
使用格式:线性索引=find(条件)
示例:找出矩阵aa中大于2小于5的元素的线性索引
aa=[1,2,3;4,5,6];index=find(aa>2&aa<5)
index =
2
5
- sub2ind:已知矩阵中某元素的矩阵下标,找出其对应的线性索引
使用格式:线性索引=sub2ind(size(矩阵),[元素矩阵下标行值], [元素矩阵下标列值])函数具体介绍见此链接
示例:找出矩阵A中第1行1列和第2行2列的元素的线性索引及对应元素值:
>> A=[1,2,3;4,5,6]
A =
1 2 3
4 5 6
>> index=sub2ind(size(A),[1 2], [1 2])
index =
1 4
>> value=A(sub2ind(size(A),[1 2], [1 2]))
value =
1 5
- ind2sub:sub2ind的反函数,已知矩阵中某元素的线性索引,找出其对应的矩阵下标
使用格式:[行下标 列下标]=ind2sub(size(矩阵), [线性索引1 线性索引2 …])
示例:找出矩阵A中线性索引为4和6的元素的矩阵下标:
A =
1 2 3
4 5 6
>> [row column]=ind2sub(size(A), [4 6])
row =
2 2
column =
2 3
- histcounts:
使用格式:计数结果=histcounts(数据, 边界), 边界取等问题见此链接
示例:计算[1 2 3 4 2 3 4 3 4 4]中,在“1~2”、“2-3”…“4-5”之间的数据个数
aa=histcounts([1 2 3 4 2 3 4 3 4 4],1:5)
aa =
1 2 3 4
画图
矢量箭头图
- 二维矢量
q = quiver(squeeze(XX(:,:, z_fig)), squeeze(YY(:,:, z_fig)),squeeze(U1(:,:,z_fig)), squeeze(V1(:,:,z_fig)));
q.Color ='black';%控制箭头颜色
- 三维矢量
quiver3()
伪彩图
h = pcolor(squeeze(XX(:,:, z_fig)), squeeze(YY(:,:, z_fig)),squeeze(data(:,:,z_fig)));
set(h, 'linestyle', 'none');%去掉网格线
cb = colorbar('southoutside');%控制颜色栏位置
cb.Label.String = '数据大小';%颜色栏的文字描述
设置颜色
设置colormap强调colorbar的0值位置,其中setPivot函数需要从这个网址保存到本地路径,然后使用:
pcolor(squeeze(X_RHIs(:,n_theta, :)), squeeze(Z_RHIs(:,n_theta, :)),squeeze(Vr_RHIs(:,n_theta, :))); hold on;
colormap([pink;flipud(bone)]);
% 调整颜色图中点位置
setPivot(0);
散点图
scatter(x, y, 'filled');#'filled'设置散点为实心状态,默认空心
set(gca, 'FontSize',12);#设置刻度字体大小
text(x, y, '添加需要对相应散点标注的文字', 'fontsize',12);#对散点做标注
动态曲线图绘制及gif存储
通用
- 同一区域叠加画图,用 hold on
如,先画一层伪彩图,再画一层矢量图
h = pcolor()...;hold on;
q = quiver()...
- 文本注释中显示下划线
title(['titile1_title2','title3'],'interpreter', 'none');
如果不用’interpreter’, ‘none’,那么处理时,默认文本注释中下划线为下标标志。
- 同一画布分区画子图
figure;
subplot(121);plot();
subplot(122);plot();
subplot的前两个数表示把画布分为几行几列的小区域,最后一个数表示当前画第几个子图,可以用逗号隔开表示为subplot(1,2,1);
- 子图需共用颜色栏
figure;
tiledlayout(1,2);
nexttile
h1 = pcolor(...)...
nexttile
h2 = pcolor(...)...
cb = colorbar;%两个pcolor共用一个colorbar,实际上显示的colorbar对应最后一个pcolor的数据
cb.Layout.Tile = 'south';%控制颜色栏位置
由于画公用颜色栏时,实际上colorbar对应最后一个pcolor的数据,所以如果几个伪彩子图数据相差很大的话,前几个图的颜色可能与颜色栏并不能对应上。。。
可以通过限制各图的显示范围来实现统一?caxis([min, max])
调用python函数
Matlab调用Python函数
Matlab调用Python 无法解析名称