我有一个数组:
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
请注意与其他答案相比的订单切换。
具有merge
和sign
的元素性质,可以将标量所需值与数组和数组蒙版混合。
自然可以修改两者以将值分配给另一个变量(甚至创建一个整数(,我将显示一个替代的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