获取海浪数据并统计海浪变化规律

​​​​​​​

1. 从国家海洋科学数据中心网站下载目标海域的原始数据。http://mds.nmdis.org.cn/pages/dataViewDetail.html?dataSetId=6 

2.使用matlab代码读取txt文件,并进行预处理。

close all;
clear all;
clc;
% 寻找文件夹下的文件所有格式为'.txt',文件信息存放在结构体WaveFileLists中,然后对WaveFileLists循环
WaveFileLists=dir(fullfile('/Users/Wave','*.txt'));
% 读取循环变量值
N=length(WaveFileLists); %使用'length()'函数读取结构体长度
% 编写循环体主程序
MS1=[];MS2=[];MS3=[];MS4=[];MS5=[];MS6=[];
MS7=[];MS8=[];MS9=[];MS10=[];MS11=[];MS12=[];
HeadM = [];
l=[];
d=0;
for i=1:N
    strWaveFileName=WaveFileLists(i).name;
    fid = fopen(strWaveFileName,'rt');
    lines = 0; 
    while ~feof(fid)   % while循环表示文件指针没到达末尾,则继续
        lines = lines +1; 
        d=d+1;   % 总行数
        % 每次读取一行, str是字符串格式
        str = fgetl(fid);   
        % 以 '' 作为分割数据的字符,结果为cell数组
        s=split(str,'');        
        %取数组中第一个元素s{...},先转换成字符串char再转换成数字str2num
        wav1 = str2num(char(s{18}));  %sea state 0-9 Grade
        wav2 = str2num(char(s{22}));  %wave direction degree
        wav3 = str2num(char(s{23}));
        wav4 = str2num(char(s{24}));
        wav5 = str2num(char(s{26}));  %swell direction degree
        wav6 = str2num(char(s{27}));
        wav7 = str2num(char(s{28}));
        wav8 = str2num(char(s{30}));  %Max wave height **.* m 
        wav9 = str2num(char(s{31}));
        wav10 = str2num(char(s{32}));    
        wav11 = str2num(char(s{45}));  %one-tenth max wave height **.* m 
        wav12 = str2num(char(s{46}));
        wav13 = str2num(char(s{47}));  
        wav14 = str2num(char(s{79}));  %Period **.* s
        wav15 = str2num(char(s{80}));
        wav16 = str2num(char(s{81})); 
        if isempty(wav1)==1
           wav1=0;
        end
        if isempty(wav2)==1
           wav2=0;
        end
        if isempty(wav3)==1
           wav3=0;
        end
        if isempty(wav4)==1
           wav4=0;
        end
        if isempty(wav5)==1
           wav5=0;
        end
        if isempty(wav6)==1
           wav6=0;
        end
        if isempty(wav7)==1
           wav7=0;
        end
        if isempty(wav8)==1
           wav8=0;
        end
        if isempty(wav9)==1
           wav9=0;
        end
        if isempty(wav10)==1
           wav10=0;
        end
        if isempty(wav11)==1
           wav11=0;
        end
        if isempty(wav12)==1
           wav12=0;
        end
        if isempty(wav13)==1
           wav13=0;
        end
        if isempty(wav14)==1
           wav14=0;
        end
        if isempty(wav15)==1
           wav15=0;
        end
        if isempty(wav16)==1
           wav16=0;
        end
        if lines==1
            wv1=str2num(char(s{26}));
            wv2=str2num(char(s{33}));
            if (wv1~=1||wv2~=2)
                break %跳出最近的while循环
            end
            HeadM=[HeadM s];
            wav1=[];
            wav2=[];
            wav3=[];
            wav4=[];
            wav5=[];
            wav6=[];
            wav7=[];
            wav8=[];
            wav9=[];
            wav10=[];
            wav11=[];
            wav12=[];
            wav13=[];
            wav14=[];
            wav15=[];
            wav16=[];
        end
        switch mod(i,12) %将所有数据按照每年的月份分类
            case 1
                MS1=[MS1;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16]; 
            case 2
                MS2=[MS2;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16];
            case 3
                MS3=[MS3;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16]; 
            case 4
                MS4=[MS4;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16];
            case 5
                MS5=[MS5;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16]; 
            case 6
                MS6=[MS6;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16];
            case 7
                MS7=[MS7;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16]; 
            case 8
                MS8=[MS8;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16];
            case 9
                MS9=[MS9;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16]; 
            case 10
                MS10=[MS10;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16];
            case 11
                MS11=[MS11;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16]; 
            case 0
                MS12=[MS12;wav1 wav2 wav3 wav4 wav5 wav6 wav7 wav8 wav9 wav10 wav11 wav12 wav13 wav14 wav15 wav16];
        end
    end
    fclose(fid);
    l=[l,lines];
end
HeadM=HeadM';% 矩阵输出
MS=[MS1;MS2;MS3;MS4;MS5;MS6;MS7;MS8;MS9;MS10;MS11;MS12];
ll=[size(MS1,1) size(MS2,1) size(MS3,1) size(MS4,1) size(MS5,1) size(MS6,1) size(MS7,1) size(MS8,1) size(MS9,1) size(MS10,1) size(MS11,1) size(MS12,1)];
Ml=[];
for j=1:size(ll,2)
    Ml=[Ml sum(ll(1:j))];
end

3.对预处理后的数据进行可视化绘图处理,观察数据的特点与规律。

%sea state 0-9 Grade 1
%wave direction degree 2 3 4
%swell direction degree 5 6 7
%Max wave height **.* m 8 9 10
%one-tenth max wave height **.* m  11 12 13
%Period **.* s 14 15 16
MM1=[];
MM2=[];
MM3=[];
for k = 0:11
    if k==0
                  SeaState = MS(1:Ml(1),1);
             WaveDirection = MS(1:Ml(1),2).*100+MS(1:Ml(1),3).*10+MS(1:Ml(1),4).*1;
                       WaveDirection(WaveDirection>996) = []; % delete number that lager than 996
            SwellDirection = MS(1:Ml(1),5).*100+MS(1:Ml(1),6).*10+MS(1:Ml(1),7).*1;
                     SwellDirection(SwellDirection>996) = [];
             MaxWaveHeight = MS(1:Ml(1),8).*10+ MS(1:Ml(1),9).*1+ MS(1:Ml(1),10).*0.1;
                      MaxWaveHeight(MaxWaveHeight>99.6) = [];
    OneTenthMaxWaveHeight = MS(1:Ml(1),11).*10+MS(1:Ml(1),12).*1+MS(1:Ml(1),13).*0.1;
    OneTenthMaxWaveHeight(OneTenthMaxWaveHeight>99.6) = [];
                    Period = MS(1:Ml(1),14).*10+MS(1:Ml(1),15).*1+MS(1:Ml(1),16).*0.1;
                                    Period(Period>99.6) = [];
    else
                  SeaState = MS(Ml(k)+1:Ml(k+1),1);
             WaveDirection = MS(Ml(k)+1:Ml(k+1),2).*100+MS(Ml(k)+1:Ml(k+1),3).*10+MS(Ml(k)+1:Ml(k+1),4).*1;
                       WaveDirection(WaveDirection>996) = []; % delete number that lager than 996
            SwellDirection = MS(Ml(k)+1:Ml(k+1),5).*100+MS(Ml(k)+1:Ml(k+1),6).*10+MS(Ml(k)+1:Ml(k+1),7).*1;
                     SwellDirection(SwellDirection>996) = [];
             MaxWaveHeight = MS(Ml(k)+1:Ml(k+1),8).*10+ MS(Ml(k)+1:Ml(k+1),9).*1+ MS(Ml(k)+1:Ml(k+1),10).*0.1;
                      MaxWaveHeight(MaxWaveHeight>99.6) = [];
    OneTenthMaxWaveHeight = MS(Ml(k)+1:Ml(k+1),11).*10+MS(Ml(k)+1:Ml(k+1),12).*1+MS(Ml(k)+1:Ml(k+1),13).*0.1;
    OneTenthMaxWaveHeight(OneTenthMaxWaveHeight>99.6) = [];
                    Period = MS(Ml(k)+1:Ml(k+1),14).*10+MS(Ml(k)+1:Ml(k+1),15).*1+MS(Ml(k)+1:Ml(k+1),16).*0.1;
                                 Period(Period>99.6) = [];
    end 
    WaveDirection=WaveDirection.*3.1416/180;
    SwellDirection=SwellDirection.*3.1416/180;    
    w1=max(SeaState); % max value
    w2=max(WaveDirection);
    w3=max(SwellDirection);
    w4=max(MaxWaveHeight);
    w5=max(OneTenthMaxWaveHeight);
    w6=max(Period);
    w11=mode(SeaState); %mode value
    w12=mode(WaveDirection);
    w13=mode(SwellDirection);
    w14=mode(MaxWaveHeight);
    w15=mode(OneTenthMaxWaveHeight);
    w16=mode(Period);
    w21=mean(SeaState); %mean value
    w22=mean(WaveDirection);
    w23=mean(SwellDirection);
    w24=mean(MaxWaveHeight);
    w25=mean(OneTenthMaxWaveHeight);
    w26=mean(Period);
    % every month max mode mean value
    MM1 = [MM1;w1 w6;w11 w16;w21 w26];
    MM2 = [MM2;w4 w5;w14 w15;w24 w25];
    MM3 = [MM3;w2 w3;w12 w13;w22 w23];
end

m11=MM1(1:3:36,:);
m12=MM2(1:3:36,:);
m13=MM3(1:3:36,:);

m21=MM1(2:3:36,:);
m22=MM2(2:3:36,:);
m23=MM3(2:3:36,:);

m31=MM1(3:3:36,:);
m32=MM2(3:3:36,:);
m33=MM3(3:3:36,:);
% characteristic= SeaState WaveDirection SwellDirection 
% MaxWaveHeight OneTenthMaxWaveHeight  Period

figure()
subplot(331)
bar3(m11)
view(35,30)
xlabel('SS Pd');ylabel('month');zlabel('value');
title("SeaState Period","max","FontSize",8)
subplot(332)
bar3(m12)
view(35,30)
xlabel('MH OH');ylabel('month');zlabel('m');
title("MaxWaveHeight OneTenthMaxWaveHeight","max","FontSize",8)
subplot(333)
bar3(m13)
view(35,30)
xlabel('WD SD');ylabel('month');zlabel('rad');
title("WaveDirection SwellDirection","max","FontSize",8)
subplot(334)
bar3(m21)
view(35,30)
xlabel('SS Pd');ylabel('month');zlabel('value');
title("SeaState Period","mode","FontSize",8)
subplot(335)
bar3(m22)
view(35,30)
xlabel('MH OH');ylabel('month');zlabel('m');
title("MaxWaveHeight OneTenthMaxWaveHeight","mode","FontSize",8)
subplot(336)
bar3(m23)
view(35,30)
xlabel('WD SD');ylabel('month');zlabel('rad');
title("WaveDirection SwellDirection","mode","FontSize",8)
subplot(337)
bar3(m31)
view(35,30)
xlabel('SS Pd');ylabel('month');zlabel('value');
title("SeaState Period","mean","FontSize",8)
subplot(338)
bar3(m32)
view(35,30)
xlabel('MH OH');ylabel('month');zlabel('m');
title("MaxWaveHeight OneTenthMaxWaveHeight","mean","FontSize",8)
subplot(339)
bar3(m33)
view(35,30)
xlabel('WD SD');ylabel('month');zlabel('rad');
title("WaveDirection SwellDirection","mean","FontSize",8)

4. 也可以对预处理后的数据做统计分析,判断数据可能满足的分布情况

SS=MS(:,1); %SeaState
WD=MS(:,2).*100+MS(:,3).*10+MS(:,4).*1;%WaveDirection
SD=MS(:,5).*100+MS(:,6).*10+MS(:,7).*1;%SwellDirection
MH=MS(:,8).*10+ MS(:,9).*1+ MS(:,10).*0.1;%MaxWaveHeight
OH=MS(:,11).*10+MS(:,12).*1+MS(:,13).*0.1;%OneTenthMaxWaveHeight
Pd=MS(:,14).*10+MS(:,15).*1+MS(:,16).*0.1;%Period
WD(WD>996) = [];
SD(SD>996) = [];
MH(MH>99.6) = [];
OH(OH>99.6) = [];
Pd(Pd>99.6) = [];
WD=WD.*3.1416/180;
SD=SD.*3.1416/180;

% WD=roundn(WD,-1);
% SD=roundn(SD,-1);
% MH=roundn(MH,-1);
% OH=roundn(OH,-1);
% Pd=roundn(Pd,-1);

SS1 = tabulate(SS);%统计数组(x)中元素出现的频率
SS2 = array2table(SS1, 'VariableNames', ...
    {'Value','Count','Percent'});%将数组转化为表
Pd1 = tabulate(Pd);%统计数组(x)中元素出现的频率
Pd2 = array2table(Pd1, 'VariableNames', ...
    {'Value','Count','Percent'});%将数组转化为表
MH1 = tabulate(MH);%统计数组(x)中元素出现的频率
MH2 = array2table(MH1, 'VariableNames', ...
    {'Value','Count','Percent'});%将数组转化为表
WD1 = tabulate(WD);%统计数组(x)中元素出现的频率
WD2 = array2table(WD1, 'VariableNames', ...
    {'Value','Count','Percent'});%将数组转化为表
SD1 = tabulate(SD);%统计数组(x)中元素出现的频率
SD2 = array2table(SD1, 'VariableNames', ...
    {'Value','Count','Percent'});%将数组转化为表
OH1 = tabulate(OH);%统计数组(x)中元素出现的频率
OH2 = array2table(OH1, 'VariableNames', ...
    {'Value','Count','Percent'});%将数组转化为表

figure()
% subplot(231)
% bar(SS2.Value,SS2.Count);
% xlabel("grade");
% ylabel("Count")
% title("SeaState")
% 
% subplot(232)
% bar(Pd2.Value,Pd2.Count);
% xlabel("s");
% ylabel("Count")
% title("Period")

% subplot(233)
subplot (121)
bar(MH2.Value,MH2.Count);
xlabel("Value (m)");
ylabel("Count")
title("Max Wave Height")

% subplot(234)
% bar(OH2.Value,OH2.Count);
% xlabel("m");
% ylabel("Count")
% title("OneTenthMaxWaveHeight")
% 
% subplot(235)
% bar(WD2.Value,WD2.Count);
% xlabel("rad");
% ylabel("Count")
% title("WaveDirection")
% 
% subplot(236)
% bar(SD2.Value,SD2.Count);
% xlabel("rad");
% ylabel("Count")
% title("SwellDirection")

% figure()
subplot(122)
[f,xi]=ksdensity(MH);
plot(xi,f,'r*');
hold on
[miu,sigma]= normfit(MH,0.05)
% [mu,sigma,muci,sigmaci]= normfit(data,a);
% data: 原数据
% a :置信度
% mu: 均值
% sigma: 标准差
% muci:1-a 区间内的均值
% sigmaci:1-a 区间内的标准差
TJ=ones(100,1);
LTJ=length(TJ);
zt0=normrnd(miu,sigma,1,LTJ);
[f1,xi1]=ksdensity(zt0);
plot(xi1,f1,'b-o');
hold off
xlabel('Value (m)')
ylabel('Density')
legend('Raw','Fit')
title("Raw data & Probability density function")
txt = { ['Miu_{MH} = ' num2str(miu)]; ['Sigma_{MH} = ' num2str(sigma)] };
text(xi(50),f(50)+0.9,txt)

5.根据数据的规律特点,我们可以将感兴趣的重要数据保存下来。

%需要保存的矩阵
data1=[m11,m12,m13,m21,m22,m23,m31,m32,m33];
%行名称
row={'m1';'m2';'m3';'m4';'m5';'m6';'m7';'m8';'m9';'m10';'m11';'m12'}; 
%列名称
col={'data1','maxSS','maxPd','maxMH','maxOH','maxWD','maxSD','modeSS','modePd','modeMH','modeOH','modeWD','modeSD','meanSS','meanPd','meanMH','meanOH','meanWD','meanSD'}; 
%生成表格,按列生成
result=table(row,data1(:,1),data1(:,2),data1(:,3),data1(:,4),data1(:,5),data1(:,6),data1(:,7),data1(:,8),data1(:,9),data1(:,10),data1(:,11),data1(:,12),data1(:,13),data1(:,14),data1(:,15),data1(:,16),data1(:,17),data1(:,18),'VariableNames',col);
%保存表格
writetable(result, 'data1.csv');

% data2=[SS2.Value,SS2.Count,Pd2.Value,Pd2.Count,MH2.Value,MH2.Count,OH2.Value,OH2.Count,WD2.Value,WD2.Count,SD2.Value,SD2.Count];
LSS=length(SS2.Value);
LPd=length(Pd2.Value);
LMH=length(MH2.Value);
LOH=length(OH2.Value);
LWD=length(WD2.Value);
LSD=length(SD2.Value);
Lmax=max([LSS,LPd,LMH,LOH,LWD,LSD]);
SS3=[[SS2.Value;zeros(Lmax-LSS,1)],[SS2.Count;zeros(Lmax-LSS,1)]];
Pd3=[[Pd2.Value;zeros(Lmax-LPd,1)],[Pd2.Count;zeros(Lmax-LPd,1)]];
MH3=[[MH2.Value;zeros(Lmax-LMH,1)],[MH2.Count;zeros(Lmax-LMH,1)]];
OH3=[[OH2.Value;zeros(Lmax-LOH,1)],[OH2.Count;zeros(Lmax-LOH,1)]];
WD3=[[WD2.Value;zeros(Lmax-LWD,1)],[WD2.Count;zeros(Lmax-LWD,1)]];
SD3=[[SD2.Value;zeros(Lmax-LSD,1)],[SD2.Count;zeros(Lmax-LSD,1)]];

data2=[SS3,Pd3,MH3,OH3,WD3,SD3];
%行名称
row2={'1';'2';'3';'4';'5';'6';'7';'8';'9';'10';'11';'12';'13';'14';'15';'16';'17';'18';'19';'20';'21';'22';'23';'24';'25';'26';'27';'28';'29';'30';'31';'32';'33';'34';'35';'36';'37';'38';'39';'40';'41';'42';'43';'44';'45';'46';'47';'48';'49';'50';'51';'52';'53';'54';'55';'56';'57';'58';'59';'60'};
%列名称
col2={'data2','SSValue','SSCount','PdValue','PdCount','MHValue','MHCount','OHValue','OHCount','WDValue','WdCount','SDValue','SDCount'}; 
%生成表格,按列生成
result2=table(row2,data2(:,1),data2(:,2),data2(:,3),data2(:,4),data2(:,5),data2(:,6),data2(:,7),data2(:,8),data2(:,9),data2(:,10),data2(:,11),data2(:,12),'VariableNames',col2);
% %保存表格
writetable(result2, 'data2.csv');

6.这样我们就完成了对海浪数据的读取、预处理、绘图以及统计,并得到了重要的参数。

欢迎有想法的小伙伴们交流指正。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值