matlab

【随手记录,如侵即删】

保存数据

  • 获取当前路径:pwd
    save([pwd, '\dataname.mat'], 'dataname');
  • 需要注意的是,路径中的文件名(方括号中的那些路径和文件名,包括dataname.mat中的dataname)是不区分大小写的。这与matlab中变量名区分大小写的规定有所区别。
    连续执行下述两条命令后:
    save([pwd, '\ZDR.mat'], 'ZDR');
    save([pwd, '\Zdr.mat'], 'Zdr')
    结果就是最终只有一个文件,即ZDR.mat,但是这个文件里存的数据又是Zdr.mat的数据!!!

外部数据读取

基于matlab读取txt文本数据

矩阵维度

矩阵纬度的变换

  • 取矩阵的行列数
    [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存储

动态曲线图绘制及gif存储 参考代码1
参考代码2

通用

  • 同一区域叠加画图,用 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);

  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 无法解析名称

小技巧

matlab美化代码行
matlab代码折叠

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值