我编写了一个代码,以我需要的格式读取和打印一组流量值。
基本上所有数据都存储在一个包含1020行和320列的矩阵中。它可以是一个较小的矩阵,即,如果我没有那么多的流量值,但它永远不会大于那个。
每一行都是特定年份的特定月份。第1行是1931年1月,第1020行是2015年12月,每一列,从第1到第320,代表一个测量站(GS)。
我现在需要计算每个GS的整个时间序列中同月的平均值。为了清除对此前陈述的任何疑问,我将举一个例子。
我需要整个时间轴上一月份的GS#1的平均流量值,所以我需要将Jan.1931 + Jan.1932 + Jan.1933 + ... + + 2015年1月的总和除以在这种情况下,年数(2015-1931 + 1)= 85年。所有这些都适用于相同的GS,在这种情况下,#1。
我无法混合GS,因此代码必须为每个GS重复此操作,显然,每个月都要重复此操作。最后,我将获得每个GS从1931年到2015年的每个月的平均流量值。
这就是我的想法。我可以将其存储为列向量并存储行中相同GS的流量值;所以我有一个(12x1)向量,其中每一行都是一个流量值,第1行是Jan的平均流量值,第12行是Dec的平均流量值。但是,这必须为每个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)
i是从第一行到最后一行的变量,sumqjan是所有流量值的总和 - 这里称为q-表示1月,而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)
在上面这个例子中,我正在执行与1月份相同的计算,但是,我的i变量从2开始。如果我知道我的第二行是2月,那么我将从这一行获得的每一行都将是2月。只要我继续在do-loop中添加12。
我每个月都会重复这个过程,但看起来并不理想。我正在寻找方法来执行这些计算并更快地存储这些值。
我会在这里发布我的代码,但这不是我唯一的作者,因此,我无法在其中充分分享。
如果您知道某个解决方案或想法可能有效,请继续分享。我很感激帮助!非常感谢。
答案 0 :(得分:0)
我会将其分解为更简单,适用的问题。以下程序计算1D阵列的平均值。它使用count和逻辑掩码来排除零的数字(如果这对你没问题)。因此,这是数组中非零组件的平均值,我认为这就是你所追求的。
要升级我对问题的简单回答,请考虑使用数组切片。使用那些,您只能选择您感兴趣的阵列部分。
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)
我不确定我是否完全回答了你的问题,但我希望我能提供一些思考的食物。