主题:求助:数据的叠加
wesky
[专家分:40] 发布于 2009-12-22 16:38:00
以下是从大量数据摘下的一小部分。问题是:如何设计程序找出第三列数据中具有相等的数,把所有对应的第四列数据相加?如第一二三行的第三个数均为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个回复)
沙发
shenjinggege [专家分:3260] 发布于 2009-12-22 17:39:00
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
板凳
fengzhi [专家分:90] 发布于 2009-12-23 00:18:00
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 楼
shenjinggege [专家分:3260] 发布于 2009-12-23 05:29:00
minval 是minimum value也就是最小值的缩写
maxval 是maximum value也就是最大值的缩写
ne 是not equal也就是不等于
N(i)等于0的时候就是i在第三列中不存在
比如9 这个数在第三列不存在 所以第四列
的数不会加到N(9)上 所以就不输出
反之i都是第三列上出现过的数 N(i)大于0 要输出
4 楼
fengzhi [专家分:90] 发布于 2009-12-23 23:39:00
多谢 gege!
5 楼
fengzhi [专家分:90] 发布于 2009-12-23 23:56:00
还有个疑问。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 楼
shenjinggege [专家分:3260] 发布于 2009-12-24 10:07:00
allocate(N(min:max)) 和allocate(N(max))
定义的数组下标不同
N(min:max)下标从min开始到max结束 数组长度是max-min+1
N(max)下标从1开始到max结束 数组长度是max
7 楼
fengzhi [专家分:90] 发布于 2009-12-25 00:27:00
Thank you gege!
8 楼
wesky [专家分:40] 发布于 2009-12-25 09:41:00
有个其他想法。也就是要是把第一、二列相同的数据对应的第四列加起来,如:第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 楼
wusicheng [专家分:10] 发布于 2009-12-25 10:37:00
按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 楼
gudjhi [专家分:0] 发布于 2012-11-28 14:02:00
谢谢楼主了,请继续努力
[url=http://www.sc115.com/vector]矢量素材[/url],[url=http://www.sc115.com/PPT]PPT模板[/url],[url=http://www.sc115.com]素材中国[/url]
我来回复