我正在尝试编写Fortran 95代码来模仿我在MATLAB中所做的事情,但我正在努力访问数组索引。代码比下面显示的要复杂得多,但这是要点。我宁愿避免做循环。
e.g。 - > Matlab命令。假设a,b,c的大小相同。
indx=find(a<0); % find all negative values of "a"
b(indx)=30.; % set those same elements in different array "b" to 30.
c(indx)=b(indx)./a(indx)
etc.
etc.
如何存储和使用“a”数组中的索引并对fortran中其他数组的相同索引进行操作?
答案 0 :(得分:1)
你想要像
这样的东西$ cat pack.f90
Program pack_test
Implicit None
Real, Dimension( 1:5 ) :: a
Real, Dimension( 1: 5) :: b, c
Integer, Dimension( : ), Allocatable :: indx
Integer :: i
a = [ 1, -2, 3, -4, 5 ]
b = a
c = a
indx = Pack( [ ( i, i = Lbound( a, Dim = 1 ) , &
Ubound( a, Dim = 1 ) ) ], &
a < 0 )
b( indx ) = 30.0
c( indx ) = b( indx ) / a( indx )
Write( *, * ) c
End Program pack_test
ian-standard@barleybarber ~
$ gfortran -O -Wall -Wextra -fcheck=all -std=f2003 pack.f90
ian-standard@barleybarber ~
$ ./a.exe
1.00000000 -15.0000000 3.00000000 -7.50000000 5.00000000
答案 1 :(得分:1)
并不总是需要创建索引数组,如果它不是where
可能是正确的工具。例如,来自@ IanBush的答案的代码可以像这样修改:
Program where_test
Implicit None
Real, Dimension( 1:5 ) :: a
Real, Dimension( 1: 5) :: b, c
Integer :: i
a = [ 1, -2, 3, -4, 5 ]
b = a
c = a
WHERE(a<0) b = 30.0
WHERE(a<0) c = b/a
Write( *, * ) c
End Program where_test