首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矩阵中特定位置的计算

矩阵中特定位置的计算
EN

Stack Overflow用户
提问于 2016-01-26 05:57:18
回答 1查看 47关注 0票数 0

我已经编写了一段代码,以我需要的格式读取和打印一组流量值。

基本上,所有数据都存储在一个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,它看起来就像这样。

代码语言:javascript
复制
avgGS1 : avgJan
         avgFeb
         avgMar
          ...
         avgDec

然后我想我也可以将这个信息存储在维度等于(1x320)的线向量中。在这种情况下,我会有一个向量来存储1月份的所有平均流量值,另一个是2月份的平均流量值,还有一个是3月份的平均流量值,最后一个是12月份的流量值。

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

代码语言:javascript
复制
             GS1   GS2   GS3   GS4   G5 ... G320
Jan.1931
Feb.1931
Marc.1931
...
Jan.1932
Feb.1932
...
Dec.2015

我会像这样存储我的12个向量:

代码语言:javascript
复制
             GS1    GS2    GS3  ... GS320
avg.Jan     ( a      b      c   ...  n )
avg.Feb     ( d      e      f   .... m)
...
avg.Dec     (g       h      i  ...   o)

问题是我想不出一种自动完成的方法。我能做的最接近的代码是:

代码语言:javascript
复制
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,我总是会得到另一个一月份的流量值。

我紧随其后

代码语言:javascript
复制
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。

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

我会在这里发布我的代码,但它不是我唯一的作者,因此,我不能分享它的丰富性。

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

EN

回答 1

Stack Overflow用户

发布于 2016-01-26 10:46:22

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

要升级我对您的问题的简单回答,请考虑使用数组切片。使用这些选项,您可以只选择数组中您感兴趣的部分。

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
 count              5
 sum               15
 average            3

数组切片伪码:

代码语言:javascript
复制
array(row_start:row_end:interval, column_start:column_end:interval)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35003186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档