Matrix 矩阵中具有特定位置的计算

Matrix 矩阵中具有特定位置的计算,matrix,vector,fortran,fortran77,Matrix,Vector,Fortran,Fortran77,我已经编写了一段代码,可以按照我需要的格式读取和打印一组streamflow值 基本上,所有数据都存储在一个矩阵中,该矩阵包含1020行和320列。它可以是一个更小的矩阵,也就是说,如果我没有这么多的流量值,但它永远不会比这个大 每一行都是特定年份中的特定月份。1号线为1931年1月,1020号线为2015年12月,从第1列到第320列的每一列代表一个计量站(GS) 我现在需要计算每个GS在整个时间序列中同一个月的平均值。为了澄清对前面这句话的任何疑问,我将给你举个例子 我需要在我的整个时间线内

我已经编写了一段代码,可以按照我需要的格式读取和打印一组streamflow值

基本上,所有数据都存储在一个矩阵中,该矩阵包含1020行和320列。它可以是一个更小的矩阵,也就是说,如果我没有这么多的流量值,但它永远不会比这个大

每一行都是特定年份中的特定月份。1号线为1931年1月,1020号线为2015年12月,从第1列到第320列的每一列代表一个计量站(GS)

我现在需要计算每个GS在整个时间序列中同一个月的平均值。为了澄清对前面这句话的任何疑问,我将给你举个例子

我需要在我的整个时间线内1月份GS#1的平均流量值,因此我需要将1931年1月+1932年1月+1933年1月+2015年1月相加,然后除以年数,在这种情况下,(2015-1931+1)=85年。所有这些都是为了相同的GS,在本例中为#1

我不能混合GSs,因此代码必须对每个GS重复此操作,显然,每个月都要重复此操作。最后,我将得到从1931年到2015年每个月每个GS的平均流量值

我是这么想的。我可以将其存储为列向量,并在行中存储相同GS的流量值;所以我有一个(12x1)向量,其中每一行是一个流量值,第1行是一月的平均流量值,第12行是十二月的平均流量值。然而,这必须对每一个GS进行,因此,在它的末尾,我有320个列向量(12x1)。举个例子,GS1就是这样

avgGS1 : avgJan
         avgFeb
         avgMar
          ...
         avgDec
然后我想我也可以将这些信息存储在维等于(1x320)的线向量中。在这种情况下,我会有一个向量来存储一月的所有平均流量值,另一个用于二月,另一个用于三月,直到最后一个用于十二月

知道从中读取数据的矩阵是这样显示的:

             GS1   GS2   GS3   GS4   G5 ... G320
Jan.1931
Feb.1931
Marc.1931
...
Jan.1932
Feb.1932
...
Dec.2015
             GS1    GS2    GS3  ... GS320
avg.Jan     ( a      b      c   ...  n )
avg.Feb     ( d      e      f   .... m)
...
avg.Dec     (g       h      i  ...   o)
我会像这样存储我的12个向量:

             GS1   GS2   GS3   GS4   G5 ... G320
Jan.1931
Feb.1931
Marc.1931
...
Jan.1932
Feb.1932
...
Dec.2015
             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是1月份所有流量值的总和,这里称为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)
在上面的这个例子中,我正在执行与1月份相同的计算,但是,我的I变量从2开始。若我知道我的第二行是2月,我从这一行得到的每一行都将是2月。只要我继续在do循环中添加12

我每个月都重复这个过程,但看起来并不理想。我正在寻找执行这些计算并更快存储这些值的方法

我想在这里发布我的代码,但它不是我唯一的作者,因此,我不能充分分享它


如果你知道一个解决方案或有一个可能奏效的想法,请继续分享。我感谢你的帮助!非常感谢

我将把它分解为一个更简单、适用的问题。下面的程序计算1D阵列的平均值。它使用计数和逻辑掩码来排除零的数字(如果这对您合适的话)。因此,这是数组中非零分量的平均值,我想这就是你想要的

<> P>升级我对你问题的简单回答,考虑使用数组切片。使用这些选项,您只能选择阵列中感兴趣的部分

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)

我不确定我是否完全回答了你的问题,但我希望我提供了一些思考的素材。

非常感谢你的贡献!我会充分利用它,