用我的条件创建一个矩阵

时间:2013-11-22 01:43:52

标签: matlab matrix

我需要一些帮助来创建一个代码来提取具有特定条件的某些行。我有一个名为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行的矢量的最终值可以为零。

2 个答案:

答案 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

这是如何工作的? thisLonthisLat向量是布尔表达式,当lon / lat匹配时将为true。 thisYear向量具有一年中每一天的索引,1979年1月1日是第一个日期。使用日期为thisLonthisLat向量编制索引,我们发现wind_speed对应于您关心的空间和时间点。 windArray中每个条目的点数不同并不重要......

你如何使用它?如果您想要第12位的平均风速,那么第5年就可以了

averageWindSpeed = mean(windArray{5, 12}(:));

我希望这有帮助!