Matrix 矩阵中具有特定位置的计算
我已经编写了一段代码,可以按照我需要的格式读取和打印一组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就是这样Matrix 矩阵中具有特定位置的计算,matrix,vector,fortran,fortran77,Matrix,Vector,Fortran,Fortran77,我已经编写了一段代码,可以按照我需要的格式读取和打印一组streamflow值 基本上,所有数据都存储在一个矩阵中,该矩阵包含1020行和320列。它可以是一个更小的矩阵,也就是说,如果我没有这么多的流量值,但它永远不会比这个大 每一行都是特定年份中的特定月份。1号线为1931年1月,1020号线为2015年12月,从第1列到第320列的每一列代表一个计量站(GS) 我现在需要计算每个GS在整个时间序列中同一个月的平均值。为了澄清对前面这句话的任何疑问,我将给你举个例子 我需要在我的整个时间线内
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)
我不确定我是否完全回答了你的问题,但我希望我提供了一些思考的素材。非常感谢你的贡献!我会充分利用它,