2013-11-22 33 views
0

我需要一些幫助來創建一個代碼來提取某些具有特定條件的行。我有一個叫做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代表365天爲每組LON /從Excel中緯度提取。但不是我想要的。我想要的是16矩陣(每組一個),可以說22行(1979,1980,1981,1982,1983 ... 1999,2000)和365或366行。爲了創建具有相同大小的矩陣,每個具有365行的向量的最終值可以爲零。

+0

「22行和365或366行」不可能用於矩陣,這總是nXm – Daniel

回答

0

我對理解你的問題有點困難。當所有事情都說完之後,我認爲你希望能夠找到特定年份的特定(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向量是布爾表達式,當lon/lat匹配時將爲true。 thisYear矢量具有一年中每天的指數,1979年1月1日是第一個日期。使用日期對thisLonthisLat向量進行索引,我們發現wind_speed對應於您關心的空間和時間中的那一點。你有個不同的號碼在windArray每個條目無關緊要的事實...

你如何使用它?當你想要位置12的平均風速爲5年時,你只需做

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

我希望這有助於!

0

您希望的矩陣是不可能的,因爲每一行都需要具有相同的大小。這是我將如何解決它:

%Function to shift indices, id(datenum(...)) returns the corresponding index. 
[email protected](x)(x-datenum(1979,1,1)+1) 
%Function to select a year: 
[email protected](x)([ix(datenum(x,1,1)):ix(datenum(x,12,31))]) 

有這兩個功能,你可以很容易地選擇你想要的數據。例如。

wind_speed_points(syear(1981),3) 

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