【问题标题】:create a matrix with my conditions用我的条件创建一个矩阵
【发布时间】:2013-11-22 01:43:52
【问题描述】:

我需要一些帮助来创建一个代码来提取具有特定条件的一些行。我有一个名为 wind_speed 的 3D 矩阵(纬度、经度、时间(15000 个值,每天 1 个值))。我也有一个 Excel 文件,其中包含我需要专门研究的 16 个特定纬度和经度。 我需要按年计算风速,但我很难提取。 我想要的只是 16 个(每组纬度/经度一个)新的 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 中提取的每组经度/纬度的 365 天。但这不是我想要的。我想要的只是 16 个矩阵(每组一个),比​​如说 22 行(1979,1980,1981,1982,1983...1999,2000)和 365 或 366 行。要创建一个大小相同的矩阵,每个 365 行的向量的最终值可能为零。

【问题讨论】:

  • "22 行和 365 或 366 行"不能用于矩阵,这总是 nXm

标签: matlab matrix


【解决方案1】:

我有点难以理解您的问题。综上所述,我认为您希望能够找到特定年份的特定(16 分之一)纬度/经度对的所有风速。您获得了 16 个位置,并且您知道 15,000 个数据点中的每一个的日期和位置。

首先,数学似乎没有加起来。 16 个位置的 15000 个值将略少于 3 年的数据价值,但您似乎说您的日期是从 1979 年到 2000 年。所以我要猜测一下 - 猜测是你没有拥有每年每一天和每个地点的数据。

如果这是真的,那么最好的解决方案是将您的数据收集在一个元胞数组中,其中一个索引用于位置,一个索引用于年份 - 并且对应于的条目数量可变可用的数据。如果我对这个假设有误,那么 cell2mat 将允许您将其转换为 3D 矩阵,或者如果您愿意,可以转换为 16 个 2D 矩阵)。 您使用的基本代码似乎非常接近。

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 向量是布尔表达式,当经度/纬度匹配时为真。 thisYear 向量具有一年中每一天的索引,其中 1979 年 1 月 1 日是第一个日期。用日期索引thisLonthisLat 向量,我们发现wind_speed 对应于您关心的空间和时间点。 windArray 中的每个条目都有不同的分数这一事实并不重要……

你如何使用它?如果您想要位置 12 的平均风速,则为第 5 年,您只需这样做

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

我希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您希望的矩阵是不可能的,因为每一行都需要具有相同的大小。这就是我将如何解决它:

    %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))])
    

    拥有这两个功能,您可以轻松选择您想要的数据。例如

    wind_speed_points(syear(1981),3)
    

    不知道这是否真的符合你的要求。

    【讨论】:

      猜你喜欢
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多