2016-01-25 71 views
0

我已經編寫了一個代碼,以我需要的格式讀取和打印一組streamflow值。矩陣內特定位置的計算

基本上所有的數據都是以1020行和320列存儲在一個矩陣中的。它可以是一個較小的矩陣,也就是說,如果我沒有那麼多的流量值,但它永遠不會比這更大。

每一行都是特定年份中的特定月份。 1號線是1931年1月,1020號線是2015年12月,從1號到320號的每一列代表一個測量站(GS)。

我現在需要計算每個GS在整個時間序列中同一個月的平均值。爲了清除對此前陳述的任何懷疑,我會給你一個例子。

我需要1月份的GS#1在整個時間軸上的平均流量值,所以我需要總結Jan.1931 + Jan.1932 + Jan.1933 + ... + Jan.2015,然後除以在這種情況下,(2015-1931 + 1)= 85年。所有這些對於同一個GS,在這個例子中是#1。

我不能混合GSs,所以代碼必須重複這個操作,每個GS,顯然,每個月。最後,我將爲每個GS獲得1931年至2015年每個月的平均流量值。

這是我的想法。我可以將其存儲爲一個列向量,並將相同GS的流向值存儲在行中;所以我會有一個(12x1)向量,其中每一行都是流量值,第一行是1月份的平均流量值,第12行是12月份的平均流量值。但是,這必須針對每個GS因此,我在它的最後有320個列向量(12x1)。例如,它看起來像是GS1。

avgGS1 : avgJan 
     avgFeb 
     avgMar 
      ... 
     avgDec 

然後我想我也可以將這些信息存儲在維度等於(1x320)的行向量中。在這種情況下,我將有一個矢量用於存儲Jan的所有平均流量值,另一個用於2月,另一個用於3月,直到12月的最後一個。

知道,我從矩陣讀取數據顯示排序是這樣的:

   GS1 GS2 GS3 GS4 G5 ... G320 
Jan.1931 
Feb.1931 
Marc.1931 
... 
Jan.1932 
Feb.1932 
... 
Dec.2015 

我存儲我的12個載體是這樣的:

   GS1 GS2 GS3 ... GS320 
avg.Jan  (a  b  c ... n) 
avg.Feb  (d  e  f .... m) 
... 
avg.Dec  (g  h  i ... o) 

的問題是,我可以沒有想到一種能夠自動完成的方法。我到任何做任何代碼,這個最接近的是:

real*4 i, q(1020,320), sumqjan(320), avgqjan 

i=0 
sumqjan=0 
do i=1,1020, 12 
    sumqjan = sumqjan + (q(i,gsnumber), gsnumber=1,320) 
enddo 

avgqjan= sumqjan/(numbofyears) 

我是從第一行到最後一行進入一個變量,sumqjan是所有河流流量值的總和 - 這裏所謂的Q-一月而avgqjan是包含每個單一GS的320個平均Q值的向量。在我的do循環中,我有12的增量。這是因爲如果我知道第一行是Jan,如果我添加12,那麼我總是會得到另一個1月流量值。

我接着

i=0 
sumqfev=0 
do i=2,1020, 12 
    sumqfeb = sumqfeb + (q(i,gsnumber), gsnumber=1,320) 
enddo 

avgqfeb= sumqfeb/(numbofyears) 

在上面這個例子中,我執行我做了一月相同的計算,但是,我的我變的開始。2.如果我知道我的下聯是二月,每行我會從2月份開始,只要我在do循環中加入12。

我重複這個過程每個月,但它看起來並不理想。我正在尋找方法來執行這些計算並更快地存儲這些值。

我會在這裏發佈我的代碼,但它不是我唯一的作者,因此我無法分享它的豐富。

如果您知道解決方案或有一個可行的想法,請繼續並分享它。我感謝幫助!非常感謝。

回答

0

我會將其分解爲一個更簡單適用的問題。下面的程序計算一維數組的平均值。它使用計數和邏輯掩碼來排除零的數字(如果這對你來說沒問題)。因此,這只是數組中非零組件的平均值,我認爲這就是你所追求的。

要升級我對問題的簡單回答,請考慮使用數組切片。使用這些你可以選擇你的數組,你有興趣的只有部分

program average 

integer :: array(10) = 0 

do i = 1,5 
    array(i) = 3 
end do 

write (*,*) 'count ', count(array /= 0) 
write (*,*) 'sum  ', sum(array) 
write (*,*) 'average ', sum(array)/count(array /= 0) 

end program 

輸出:

count    5 
sum    15 
average   3 

陣列切片僞代碼:

array(row_start:row_end:interval, column_start:column_end:interval) 

我不知道,如果我完全回答你的問題,但我希望我提供一些想法。

+0

非常感謝您的貢獻!我會盡力而爲, –