我已经编写了一段代码,以我需要的格式读取和打印一组流量值。
基本上,所有数据都存储在一个1020行320列的矩阵中。它可以是一个更小的矩阵,也就是说,如果我没有太多的streamflow值,但它永远不会比它大。
每一行都是特定年份中的特定月份。1号线是1931年1月,1020线是2015年12月,从1日到第320号的每一列代表一个测量站(GS)。
我现在需要计算每个GS的整个时间序列中同一个月的平均值。为了消除对前面这句话的任何疑问,我将给你一个例子。
我需要整个时间线中GS #1的1月份的平均流量值,所以我需要将1931年1月+1932年1月+ Jan.1933+...+Jan.2015相加,然后除以年数,在本例中,(2015-1931+1)=85年。所有这些都是为了相同的GS,在这种情况下,#1。
我不能混合GSs,所以代码必须为每个GS重复这个操作,显然,每个月都是如此。最后,我将得到每个GS从1931年到2015年每个月的平均流量值。
我是这么想的。我可以将其存储为列向量,并按行存储相同GS的流量值;因此,我将有一个(12x1)向量,其中每行都是一个流量值,其中行1是1月份的平均流量值,第12行是12月份的平均流量值。然而,这必须为每个GS完成,因此,到它结束时,我将有320个列向量(12x1)。例如,对于GS1,它看起来就像这样。
avgGS1 : avgJan
avgFeb
avgMar
...
avgDec然后我想我也可以将这个信息存储在维度等于(1x320)的线向量中。在这种情况下,我会有一个向量来存储1月份的所有平均流量值,另一个是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-,avgqjan是包含每个GS的320个平均Q值的向量。在我的do循环中,我的增量是12。这是因为如果我知道第一行是Jan,如果我在它上面加上12,我总是会得到另一个一月份的流量值。
我紧随其后
i=0
sumqfev=0
do i=2,1020, 12
sumqfeb = sumqfeb + (q(i,gsnumber), gsnumber=1,320)
enddo
avgqfeb= sumqfeb/(numbofyears)在上面的例子中,我执行了与一月份相同的计算,但是,我的i变量从2开始。如果我知道我的第二行是Feb,那么我从这一行得到的每一行都是Feb。只要我在do-loop中不断添加12。
我每个月都重复这个过程,但看起来并不理想。我正在寻找执行这些计算并更快地存储这些值的方法。
我会在这里发布我的代码,但它不是我唯一的作者,因此,我不能分享它的丰富性。
如果你知道一个解决方案,或者有一个可能可行的想法,请继续分享。非常感谢你的帮助!非常感谢。
发布于 2016-01-26 10:46:22
我将把它分解成一个更简单、更适用的问题。下面的程序计算一维数组的平均值。它使用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)我不确定我是否完全回答了你的问题,但我希望我提供了一些值得思考的东西。
https://stackoverflow.com/questions/35003186
复制相似问题