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.这样我们就完成了对海浪数据的读取、预处理、绘图以及统计,并得到了重要的参数。
欢迎有想法的小伙伴们交流指正。