本文主要是介绍元胞数组,格式读取,时间序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
function [time_axis,on,temp,nan_index]=read_data(filename)
%Function name: read_data
%得到时间轴,向岸速度分量,温度,以及空缺值index
%input=
% filename
%output=
% timeseries arry, original onshoal speed arry, temperature array
%example:
%clear
%clc
%filename='1016brk011.asc';
%[timeseries, U, t]=read_data(filename);
%将资料和本程序所在文件夹设置为current文件夹后,指令窗输入help read_data可看到上述内容
fid=fopen(filename,'r'); %打开mooring文件
%按格式读取mooring资料,n遍,跳过开头十行
%C=textscan(fid,'%n %c %s %n %1n %2n %f %f %f %f %f',15853,'headerlines',10);
%按格式读取全部数据,跳过开头十行
C=textscan(fid,'%n %c %s %n %1n %2n %f %f %f %f %f','headerlines',10);
%读取mooring资料组成10*1的元胞数组
%数据格式:
% C1C2C3 C4C5C6 C7 C8 C9 C10 C11
%HHMM:SS DDMMYY DIR'N SPEED E/COMP N/COMP TEMP
% (deg) (cm/s) (cm/s) (cm/s) (deg C)
%1258: 0 9 292 331.48 28.27 -13.50 24.84 22.09
% C1C2 C3C4C5C6 C7 C8 C9 C10 C11
%定义各量
year=C{6}; %年
month=C{5}; %月
day=C{4}; %日
time=C{1}; %时刻
dir=C{7}; %流速方向,由北向顺时针旋转的角度
speed=C{8}; %流速总量
temp=C{11}; %温度
%读取时间得到时间轴,例如 (92+1900,2,3,2,23,0)年月日时分秒
%time=num2str(time,'%04d');将不足4位的整数前面补0,并转为字符串
min=mod(time,100);
hh=(time-min)/100;
time_axis=datenum(year+1900,month,day,hh,min,0);
%筛选NaN值并给出其位置
nan_index=find(speed==-8888.0);
speed(nan_index)=nan;
temp(nan_index)=nan;
%坐标轴顺时针转66度后,流速方向dir2(弧度)=dir-66
%向岸为on 沿岸为along
dir2=(dir-66)*pi/180;
on=speed.*sin(dir2);
al=speed.*cos(dir2);
fclose(fid);
return
——————————————————————————————————————
fid=fopen(filename,'r') fid为通道号,与fortran的unit类似
之后的textscan,fclose,frewind,都是打开通道号
r表示只读属性
C=textscan(fid,'format',N,'param',value) 将文件以format格式,参考param属性,读入C元胞数组,每个数代表一列数据,数据各有不同。类似fortran的那个自定义数据,加百分号表示数据的一部分
format=%flagNA %4s %7.2f %1c
%表示起始 ,flag可以为+ - 或0,N代表读取位数,A为数据属性,例如%7.2f,浮点数据,%4s 四位字,%1c,强制读取一位,包括空格。默认%之间由空格断开,如果定义了字符数,则把字符串读完,再以空格分隔。但是这个格式似乎不能像fortran那样将format单独拿出来
param
'delimiter',{'s','\'} 表示以s 和\这两个字符来分隔,空格不再作为间断符,但怎么让两者都起作用,我没搞明。
'headerlines',10 表示跳过开头10行,再开始读取。
textscan读取后,如果文件没有结束,也没有关闭,也没有frewind,那么下一次读取将接着来。
------------------------------------------------------------------------
脚本文件
clear
clc
%载入数据
filename='1016brk011.asc';
[time_axis,u,temp]=read_data(filename);
%选择起止时间,
%时间格式(1992,2,18)or(1992,2,18,12,58,0)
start=[1992,2,10];
terminate=[1992,2,12];
n1=find(time_axis==datenum(start));
n2=find(time_axis==datenum(terminate));
plot(time_axis(n1:n2),u(n1:n2));
hold on
plot(time_axis(n1:n2),temp(n1:n2));
datetick('x',6);
-------------------------------------------------------------------------
datestr,datenum,datevec,datetick
datestr为字符型‘2001-01-29,12:34:00’类似这样,还有其他很多格式
datevec为向量型 [2001, 1, 29, 12,34,0] [2001,1,29] 都可
两者可以互转,且都可以转为datenum,一个时间点对应一个数,
这三者都可以组成数组,代表一个时间序列
作图时只能以datenum序列为坐标
plot(x,y);
datetick('x',N); N对应坐标显示的格式,显示为datestr
这篇关于元胞数组,格式读取,时间序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!