来自Matlab的Fortran逻辑索引

时间:2017-09-29 20:52:55

标签: matlab fortran

我正在尝试编写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中其他数组的相同索引进行操作?

2 个答案:

答案 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