我需要一些帮助来创建一个代码来提取具有特定条件的某些行。我有一个名为wind_speed
的3D矩阵(纬度,经度,时间(15000个值,每天1个值))。我也有一个Excel文件,有16个特定的纬度和经度,我需要专门研究。
我需要按年计算风速,但我对提取有困难。
我想要的只是16(每组lat / lon一个)新的2D矩阵,它给我行365年或366天的行数,一天一行。
我已经用以下内容指定了样本的第一天:
N0=datenum(1979,1,1);
并从Excel文件中提取我的16个点:
[num,txt,raw] = xlsread('Coordinates.xlsx');
latPoint=squeeze(num(:,2));
lonPoint=squeeze(num(:,1));
for ii=1:16
ilon = find(longitude(:,1)==lonPoint(ii));
ilat = find(latitude(:,1)==latPoint(ii));
wind_speed_points(:,ii) = squeeze(wind_speed(ilon,ilat,:));
end
到目前为止,这么好。我已经运行了这个并努力在矩阵wind_speed_points
中找到与特定年份相对应的值
iyear=0;
for i=1:nt; %%nt=lenght(time)
year = str2double(datestr(N0+i-1,'yyyy'));
if(year == 1979)
iyear=iyear+1;
for ii=1:16
w_speed_new(iyear,ii) = squeeze(wind_speed_points(i,ii));
end
end
end
我将有一个矩阵365x16,表示从Excel中提取的每个lon / lat的365天。但这不是我想要的。我想要的只是16个矩阵(每组一个),比如22行(1979,1980,1981,1982,1983 ...... 1999,2000)和365或366行。要创建具有相同大小的矩阵,每个365行的矢量的最终值可以为零。
答案 0 :(得分:0)
您希望的矩阵是不可能的,因为每一行都需要具有相同的大小。这就是我要解决的问题:
%Function to shift indices, id(datenum(...)) returns the corresponding index.
ix=@(x)(x-datenum(1979,1,1)+1)
%Function to select a year:
syear=@(x)([ix(datenum(x,1,1)):ix(datenum(x,12,31))])
拥有这两项功能,您可以轻松选择所需的数据。 E.g。
wind_speed_points(syear(1981),3)
不知道这是否真的符合您的要求。
答案 1 :(得分:0)
我对理解你的问题有点困难。完成所有操作后,我想您希望能够找到特定年份的特定(1/16)纬度/经度对的所有风速。您将获得16个职位,并且您知道每个15,000个数据点的日期和位置。
首先,数学似乎没有加起来。 16个地点的15000个值将是不到3年的数据,但你似乎说你有从1979年到2000年的日期。所以我会猜测一点 - 而猜测是你没有拥有每年每个地点和每个地点的数据。
如果确实如此,那么最好的解决方案是在单元格数组中收集您的数据,其中包含一个位置索引和一年的一个索引 - 并且可变数量的条目对应于可用的数据。如果我对这个假设错了,那么cell2mat
将允许您将其转换为3D矩阵,或者如果您愿意,可以将16个二维矩阵转换为3D矩阵。
您使用的基本代码似乎非常接近。
windArray = cell(22, 16); % one entry per year, per location
year = 1979:2000;
for position = 1:16
thisLon = (longitude(:,1) == lonPoint(position);
thisLat = (latitude(:, 1) == latPoint(position);
for yi = 1:numel(year)
thisYear = (datenum(year, 1, 1):datenum(year, 12, 31)) - datenum(1979, 1, 1) + 1;
windArray{yi, position} = wind_speed(thisLon(thisYear) & thisLat(thisYear));
end
end
这是如何工作的? thisLon
和thisLat
向量是布尔表达式,当lon / lat匹配时将为true。 thisYear
向量具有一年中每一天的索引,1979年1月1日是第一个日期。使用日期为thisLon
和thisLat
向量编制索引,我们发现wind_speed
对应于您关心的空间和时间点。 windArray
中每个条目的点数不同并不重要......
你如何使用它?如果您想要第12位的平均风速,那么第5年就可以了
averageWindSpeed = mean(windArray{5, 12}(:));
我希望这有帮助!