andy8496 发表于 2017-8-4 18:27:18

一个数组运算的问题

遇到一个数组片段的问题。

代码1:
do i=1,size(ia_index,2)
ra_val(ia_index(1,i)) = ra_val(ia_index(1,i)) + ra_add(i)
ra_val(ia_index(2,i)) = ra_val(ia_index(2,i)) + ra_add(i)
enddo

代码2:
ra_val(ia_index(1,:)) = ra_val(ia_index(1,:)) + ra_add
ra_val(ia_index(2,:)) = ra_val(ia_index(2,:)) + ra_add

我一直以为代码1和2得到的结果是一样的,今天遇到一个问题发现并不一样,代码1的结果是正确的,当ia_index(1,:)表示的某个下标索引出现1-2次的时候,两段代码结果一致,当出现3次的时候,代码1可以累加,代码2中ra_val索引指向的成员就只有最后一个值,没有累加。不知何故!

事实上,我最初使用代码2之前,由于不放心,是做过实验的:
program main
implicit none
   integer :: ia(5),ib(9)
   ia =
   ib = 0
   ib(ia) = ib(ia) +
   write(*,*) ib
   stop
end program
结果见附件图片,无误,能够叠加我才这么写的,真是郁闷了...
还请大伙指点,先谢谢了!


fcode 发表于 2017-8-5 04:48:18

It's hard to check why ? May be we need more code !

andy8496 发表于 2017-8-5 10:21:45

我编了一组数据:

program main
implicit none
real :: ra_val1(11),ra_val2(11),ra_add(9)
integer :: ia_index(2,9)

integer :: i
   
ra_add =

ia_index(:,1) = [ 1, 2]
ia_index(:,2) = [ 1, 9]
ia_index(:,3) = [ 1, 11 ]
ia_index(:,4) = [ 2, 3]
ia_index(:,5) = [ 3, 4]
ia_index(:,6) = [ 4, 8]
ia_index(:,7) = [ 4, 10 ]
ia_index(:,8) = [ 5, 6]
ia_index(:,9) = [ 6, 7]



ra_val1 = 0.
ra_val2 = 0.

! 写法1
do i=1,9
    ra_val1(ia_index(1,i)) = ra_val1(ia_index(1,i)) + ra_add(i)
    ra_val1(ia_index(2,i)) = ra_val1(ia_index(2,i)) + ra_add(i)
enddo

! 写法2
ra_val2(ia_index(1,:)) = ra_val2(ia_index(1,:)) + ra_add
ra_val2(ia_index(2,:)) = ra_val2(ia_index(2,:)) + ra_add


write(*,"(A6,2A12)") "No.","Val1","Val2"
do i=1,11
    write(*,"(I6,2F12.6)") i,ra_val1(i),ra_val2(i)
enddo

stop
end program

andy8496 发表于 2017-8-5 10:23:01

本帖最后由 andy8496 于 2017-8-5 10:27 编辑

fcode 发表于 2017-8-5 04:48
It's hard to check why ? May be we need more code !
上面的代码为什么写法1和2结果不同?:-(理解不了,我认为结果应该是一样的,都是写法1的结果。还请老大赐教!

维尼猴 发表于 2017-8-5 15:52:06

本帖最后由 维尼猴 于 2017-8-5 15:58 编辑

哇塞,竟然能这样操作,但感觉可能和缓存的处理有关系吧

我试了一下,比如加个 中间变量temp

temp = ia_index(1,:)
ra_val3(temp ) = ra_val3(temp ) + ra_add


这样处理之后是可以累加的,可能是你数组声明成2,9 的问题,内存不够连续??
来我试试9,2 的

诶………………我试了一下,失败了,把ia_index 交换了维数也没有得到对应效果

维尼猴 发表于 2017-8-5 16:00:59

我补充测试了一下,似乎下标数组不能取切片

program main
implicit none
integer :: ia(5),ib(9)
ia =
ib = 0
ib(ia) = ib(    ia(:)   ) +
write(*,*) ib
stop
end program

只是在你原来例子上给ia加了个切片操作,就不能累加了

andy8496 发表于 2017-8-5 21:29:22

唉,我都忘了我哪些地方用了这种写法,但是肯定不止目前发现的这个位置。真是郁闷了!
要是能通过什么编译选项能设置解决就好了!
谢了!

维尼猴 发表于 2017-8-6 16:07:59

andy8496 发表于 2017-8-5 21:29
唉,我都忘了我哪些地方用了这种写法,但是肯定不止目前发现的这个位置。真是郁闷了!
要是能通过什么编译 ...

我感觉这种有些“讨巧”的语法,还是少用心里更安一些呢:-P

pasuka 发表于 2017-8-6 17:22:43

ia_index的第1行数据为啥非要设置重复元素?

andy8496 发表于 2017-8-6 18:30:55

pasuka 发表于 2017-8-6 17:22
ia_index的第1行数据为啥非要设置重复元素?

这个是实际应用的需要。
页: [1] 2 3
查看完整版本: 一个数组运算的问题