真实的二进制阵列(0/1)



我有一个数组:

 0.3  0.4  0.65  1.45
-1.2  6.0 -3.49  3.9

,如果值为负数,则我想拥有0,如果为正值:

1  1  1  1
0  1  0  1

是否可以在没有循环的情况下进行此操作:

DO X=1,Xmax
 Do Y=1,Ymax
  IF(Array(X,Y)>0)THEN
     Array(X,Y)=1
  END IF
 END DO
END DO

我是vladimir f给出的where方法的粉丝,但我也可以建议一个相关的方法。

merge是一个固有的元素函数,占用两个来源和一个掩码:

array = MERGE(0., 1., array.lt.0.)

作为对Vladimir F的sign的轻微校正:

array = SIGN(0.5, array) + 0.5

请注意与其他答案相比的订单切换。

具有mergesign的元素性质,可以将标量所需值与数组和数组蒙版混合。

自然可以修改两者以将值分配给另一个变量(甚至创建一个整数(,我将显示一个替代的where以显示完整性:

where (array.lt.0.)
  another_array=0
elsewhere
  another_array=1
end where

another_array适当形状。

我对此有太多乐趣。这不需要数字适合整数:

ARRAY = 0.5 * ARRAY / ABS(ARRAY) + 0.5

最直接的

where (array>=0)
  array = 1
else where
  array = 0
end where

符号函数需要另一个数组来使幅度

,因为

array = sign(array, halfs) + 0.5

需要一个与array相同形状的阵列。

实际上应该是Francescalus所示的array = sign(0.5, array) + 0.5。我什至查看了手册,然后还是切换了参数...

这很丑陋,但是如果您想要一个单线:

ARRAY = CEILING( ARRAY / CEILING(ABS(ARRAY)) )

vladimir想要快速!

  REAL(KIND=8) :: ARRAY(4,2) = RESHAPE ( &
       (/ 0.3, 0.4, 0.65, 1.45, -1.2, 6.0, -3.49, 3.9 /), (/4,2/) )
  INTEGER(KIND=8) :: IARRAY(4,2)
  EQUIVALENCE (ARRAY, IARRAY)
  ARRAY = 1 - IBITS( IARRAY,63,1 )

:D

最新更新