Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 用我的条件创建一个矩阵_Matlab_Matrix - Fatal编程技术网

Matlab 用我的条件创建一个矩阵

Matlab 用我的条件创建一个矩阵,matlab,matrix,Matlab,Matrix,我需要一些帮助来创建一个代码来提取某些特定条件下的行。我有一个3D矩阵(纬度、经度、时间(15000个值,每天1个值)),叫做风速。我也有一个Excel文件,有16个具体的纬度和经度,我需要专门研究。 我需要按年份计算风速,但我很难进行提取。 我想要的是16个(每一组lat/lon对应一个)新的2D矩阵,这些矩阵给了我365天或366天的时间,一行一天 我已经用以下内容指定了样品的第一天: N0=datenum(1979,1,1); 并使用以下工具从Excel文件中提取我的16点: [num,

我需要一些帮助来创建一个代码来提取某些特定条件下的行。我有一个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
到目前为止,一切顺利。我已经运行了这个程序,并在矩阵
风速\u点中找到了与特定年份对应的值

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行(19791980198119821983…19992000)和365或366行。若要创建具有相同大小的矩阵,则具有365行的每个向量的最终值可以为零。

不可能创建所需的矩阵,因为每行都需要具有相同的大小。这就是我解决问题的方法:

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

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

我在理解您的问题时有点困难。当所有这些都说了,做了,我想你希望能够找到一个特定的(1/16)纬度/经度对,在特定的年份的所有风速。您将获得16个位置,并且您知道15000个数据点中每个数据点的日期和位置

首先,数学似乎不正确。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
这是怎么回事?
thisLon
thisLat
向量是布尔表达式,当lon/lat匹配时为真。今年的
向量有一个一年中每一天的索引,1979年1月1日是第一天。将
thisLon
thisLat
向量与日期进行索引,我们发现
风速
仅对应于您关心的空间和时间点。在
windArray
中,每个条目的点数不同这一事实并不重要

你如何使用它?当你想要第5年位置12处的平均风速时,你只需要这样做

averageWindSpeed = mean(windArray{5, 12}(:));
我希望这有帮助

“22行和365或366行”不适用于矩阵,这始终是nXm