回 帖 发 新 帖 刷新版面

主题:求助:数据的叠加

以下是从大量数据摘下的一小部分。问题是:如何设计程序找出第三列数据中具有相等的数,把所有对应的第四列数据相加?如第一二三行的第三个数均为5,把对应的10.8,48.76和18相加。以此类推。谢谢。

79    1    5    10.8
45    17    5    48.76
108    14    5    18
6    24    7    76.59
162    38    10    120.37
161    24    10    43.08
184    1    10    49.83
42    20    10    42.55
42    20    6    17.44
8    138    8    99.59
14    6    8    47.82
151    17    11    69.34
44    26    11    3.39
184    1    11    47.67
44    12    11    6.1
44    12    6    21.2
44    12    4    6.94
109    4    2    16.3
109    4    4    10.7
109    4    5    6.1
76    4    1    42.28
109    4    3    4.8
109    4    2    10.1
42    37    3    23.5
42    37    2    1.9
42    37    4    2.8

回复列表 (共10个回复)

沙发

program main
Implicit None

integer,parameter :: num_of_lines=26
real :: M(4,num_of_lines)
integer :: min,max
integer :: i
real,allocatable :: N(:)

open(100,file='data.txt')
  read(100,*) M
close(100)

min=minval(M(3,:))
max=maxval(M(3,:))

allocate(N(min:max))

N=0.0d0

do i=1,num_of_lines
  N(int(M(3,i)))=N(int(M(3,i)))+M(4,i)
end do

open(100,file='results.txt')

do i=min,max
  if(N(i) .ne. 0.0d0) then
    write(100,'(I6,F10.2)') i,N(i)
  end if
end do

close(100)

deallocate(N)

end program main

很久没写了,写个练练手
用你提供的数据
输出结果如下:
     1     42.28
     2     28.30
     3     28.30
     4     20.44
     5     83.66
     6     38.64
     7     76.59
     8    147.41
    10    255.83
    11    126.50

板凳

shengjinggege请问min=minval(M(3,:))    minval是干什么用的?看说明书没有看懂
MINVAL(a[,d][,m])*    求数组a中对应掩码m为“真”元素最小值。a:A,d:I,m:L-A,结果:A,大小=维数
MAXVAL(a[,d][,m])*    求数组a中对应掩码m为“真”元素最大值。a:A,d:I,m:L-A,结果:A,大小=维数
能通俗易懂的讲下么?
还有
if(N(i) .ne. 0.0d0) then  这里的N(i) .ne. 0.0d0是什么意思?
十分感谢

3 楼

minval 是minimum value也就是最小值的缩写
maxval 是maximum value也就是最大值的缩写
ne 是not equal也就是不等于

N(i)等于0的时候就是i在第三列中不存在
比如9 这个数在第三列不存在 所以第四列
的数不会加到N(9)上 所以就不输出
反之i都是第三列上出现过的数 N(i)大于0 要输出

4 楼

多谢 gege!

5 楼

还有个疑问。allocate(N(min:max)) 和allocate(N(max)) 有什么区别?
现在的情况是min=1 max=11 ,若min=7. allocate(N(min:max)) 是只为数组中第7-11个元素分配内存空间,还是为整个数组分配空间?allocate(N(min:max))中,max是代表数组N的容量么?我在书上没有找到gege这种写法,都是类似于allocate(N(max))这样的写法。

6 楼

allocate(N(min:max)) 和allocate(N(max)) 
定义的数组下标不同
N(min:max)下标从min开始到max结束 数组长度是max-min+1
N(max)下标从1开始到max结束 数组长度是max

7 楼

Thank you gege!

8 楼

有个其他想法。也就是要是把第一、二列相同的数据对应的第四列加起来,如:第8行和第9行,头两个数都是42,20,就把相应的42.55与17.44相加。这时程序该如何改?动态数组设为二维的?谢谢。
79    1    5     10.8
45    17    5    48.76
108    14    5    18
6    24    7    76.59
162    38    10    120.37
161    24    10    43.08
184    1    10    49.83
42    20    10    42.55
42    20    6    17.44
8    138    8    99.59
14    6    8    47.82
151    17    11    69.34
44    26    11    3.39
184    1    11    47.67
44    12    11    6.1
44    12    6    21.2
44    12    4    6.94
109    4    2    16.3
109    4    4    10.7
109    4    5    6.1
76    4    1    42.28
109    4    3    4.8
109    4    2    10.1
42    37    3    23.5
42    37    2    1.9
42    37    4    2.8

9 楼

按shenjing的思路开个二维数组
real,allocatable :: N(:,:)

min_row=minval(M(1,:))
max_row=maxval(M(1,:))
min_col=minval(M(2,:))
max_col=maxval(M(2,:))

allocate(N((min_row:max_row),(min_col:max_col))

循环改成
do i=1,num_of_lines
  N(int(M(1,i),int(M(2,i))=N(int(M(1,i),int(M(2,i))+M(4,i)
end do

10 楼

谢谢楼主了,请继续努力



















[url=http://www.sc115.com/vector]矢量素材[/url],[url=http://www.sc115.com/PPT]PPT模板[/url],[url=http://www.sc115.com]素材中国[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册